Fri, 18 Sep 2020 11:00:00 +0200
computernetz, ipsec, mikrotik, projekt, software, troubleshoot, vpn

IPsec-Tester

IPsec-Tester ist ein Programm zum Überprüfen von IPsec-Einstellungen mit IKEv2. Es befindet sich momentan noch in einem frühen Entwicklungsstadium, kann jedoch schon einige Informationen liefern, die mit anderen Werkzeugen aufwendiger zu ermitteln sind.

Im gegenwärtigen Entwicklungsstand wartet das Programm passiv an den UDP-Ports 500 und 4500 auf ankommende IKE_SA_INIT-Nachrichten. Dabei interpretiert es die enthaltenen Payloads und gibt deren Inhalt mit Lognachrichten aus. Das Programm ist in der Lage, NAT zu erkennen.

Die folgenden Zeilen zeigen beispielhaft den Verbindungsversuch von einer pfSense-Firewall.

NET: (0001) info rcvd 464 bytes UDP [::ffff:10.107.250.11]:500 to [::ffff:10.107.250.1]:500
IKE: (0001) info investigating IKE datagram
IKE: (0001) info IKE version: 2.0
IKE: (0001) info IKE header OK
IKE: (0001) info handling IKE_SA_INIT
IKE: (0001) info SA payload [44]
IKE: (0001) info  proposal #1 [44]: protocol: IKE (1), SPI size 0, 4 transforms
IKE: (0001) info   transform #1 [12]: ENCR (1): AES_CBC (12)
IKE: (0001) info    keylength: 128
IKE: (0001) info   transform #2 [8]: INTEG (3): HMAC_SHA2_256_128 (12)
IKE: (0001) info   transform #3 [8]: PRF (2): HMAC_SHA2_256 (5)
IKE: (0001) info   transform #4 [8]: DH (4): 2048-bit MODP Group (14)
IKE: (0001) info KE payload [264]
IKE: (0001) info  DH group 14, 256 byte key exchange data
IKE: (0001) info Nonce payload [36]
IKE: (0001) info  32 byte nonce data
IKE: (0001) info Notify payload [28]
IKE: (0001) info  notify NAT_DETECTION_SOURCE_IP (16388) with 28 byte length
IKE: (0001) info NAT detection saddr (16388)
IKE: (0001) info  no NAT detected
IKE: (0001) info Notify payload [28]
IKE: (0001) info  notify NAT_DETECTION_DESTINATION_IP (16389) with 28 byte length
IKE: (0001) info NAT detection daddr (16389)
IKE: (0001) info  no NAT detected
IKE: (0001) info Notify payload [8]
IKE: (0001) info  notify IKEV2_FRAGMENTATION_SUPPORTED (16430) with 8 byte length
IKE: (0001) info Notify payload [16]
IKE: (0001) info  notify SIGNATURE_HASH_ALGORITHMS (16431) with 16 byte length
IKE: (0001) info Notify payload [8]
IKE: (0001) info  notify REDIRECT_SUPPORTED (16406) with 8 byte length

Die Parameter der pfSense für Phase 1 - die IKE-SA - waren, wie leicht zu erkennen, AES mit 128 Bit, SHA256 und DH-Gruppe 14. Die NAT-Detection-Payload wurde sowohl für Quell- als auch Zieladresse korrekt verifiziert.

Für die Ausgabe verwendet IPsec-Tester die Bibliothek zlog, welche erlaubt, die Protokollzeilen zu filtern, anzupassen und an verschiedene Ziele zu senden.

Die Konfiguration für die Ausgabe von zlog sieht hier so aus:

[formats]
with_cat_mdc_lvl = "%c: (%M(dg)) %v %m%n"
[rules]
*.INFO >stdout; with_cat_mdc_lvl

Weitere Informationen zur Konfiguration von zlog lassen sich der Dokumentation entnehmen.

Die Logzeilen bestehen aus vier Elementen:

einer Kategorie, wie NET oder IKE,

einem Mapped Diagnostic Context (MDC), der Zahl in Klammern, die für jedes empfangene Datagramm eindeutig ist

der Priorität beziehungsweise dem Level der Logzeile,

der eigentlichen Logzeile.

Der MDC bezieht sich auf das aktuell empfangene Datagramm, das heißt, durch Filtern auf den MDC lassen sich alle Informationen zu einem Datagramm separieren. Dabei ist die erste Information immer die Zeile mit Kategorie NET, die Angaben zur UDP-Verbindung und zur Größe des Datagramms enthält.

Interessanter als die pfSense sind Verbindungsversuche von einem MikroTik-Router.

NET: (0009) info rcvd 428 bytes UDP [::ffff:10.107.250.3]:4500 to [::ffff:10.107.250.1]:4500
IKE: (0009) info investigating NAT-T IKE datagram
IKE: (0009) info IKE version: 2.0
IKE: (0009) info IKE header OK
IKE: (0009) info handling IKE_SA_INIT
IKE: (0009) info Notify payload [28]
IKE: (0009) info  notify NAT_DETECTION_DESTINATION_IP (16389) with 28 byte length
IKE: (0009) info NAT detection daddr (16389)
IKE: (0009) info  NAT detected
IKE: (0009) info Notify payload [28]
IKE: (0009) info  notify NAT_DETECTION_SOURCE_IP (16388) with 28 byte length
IKE: (0009) info NAT detection saddr (16388)
IKE: (0009) info  NAT detected
IKE: (0009) info Nonce payload [28]
IKE: (0009) info  24 byte nonce data
IKE: (0009) info KE payload [264]
IKE: (0009) info  DH group 14, 256 byte key exchange data
IKE: (0009) info SA payload [44]
IKE: (0009) info  proposal #1 [44]: protocol: IKE (1), SPI size 0, 4 transforms
IKE: (0009) info   transform #1 [12]: ENCR (1): AES_CBC (12)
IKE: (0009) info    keylength: 128
IKE: (0009) info   transform #2 [8]: PRF (2): HMAC_SHA2_256 (5)
IKE: (0009) info   transform #3 [8]: INTEG (3): HMAC_SHA2_256_128 (12)
IKE: (0009) info   transform #4 [8]: DH (4): 2048-bit MODP Group (14)

Zu sehen ist, dass der Router sofort an UDP-Port 4500 sendet und dass das Programm NAT erkennt, obwohl beide Geräte im selben Subnet angeschlossen waren.

Durch eine kleine Änderung in der Konfiguration der MikroTik, nämlich dem Einfügen von port=500 bei der Peer-Konfiguration, ändert sich das Verhalten des MikroTik-Routers wie folgt:

NET: (000b) info rcvd 424 bytes UDP [::ffff:10.107.250.3]:500 to [::ffff:10.107.250.1]:500
IKE: (000b) info investigating IKE datagram
IKE: (000b) info IKE version: 2.0
IKE: (000b) info IKE header OK
IKE: (000b) info handling IKE_SA_INIT
IKE: (000b) info Notify payload [28]
IKE: (000b) info  notify NAT_DETECTION_DESTINATION_IP (16389) with 28 byte length
IKE: (000b) info NAT detection daddr (16389)
IKE: (000b) info  no NAT detected
IKE: (000b) info Notify payload [28]
IKE: (000b) info  notify NAT_DETECTION_SOURCE_IP (16388) with 28 byte length
IKE: (000b) info NAT detection saddr (16388)
IKE: (000b) info  no NAT detected
IKE: (000b) info Nonce payload [28]
IKE: (000b) info  24 byte nonce data
IKE: (000b) info KE payload [264]
IKE: (000b) info  DH group 14, 256 byte key exchange data
IKE: (000b) info SA payload [44]
IKE: (000b) info  proposal #1 [44]: protocol: IKE (1), SPI size 0, 4 transforms
IKE: (000b) info   transform #1 [12]: ENCR (1): AES_CBC (12)
IKE: (000b) info    keylength: 128
IKE: (000b) info   transform #2 [8]: PRF (2): HMAC_SHA2_256 (5)
IKE: (000b) info   transform #3 [8]: INTEG (3): HMAC_SHA2_256_128 (12)
IKE: (000b) info   transform #4 [8]: DH (4): 2048-bit MODP Group (14)

Nun sendet der MikroTik-Router initial an UDP-Port 500 und die NAT-Detection erkennt korrekt, dass kein NAT vorliegt.

Wie bereits erwähnt, ist das Programm noch sehr jung. Es ist bei GitHub unter https://github.com/matwei/ipsec-tester zu finden.