La Fibre

Télécom => Réseau => reseau VPN => Discussion démarrée par: renaud07 le 04 mars 2019 à 15:55:26

Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 04 mars 2019 à 15:55:26
Bonjour,

Après mes déboires avec wireguard (https://lafibre.info/vpn/vpn-wireguard-entre-2-openwrt/), j'ai décidé de passer sur IPsec on ne peut plus stable.

Voici une config que je pense correcte :

Routeur A
config 'ipsec'
list listen ''
option 'debug' '2'

config 'remote' 'other'
option 'enabled' '1'
option 'gateway' 'domaine.routeur.B'
option 'authentication_method' 'psk'
option 'pre_shared_key' 'xxxxxx'
option 'exchange_mode' 'aggressive'
option 'local_identifier' 'tunnelid'
list 'crypto_proposal' 'pre_g14_aes_sha1'
list 'tunnel' 'other_lan'

config 'crypto_proposal' 'pre_g14_aes_sha1'
option 'encryption_algorithm' 'aes128'
option 'hash_algorithm' 'sha1'
option 'dh_group' 'modp2048'

config 'tunnel' 'other_lan'
option 'local_subnet' '192.168.1.0/24'
option 'remote_subnet' '192.168.2.0/24'
option 'crypto_proposal' 'g14_aes_sha1'

config 'crypto_proposal' 'g14_aes_sha1'
option 'dh_group' 'modp2048'
option 'encryption_algorithm' 'aes128'
option 'hash_algorithm' 'sha1'

Routeur B
config 'ipsec'
list listen ''
option 'debug' '2'

config 'remote' 'other'
option 'enabled' '1'
option 'gateway' 'domaine.routeur.A'
option 'authentication_method' 'psk'
option 'pre_shared_key' 'xxxxxx'
option 'exchange_mode' 'aggressive'
option 'local_identifier' 'tunnelid'
list 'crypto_proposal' 'pre_g14_aes_sha1'
list 'tunnel' 'other_lan'

config 'crypto_proposal' 'pre_g14_aes_sha1'
option 'encryption_algorithm' 'aes128'
option 'hash_algorithm' 'sha1'
option 'dh_group' 'modp2048'

config 'tunnel' 'other_lan'
option 'local_subnet' '192.168.2.0/24'
option 'remote_subnet' '192.168.1.0/24'
option 'crypto_proposal' 'g14_aes_sha1'

config 'crypto_proposal' 'g14_aes_sha1'
option 'dh_group' 'modp2048'
option 'encryption_algorithm' 'aes128'
option 'hash_algorithm' 'sha1'

Comme dit précédemment (https://lafibre.info/vpn/vpn-wireguard-entre-2-openwrt/msg629759/#msg629759), sur le routeur resté en 17.01, j'ai une erreur de script, faut-il remettre à zéro ou un upgrade en 18.06 devrait résoudre le problème ? :
root@LEDE:~# opkg install strongswan
Installing strongswan (5.5.3-1) to root...
Downloading http://downloads.lede-project.org/releases/17.01.4/packages/mips_24kc/packages/strongswan_5.5.3-1_mips_24kc.ipk
Configuring strongswan.
/etc/rc.common: line 145: ipsec: not found

Merci d'avance
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 04 mars 2019 à 19:11:57
Visiblement j'ai raté un truc... lorsque je démarre ipsec, la config est bien générée, par contre aucun log... Du coup je ne sais pas si ça essaie de se connecter.

Faut rajouter une ligne pour lui dire d'écrire dans les log ?

De même je pense que la config n'est pas bonne, il faut mettre 2 ID différents en spécifiant l'option 'remote_identifier' ?

Voici les 2 config générées, est-ce ok ? :

Routeur A
conn routeurB-routeurB_lan
  left=%any
  right=domaine.routeurB
  leftsubnet=192.168.1.0/24
  ikelifetime=3h
  lifetime=1h
  margintime=9m
  keyingtries=3
  dpdaction=none
  dpddelay=30s
  leftauth=psk
  rightauth=psk
  rightsubnet=192.168.2.0/24
  auto=route
  leftid=routeurA
  rightid=routeurB
  keyexchange=ikev2
  esp=aes128-sha1-modp2048
  ike=aes128-sha1-modp2048
  type=tunnel


Routeur B
conn routeurA-routeurA_lan
  left=%any
  right=domaine.routeurA
  leftsubnet=192.168.2.0/24
  ikelifetime=3h
  lifetime=1h
  margintime=9m
  keyingtries=3
  dpdaction=none
  dpddelay=30s
  leftauth=psk
  rightauth=psk
  rightsubnet=192.168.1.0/24
  auto=route
  leftid=routeurB
  rightid=routeurA
  keyexchange=ikev2
  esp=aes128-sha1-modp2048
  ike=aes128-sha1-modp2048
  type=tunnel
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 05 mars 2019 à 15:55:07
J'ai ajouté les règles de firewall, comme indiqué sur le topic que j'avais trouvé (https://forum.openwrt.org/t/ipsec-site-to-site-tunnel/17920/8) mais toujours aucune trace d'ipsec dans les logs. Pourant, strongswan.conf contient :
root@LEDE:~# cat /var/ipsec/strongswan.conf
# generated by /etc/init.d/ipsec
charon {
  load_modular = yes
  install_routes = yes
    plugins {
      include /etc/strongswan.d/charon/*.conf
    }
  syslog {
    identifier = ipsec
    daemon {
      default = 2
    }
    auth {
      default = 2
    }
  }
}

Donc en théorie ça devrait m'afficher quelque chose, non ? En tout cas toujours pas de tunnel établi.

Je sèche un peu là... On dirait que le script se contente de générer la config sans démarrer le service.
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 07 mars 2019 à 18:00:18
J'ai enfin quelque chose ! Il fallait en fait bien que j'installe le paquet strongswan-full.

Désormais une connexion semble se faire puisque j'ai vu passer dans les log  :
Thu Mar  7 16:44:25 2019 authpriv.info ipsec: 14[IKE] IKE_SA routeurB-routeurB_lan[1] established between 90.14.131.xx[routeurA]...90.14.5.xx[lrouteurB]
Thu Mar  7 16:44:25 2019 daemon.info ipsec: 14[IKE] IKE_SA routeurB-routeurB_lan[1] established between 90.14.131.xx[routeurA]...90.14.5.xx[routeurB]
Thu Mar  7 16:44:25 2019 authpriv.info ipsec: 14[IKE] IKE_SA routeurB-routeurB_lan[1] state change: CONNECTING => ESTABLISHED
Thu Mar  7 16:44:25 2019 daemon.info ipsec: 14[IKE] IKE_SA routeurB-routeurB_lan[1] state change: CONNECTING => ESTABLISHED

Ainsi que :
Thu Mar  7 16:44:26 2019 authpriv.info ipsec: 14[KNL] using 193.253.160.3 as nexthop and pppoe-wan as dev to reach 90.14.5.x/32
Thu Mar  7 16:44:26 2019 daemon.info ipsec: 14[KNL] using 193.253.160.3 as nexthop and pppoe-wan as dev to reach 90.14.5.x/32
Thu Mar  7 16:44:26 2019 authpriv.info ipsec: 14[IKE] CHILD_SA routeurB-routeurB_lan{2} established with SPIs cfba3032_i c7fb0926_o and TS 192.168.1.0/24 === 192.168.2.0/24
Thu Mar  7 16:44:26 2019 daemon.info ipsec: 14[IKE] CHILD_SA routeurB-routeurB_lan{2} established with SPIs cfba3032_i c7fb0926_o and TS 192.168.1.0/24 === 192.168.2.0/24
Thu Mar  7 16:44:26 2019 authpriv.info ipsec: 14[CHD] CHILD_SA routeurB-routeurB_lan{2} state change: INSTALLING => INSTALLED
Thu Mar  7 16:44:26 2019 daemon.info ipsec: 14[CHD] CHILD_SA routeurB-routeurB_lan{2} state change: INSTALLING => INSTALLED


Problème quand je veux faire un ping j'ai toujours packet filtered du côté routeur A et ça n'a pas l'air de fonctionner côté routeur B (aucun retour).

Les règles de firewall ajoutées sur routeurA censés autoriser le trafic (bien sûr sur routeurB c'est subnet 192.168.2.0/24) :
config rule
  option name       Allow-IKE-input
  option src        wan
  option proto      udp
  option dest_port  '500 4500'
  option target     ACCEPT

config rule
  option name       Allow-ESP-input
  option src        wan
  option proto      esp
  option target     ACCEPT

option extra_src   '-m policy --dir in --pol none'
option extra_dest  '-m policy --dir out --pol none'

config zone
  option name        vpn
  option input       ACCEPT
  option output      ACCEPT
  option forward     ACCEPT
  option subnet      192.168.1.0/24
  option extra_src   '-m policy --dir in --pol ipsec --proto esp'
  option extra_dest  '-m policy --dir out --pol ipsec --proto esp'
  option mtu_fix     1
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 07 mars 2019 à 18:47:16
J'avais placé
option extra_src   '-m policy --dir in --pol none'
option extra_dest  '-m policy --dir out --pol none'

au mauvais endroit, il fallait en fait les mettre à chaque fois dans lan et wan et désormais je peux pinger les routeurs réciproquement, on avance  :D

Maintenant il reste a résoudre le problème de l'accès à partir du lan puisque un ping à partir de mon PC me revoie un destination unreachebable.
Titre: VPN IPsec entre 2 openWRT
Posté par: FloBaoti le 07 mars 2019 à 18:56:58
Il faut ajouter une route statique sur les 2 routeurs vers le réseau LAN d'en face.
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 07 mars 2019 à 19:50:15
C'est bien ce qu'il me semblait. Je test ça en rentrant  :)
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 07 mars 2019 à 20:34:27
Soit je ne sais plus faire une table de routage, soit il y a un bug...

-routeur A 192.168.1.1/24
-Table : 192.168.2.0/24 gateway 192.168.2.1 sur l'interface lan

-routeur B 192.168.2.1/24
-Table : 192.168.1.0/24 gateway 192.168.1.1 sur l'interface lan

Si c'est bien ça je ne comprends pas pourquoi une fois appliqué ça n’apparaît pas quand je fais un route -n.
 
Titre: VPN IPsec entre 2 openWRT
Posté par: FloBaoti le 07 mars 2019 à 21:50:57
Montre ta table de routage.
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 07 mars 2019 à 21:52:42
Routeur A
root@LEDE:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         193.253.160.3   0.0.0.0         UG    0      0        0 pppoe-wan
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br-lan
193.253.160.3   0.0.0.0         255.255.255.255 UH    0      0        0 pppoe-wan

Routeur B
root@LEDE:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         193.253.160.3   0.0.0.0         UG    0      0        0 pppoe-wan
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 br-lan
193.253.160.3   0.0.0.0         255.255.255.255 UH    0      0        0 pppoe-wan
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 08 mars 2019 à 02:52:54
En regardant la liste des routes actives, je vois que le subnet d'en face a déjà une gateway prédéfinie sur l'ip du BAS, c'est pas pour ça que ça coince ? Vu que les 2 ont le même métrique...
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 08 mars 2019 à 15:44:39
Plus je regarde d'exemples de doc, plus je me mélange les pinceaux... certains font du NAT, d'autres un simple routage...

D'autres encore ont une interface et un subnet pour le tunnel, hors dans mon cas il n'y en a pas. Dans le doute voici l'état du tunnel, peut-être qu'un truc m'échappe.

root@LEDE:~# ipsec status
Routed Connections:
routeurB-routeurB_lan{1}:  ROUTED, TUNNEL, reqid 1
routeurB-routeurB_lan{1}:   192.168.1.0/24 === 192.168.2.0/24
Security Associations (1 up, 0 connecting):
routeurB-routeurB_lan[9]: ESTABLISHED 2 hours ago, 90.14.131.x[routeurA]...90.14.5.x[routeurB]
routeurB-routeurB_lan{116}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: cbe3683e_i c0d7716b_o
routeurB-routeurB_lan{116}:   192.168.1.0/24 === 192.168.2.0/24
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 08 mars 2019 à 16:14:02
Je me suis gouré dans mes routes d'hier puisque qu'il faut obligatoirement que la passerelle soit sur le même sous-réseau (comme ai-je pû oublier cette règle élèmentaire  ::)), donc en théorie :

192.168.1.0/24 gateway 192.168.2.1
192.168.2.0/24 gateway 192.168.1.1

Mais toujours rien.
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 14 avril 2019 à 18:13:10
Me revoilà après avoir mis de côté ce projet, avec du nouveau :

Après de plus amples recherches, je viens enfin de comprendre pourquoi ajouter des routes ne fonctionne pas : strongswan construit par défaut un policy-based tunnel et non un route-based.

Et je viens de voir qu'il existe un moyen de créer un tunnel route based en se servant des VTI Devices. Cependant j'ai pas bien compris ce qu'il faut renseigner dans la commande : ip tunnel add <name> local <local IP> remote <remote IP> mode vti key <number equaling the mark>
En particulier, dans local et remote. Ça correspond  a un subnet quelconque pour le tunnel ? Ou c'est les ip publiques de chaque routeur ? Si c'est les ip publiques, ça se passe comment vu que je suis en ip dynamique ? J'imagine qu'on ne peut pas rentrer des FQDN, si ?

Après je peux toujours essayer de le configurer via les policy, mais j'avoue que c'est assez indigeste, j'ai pas compris grand chose  :-\
Titre: VPN IPsec entre 2 openWRT
Posté par: ubune le 16 avril 2019 à 17:00:46
Me revoilà après avoir mis de côté ce projet, avec du nouveau :

Après de plus amples recherches, je viens enfin de comprendre pourquoi ajouter des routes ne fonctionne pas : strongswan construit par défaut un policy-based tunnel et non un route-based.

Et je viens de voir qu'il existe un moyen de créer un tunnel route based en se servant des VTI Devices. Cependant j'ai pas bien compris ce qu'il faut renseigner dans la commande : ip tunnel add <name> local <local IP> remote <remote IP> mode vti key <number equaling the mark>
En particulier, dans local et remote. Ça correspond  a un subnet quelconque pour le tunnel ? Ou c'est les ip publiques de chaque routeur ? Si c'est les ip publiques, ça se passe comment vu que je suis en ip dynamique ? J'imagine qu'on ne peut pas rentrer des FQDN, si ?

Après je peux toujours essayer de le configurer via les policy, mais j'avoue que c'est assez indigeste, j'ai pas compris grand chose  :-\

Attention je me trompe p-e, jamais fait d'ipsec sur openwrt.


J'utilise les vti sur nos UTM pour le taff, et le vti n’empêche pas d'utiliser la policy route, en faite c'est juste que la policy route permet d'atteindre l'interface VTI du routeur distant (une interface crée uniquement pour ça).

Exemple :

Routeur A Interface VTI 192.168.254.249/30
Routeur B Interface VTI 192.168.254.250/30

Et donc ton tunnel ipsec te permet juste le dialogue entre les VTI.

Mais du coup, grace à ça tu peux faire des routes statique pour atteindre un lan derrière :

Sur le routeur A :
Net : 192.168.2.0/24 GW 192.168.254.250

Sur le routeur B :
Net : 192.168.1.0/24 GW 192.168.254.249

Pourquoi c'est beaucoup plus puissant de faire ça plutot qu'envoyer les routes des lan directement dans la policy ipsec ?
 - Tout simplement car du coup, tu peux creer autant d'interface VTI que de lien WAN sur ton routeur, tu montes autant de tunnel ipsec vti vers vti que tu as de WAN, et donc tu peux avoir des routes statiques avec des metriques différentes pour atteindre les lan, afin d'avoir de la redondance sur ton vpn ipsec si le lien wan principal tombe par exemple :).

En espérant que ce soit pareil sur openwrt, et que ça t'aide à la compréhension.
A+
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 16 avril 2019 à 18:13:20
Merci pour ta réponse. J'ai pu créer le VTI d'un côté  :) Donc en fait c'est bien pour créer un subnet pour le tunnel. Je ne sais pas pourquoi sur la doc que j'ai lue, ils disaient de renseigner les ip publiques...

Maintenant il faut que j'aille débugger le routeur d'en face, à force de triturer, je me suis encore bloqué l'accès ::) Pour être exact c'est  le serveur qui me permet de monter le tunnel SSH que j'ai planté en voulant activer l'ipv6... il n'a pas apprécié le networking restart...
Titre: VPN IPsec entre 2 openWRT
Posté par: zoc le 16 avril 2019 à 19:45:59
Je ne sais pas pourquoi sur la doc que j'ai lue, ils disaient de renseigner les ip publiques...
Parce que c’est le cas...

D’ailleurs ça rend vti pratiquement inutilisable avec des IP dynamiques (sauf à faire un script exécuté par cron régulièrement pour reconfigurer le tunnel à chaque changement d’IP d’un des 2 bouts...).

Sinon, il semblerait que libreswan (que je n’ai pas testé en pratique) soit un peu plus souple dans sa gestion des interfaces vti et soit capable de les reconfigurer tout seul. A voir...

Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 16 avril 2019 à 20:13:32
Donc en définitive, qui a raison ? Les deux sont possible ?

Si avec l'exemple d'ubune je fois bien comment ça fonctionne, avec les ip publiques j'ai un peu de mal.
Titre: VPN IPsec entre 2 openWRT
Posté par: ubune le 17 avril 2019 à 17:09:38
Donc en définitive, qui a raison ? Les deux sont possible ?

Si avec l'exemple d'ubune je fois bien comment ça fonctionne, avec les ip publiques j'ai un peu de mal.

J'ai pas bien compris la remarque, mais oui il faut toujours utiliser les ip publiques pour monter le tunnel (faut bien un dialogue IP_PubA vers IP_PubB..).
Et les VTI pourront dialoguer entre elles grace aux policy routes.

Quand j'aurai un peu de temps j'essaierai aussi, et je ferai un retour
A+
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 17 avril 2019 à 22:57:06
De ce que j'ai compris les VTI servent d'interface pour le routage à l’intérieur du tunnel donc il faut bien des ip privées. Donc mettre les ip WAN à la place je trouve ça bizarre.

Après pour monter le tunnel en lui même oui il faut les ip publiques (normal).
Titre: VPN IPsec entre 2 openWRT
Posté par: zoc le 18 avril 2019 à 06:03:59
Non, les IP local et remote servent à indiquer au noyau quelle security policy rechercher quand un paquet entre sur l’interface. Rien à voir avec le routage. Si ton interface VTI est aussi utilisée pour faire du routage, alors il faut en plus lui affecter une adresse IP (ip addr add).

La documentation de strongswan concernant les route based policy est assez explicite sur ce point. D’ailleurs quand le cas des VPN road warrior il est possible de mettre 0.0.0.0/0 pour le remote, car les clients ont généralement une IP dynamique. L’inconvénient étant alors que cette interface va prendre tout le traffic IPSec entrant quelque soit la source, et qu’il est donc impossible d’utiliser une VTI supplèmentaire.
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 18 avril 2019 à 15:32:46
D'accord...  je suis totalement à côté de la plaque. Faut que je relise à tête reposée. A force de passer mes soirées à essayer de faire fonctionner le bouzin, j'ai vraiment du mal à intégrer les choses  :P
Titre: VPN IPsec entre 2 openWRT
Posté par: renaud07 le 19 avril 2019 à 03:32:35
Je me goure encore peut-être : est-ce que le mode passthrough serait la solution pour que les LAN soient joignables de chaque côté sans config supplèmentaire ?

J'ai testé ce qui était dans la doc à savoir  :
conn passthrough-2
    # makes sure those conns are excluded from every conn selection
    left=127.0.0.1
    # Those are just example values. Replace them with the apropriate ones!
    leftsubnet=192.168.0.0/16
    rightsubnet=10.0.0.0/8
    # those two lines are critical.
    type=passthrough
    auto=route

Problème, le fait de mettre auto=route de chaque côté, le tunnel ne monte jamais. Aucun ne prend l'initiative d'initier la connexion (ils s'arrêtent au chargement de la configuration). Par contre dès que je mets add et start là ça marche mais du coup le passthrough ne fonctionne plus.

Ce qui est étrange c'est que ça fonctionnait parfaitement lorsque la config était sur les routeurs directement avec par contre type=tunnel (cette config là ne fonctionne pas non plus sur les VM... c'est la première que j'ai testée).

Un problème de version ? Sur OWRT c'est la 5.6.3, sur debian stretch 5.5.1.