De quoi ai-je besoin pour append une carte IPsec virtuelle?

J'essaye de mettre en place une connection IPsec manuellement depuis la console avec iproute2. Ce dont j'ai besoin est une interface virtuelle (au mieux, une adresse IP virtuelle pourrait suffire) qu'IPsec transforme tout en entrant (ESP / TUNNEL MODE) et la transmet à eth0 (sur mon système appelé em1). D'un autre côté, un pair prend le package de son propre eth le déchiffre et le transmet à une interface virtuelle de l'autre côté. Donc, je veux établir un tunnel IPsec "normal".

Je n'ai aucun problème avec la politique et SA, et la configuration était facile en utilisant les adresses Ethernet normales des systèmes en mode de transport, à savoir

ip xfrm policy add src 198.51.100.1 dst 198.51.100.2 dir out tmpl proto esp ip xfrm state add src 198.51.100.1 dst 198.51.100.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011 ip xfrm state add src 198.51.100.2 dst 198.51.100.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022 

et une configuration d'adversaire sur le pair fonctionne assez bien.

Maintenant, j'ai essayé de mettre en place une adresse IP virtuelle et une route vers l'autre système avec

 ip address add 10.0.0.0 dev em1 ip route add to 10.0.0.2 via 10.0.0.1 

et encore vice versa de l'autre côté. Cela fonctionne à nouveau bien. Ensuite, j'ai modifié la politique IPsec et SA à

 ip xfrm policy add src 10.0.0.1 dst 10.0.0.2 dir out tmpl src 198.51.100.1 dst 198.51.100.2 proto esp mode tunnel ip xfrm state add src 10.0.0.1 dst 10.0.0.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011 ip xfrm state add src 10.0.0.2 dst 10.0.0.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022 

Quand j'essaie maintenant de tcping le pair, je n'ai pas de réponse et setkey -PD me dit que la politique de security n'a jamais été déclenchée. Maintenant, j'essaie de fabriquer une interface virtuelle pour gérer le tunnel IPsec, mais je ne sais pas comment le lier à l'interface physique et comment le kernel peut appliquer la politique de security.

Il est essentiel pour moi que je puisse résoudre cela avec iproute2, car je veux finalement faire cela à partir d'un programme C ++ et j'ai déjà les classs appropriées qui lâchent les commands Netlink le même style que la command ip fait (ce que je peux faire avec ip , Je peux aussi faire dans mon code). En fait, la première partie fonctionne déjà sur mon programme et je veux utiliser les mêmes fonctions API Netlink pour le rest.

Mise à jour J'ai compris que l'état devait être configuré avec les adresses des tunnels afin que les SA fonctionnant soient

 ip xfrm state add src 10.0.0.1 dst 10.0.0.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011 ip xfrm state add src 10.0.0.2 dst 10.0.0.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022 

tandis que la politique rest la même. Maintenant, la politique est déclenchée et je vois un package transformé sur un port renifleur. Aussi iptables sur l'autre machine bloqué le package et je l'ai désactivé pour le test.

Donc, la direction un semble fonctionner maintenant, mais je n'obtiens toujours pas de réponse. Je ne sais pas non plus si le problème est encore en quelque sorte la transformation, le routing ou la partie interface. Ma solution préférée serait encore une interface incluant une interface virtuelle, mais je n'ai aucune idée de comment lier à un physique, et encore less si la transformation fonctionnerait de cette façon.

Normalement, ce que vous utilisez est un tunnel, créé en utilisant ip tunnel add . Le périphérique tunnel vous donne un périphérique virtuel qui encapsule les packages IP à l'intérieur d'autres packages IP. Ensuite, le package encapsulé peut être crypté en utilisant IPsec.

Par exemple, vous pouvez créer un tunnel GRE en utilisant:

 ip tunnel add mytunnel mode gre remote 198.51.100.2 ip addr add 10.0.0.1 peer 10.0.0.2/31 dev mytunnel 

Ensuite, vous pouvez configurer IPSec pour crypter les packages GRE (soit en général, soit simplement à destination).