Ich versuche, eine IPsec-Verbindung manuell über die Konsole mit iproute2 einzurichten. Was ich brauche, ist eine virtuelle Schnittstelle (bestenfalls könnte auch eine virtuelle IP-Adresse ausreichen), die IPsec alles Eingehende transformiert (ESP / TUNNEL-MODUS) und an eth0 (auf meinem System namens em1) übergibt. Auf der anderen Seite entnimmt ein Peer das Paket von seinem eigenen Eth-Entschlüsseler und übergibt es einer virtuellen Schnittstelle auf der anderen Seite. Ich möchte also einen "normalen" IPSec-Tunnel einrichten.
Ich habe kein Problem mit der Richtlinie und der Sicherheitszuordnung, und die Konfiguration war einfach unter Verwendung der normalen Ethernet-Adressen der Systeme im Transportmodus, d. H.
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
und eine gegnerische Konfiguration auf dem Peer funktioniert ganz gut.
Jetzt habe ich versucht, eine virtuelle IP und eine Route zum anderen System mit einzurichten
ip address add 10.0.0.0 dev em1
ip route add to 10.0.0.2 via 10.0.0.1
und wieder umgekehrt auf der anderen Seite. Das funktioniert wieder gut. Dann habe ich die IPSec-Richtlinie und SA auf geändert
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
Wenn ich jetzt versuche, tcping
den Peer zu erreichen, erhalte ich keine Antwort und setkey -PD
sage mir, dass die Sicherheitsrichtlinie nie ausgelöst wurde. Jetzt versuche ich, eine funktionierende virtuelle Schnittstelle für den IPSec-Tunnel zu erstellen, aber ich weiß nicht, wie ich sie an die physische Schnittstelle binden soll und wie ich den Kernel dazu bringe, die Sicherheitsrichtlinie anzuwenden.
Für mich ist es wichtig, dass ich dies mit iproute2 lösen kann, da ich dies letztendlich aus einem C ++ - Programm heraus tun möchte und ich bereits die entsprechenden Klassen habe, die Netlink-Befehle im gleichen Stil wie der ip
Befehl löschen (was ich damit machen kann ip
, ich kann auch innerhalb meines Codes tun). Tatsächlich funktioniert der erste Teil bereits in meinem Programm und ich möchte im Übrigen dieselben Netlink-API-Funktionen verwenden.
Update Ich habe herausgefunden, dass der Status mit den Tunneladressen eingerichtet werden muss, damit die funktionierenden SAs funktionieren
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
während die Politik gleich bleibt. Jetzt wird die Richtlinie ausgelöst und ich sehe ein transformiertes Paket an einem Sniffing-Port. Auch iptables auf dem anderen Computer haben das Paket blockiert und ich habe es zum Testen deaktiviert.
Die eine Richtung scheint jetzt zu funktionieren, aber ich bekomme immer noch keine Antwort. Ich weiß auch nicht, ob das Problem noch irgendwie die Transformation, das Routing oder der Schnittstellenteil ist. Meine bevorzugte Lösung wäre immer noch eine mit einer virtuellen Schnittstelle, aber ich habe keine Ahnung, wie ich sie an eine physische binden soll, geschweige denn, ob die Transformation so funktionieren würde.