Auteur Sujet: Tunnel GRE sur wireguard  (Lu 3499 fois)

0 Membres et 1 Invité sur ce sujet

Fuli10

  • Abonné Free fibre
  • *
  • Messages: 1 006
  • Conflans Sainte Honorine (78)
Tunnel GRE sur wireguard
« le: 26 septembre 2019 à 10:53:12 »
Bonjour à tous,
J'ai un petit problème afin de relier 2 LAN de 2 sites distants afin de n'en faire qu'un seul avec le même domaine broadcast/multicast (et en finir avec les igmpproxy et autres tralala).
A la base j'ai ça:

                          +--------------+                                   +--------------+
                          |     OWRT0    |                                   |     OWRT1    |
LAN0 192.168.0.0/24 ------+  LAN  | WAN  +- 78.x--------  NET -------- 82.x -+  WAN  | LAN  +---------- 192.168.1.0/24 LAN1
                          |  VPN wg0     |                                   | VPN wg0      |
                          |  10.0.0.1    |                                   | 10.0.0.2     |
                          +--------------+                                   +--------------+

2 routeurs openWRT, chacun avec une IP LAN différente. Un tunnel wireguard reliant les 2 LAN. Cette configuration fonctionne, toute machine de LAN0 communique avec LAN1 et inversement (à l'exception des routeurs mais c'est une histoire d'IP source).

Ce que j'aimerai c'est ça:

                          +--------------+                                   +--------------+
                          |     OWRT0    |                                   |     OWRT1    |
LAN0 192.168.0.0/23 ------+  LAN  | WAN  +- 78.x--------  NET -------- 82.x -+  WAN  | LAN  +---------- 192.168.1.0/23 LAN1
                          |  VPN wg0     |                                   | VPN wg0      |
                          |  10.0.0.1    |                                   | 10.0.0.2     |
                          +--------------+                                   +--------------+

Un seul LAN avec le même domaine broadcast/multicast. Mais chaque partie gardant son routeur avec sa propre IP et son serveur DHCP (avec une attribution de préférence dans un /24 différent).
Pour des raisons de possible utilisation d'ERL, le tunnel L2 utilisé entre les 2 LAN passe par GRETAP.
J'utilise la configuration suivante:
OWRT0: IP LAN = 192.168.0.1/23 DHCP start = 10 (attribue par défaut une IP en 192.168.0.X/23)
OWRT1: IP LAN = 192.168.1.1/23 DHCP start = 265 (attribue par défaut une IP en 192.168.1.X/23)
J'augmente la MTU du tunnel wireguard à 1580, et tant pis (pour le moment) si ça fragmente.
Pour la configuration du GRE:
# Create d'un gretap passant par le tunnel wg
ip link add gretap1 type gretap local 10.0.0.1 remote 10.0.0.2 dev WG0 nopmtudisc
ip link set gretap1 up
# possible car le tunnel wg a une MTU de 1580
ip link set gretap1 mtu 1500
# Ajout du GRETAP sur le bridge LAN
brctl addif br-lan gretap1
Idem sur OWRT1 en changeant juste les IP sources et destination du tunnel.

A la fin, j'ai bien relié au niveau L2 les 2 LAN pour n'en avoir qu'un. Par contre je tombe sur un problème attendue: je me retrouve avec 2 serveurs DHCP sur le même LAN. Et un problème surprise: en IPv6 je me retrouve avec 2 RA attribuant chacun des IPv6 complètement différentes (et forcement incompatibles entre elles).

Du coup, je suis à la recherche de règles iptables (ou ebtables) permettant de bloquer les DHCP/RA.
Problèmes:
- je préfère garder 2 routeurs, pour supporter le cas ou l'un des 2 sites perd le net.
- j'aimerai si possible ne pas interdire complètement le routeur d'envoyer des paquets à l'autre site (autres que DHCP/RA).
- j'aimerai bloquer si possible dès la source les paquets DHCP/RA pour pas qu'ils passent à travers le tunnel wireguard.
- le tunnel WG0 ne fait passer que des paquets de protocole "gre", du coup iptables ne permet pas de filtrer ce qui est encapsulé dedans (enfin je crois).
- iptables refuse les -i gretap1, -o gretap1 car gretap1 faisant parti d'un bridge il ne considère comme device que br-lan. Et si je bloque DHCP/RA sur tout br-lan en OUTPUT, et bien les routeurs OWRTx ne feront plus DHCP.

Actuellement, j'ai enlevé gretap1 du bridge br-lan sur le site 0. Cela revient à "débrancher le câble" reliant les 2 sites. A gros coup de tcpdump je peux quand même voir ce qui est envoyé depuis le site 1 via tcpdump -i gretap1. Je peux donc tester facilement toute solution.

Bref, si quelqu'un sait comment résoudre ce problème ça m'intéresse.

Catalyst

  • Abonné FAI autre
  • *
  • Messages: 191
Tunnel GRE sur wireguard
« Réponse #1 le: 26 septembre 2019 à 11:27:15 »
Citer
le tunnel WG0 ne fait passer que des paquets de protocole "gre", du coup iptables ne permet pas de filtrer ce qui est encapsulé dedans (enfin je crois).
C'est récursif, par exemple pour un un paquet venant d'un LAN vers l'autre :

le paquet wg passera en INPUT du routeur du LAN cible,
le paquet GRE encaspsulé dedans passera lui aussi en INPUT,
le paquet TCP (ou autre) encapsulé dedans venant d'un LAN vers l'autre passera en FORWARD.

A tester pour voir ce qui se passe exactement, on doit voir passer le paquet 3 fois.

Fuli10

  • Abonné Free fibre
  • *
  • Messages: 1 006
  • Conflans Sainte Honorine (78)
Tunnel GRE sur wireguard
« Réponse #2 le: 26 septembre 2019 à 11:55:16 »
Ça ne fonctionne pas.
En réception le paquet encapsulé passe dans WG0. Donc dans INPUT on ne peut filtrer que -p gre du coup pas de -p udp --dport 67.
GRETAP reçoit le gre puis le décapsule et l'envoi directement dans le device gretap1 qui est bridgé. Du coup c'est trop tard.
il n'y a pas de forward.

Catalyst

  • Abonné FAI autre
  • *
  • Messages: 191
Tunnel GRE sur wireguard
« Réponse #3 le: 26 septembre 2019 à 14:45:13 »
Ça ne fonctionne pas.
En réception le paquet encapsulé passe dans WG0. Donc dans INPUT on ne peut filtrer que -p gre du coup pas de -p udp --dport 67.
GRETAP reçoit le gre puis le décapsule et l'envoi directement dans le device gretap1 qui est bridgé. Du coup c'est trop tard.
il n'y a pas de forward.
Au temps pour moi, je n'avais pas vu la spécificité de GRETAP.

Fuli10

  • Abonné Free fibre
  • *
  • Messages: 1 006
  • Conflans Sainte Honorine (78)
Tunnel GRE sur wireguard
« Réponse #4 le: 09 octobre 2019 à 09:50:15 »
Bonjour,
Bon, j'ai utilisé la solution bourrine pour que ça marchotte juste ce qu'il faut chez moi #chezmoiçamarche.
sur OWRT1  /etc/config/network

# Important la route sinon elle se met sur WAN. Inverser les IP sur OWRT0
config route                                           
        option interface 'WG0'                         
        option target '10.0.0.1'                     
        option gateway '10.0.0.2'                   

config interface 'lan'                                 
        option type 'bridge'                           
        option proto 'static'                         
        option ipaddr '192.168.1.1'  # sur OWRT1, 192.168.0.1 sur OWRT0             
        option metric '0'               
        option netmask '255.255.254.0'   
        option ifname 'eth1.1 gre4t-grt1'

config interface 'wan'                                 
        option ifname 'eth0.2'                         
        option proto 'static'                         
        option gateway 'GW_WAN'
        list ipaddr 'IP_WAN'
        option dns 'DNS_WAN'
        option metric '0'

config interface 'WG0'                                         
        option proto 'wireguard'                               
        option force_link '1'                                   
        option private_key '******'
        option listen_port 'xxx'                     
        option mtu '1580'   # <- force wireguard a gérer la fragmentation (n'est pas géré par le GRE)                                             
        list addresses '10.0.0.2/24' # 10.0.0.1/24 sur OWRT0

config wireguard_WG0                                                     
        option public_key '****'
        option endpoint_port 'xxx'
        option persistent_keepalive '25'                                 
        list allowed_ips '192.168.0.0/23'                               
        list allowed_ips '10.0.0.0/24'                                 
        option endpoint_host 'IP_INTERNET_OWRT0'

config interface 'grt1'                                                 
        option proto 'gretap'                                           
        option ipaddr '10.0.0.2'                                       
        option peeraddr '10.0.0.1'                                     
        option force_link '1'                                           
        option mtu '1500'                   

A ajouter dans /etc/config/firewall
config zone                                     
        option forward 'DROP'                   
        option name 'vpn'                       
        option output 'ACCEPT'                 
        option input 'ACCEPT'               
        option network 'WG0'                 

# Par défaut n'accepte que UDP & TCP. Ajoute le support d'any protocol pour le GRE
config rule                                     
        option enabled '1'                     
        option target 'ACCEPT'                 
        option proto 'all'                   
        option name 'Allow GRE'                 
        option family 'ipv4'                   
        option src 'vpn'

Et enfin j'ai donc limiter comme un gros porc via ebtables le multicast IPv6 et le broadcast IPv4 (pas le multicast que je souhaitais garder).
Du coup dans /etc/firewall.user j'ai ajouté:
# ebtable interdisant au bridge le RA/DHCP
# vide la table
ebtables -F OUTPUT
# Enleve les RA IPv6 envoyé en multicast @ 33:33::/16
ebtables -A OUTPUT -o gre4t-grt1 -d 33:33:00:00:00:00/ff:ff:00:00:00:00 -p IPv6 -j DROP
# Supprime le broadcast IPv4 (plus de requete DHCP)
ebtables -A OUTPUT -o gre4t-grt1 -d FF:FF:FF:FF:FF:FF -p IPv4 -j DROP

C'est cracra, mais au final ça marche pas trop mal. Je peux enfin faire du streaming steam entre 2 réseaux sans passer par les serveurs intermédiaires à perpette ou du DLNA/SMB.