IKEv2 läuft mit Windows aber nicht mit Android

Started by markus.tobatz, March 29, 2024, 08:34:34 PM

Previous topic - Next topic
Habe OPNsense 23.7.12 im Einsatz. Es kursieren ja grundsätzlich zwei Methoden ein IPsec mit IKEv2 EAP-MSCHAPv2 aufzusetzen: https://docs.opnsense.org/manual/how-tos/ipsec-swanctl-rw-ikev2-eap-mschapv2.html und https://docs.opnsense.org/manual/how-tos/ipsec-rw-srv-mschapv2.html

Mein Ziel bei der Aktion ist grundsätzlich die nativen Clients in Windows und Android zu nutzen. Ich habe mit beiden Methoden einen Full-Tunnel unter Windows 11 erfolgreich zum Laufen gebracht. Ich gehe also davon aus, dass ich grundsätzlich auf der Seite von OPNsense alles richtig konfiguriert habe (wie gesagt, habe mich an den Anleitungen orientiert). Es gab zwar ein paar Fallstricke, die ich mir noch nicht erklären kann, aber es lief erstmal.

Mein Problem: Ich kriege es unter Android 13 nicht zum Laufen. Also der Connect funktioniert. Der Android Client baut die Verbindung auf (sehe es auch im IPsec-Plugin im OPNsense-Dashboard). Aber es geht *null* Traffic über die Leitung, kein Ping, keine Namensauflösung, kein HTTP, einfach nichts. Und das kann ich mir nicht erklären - der Windows-Client läuft ja.

Hat jemand eine Idee, in welche Richtung das gehen könnte? Bitte *keine* Tipps, dass ich Strongswan nutzen soll - das will ich nicht. Als Fallback setze ich Wireguard ein, das läuft super, hätte aber trotzdem gern eine Lösung mit den nativen Clients.

Ich hab die Swanctl Anleitung dafür geschrieben. Ich hab es mit keinem nativen Android Client zum laufen gebracht, nur mit dem Android Strongswan Client. Ich habe stundenlang die IPsec Logs analysiert und alle möglichen Quellen durchforscht.

Wenn du es irgendwie zum laufen bekommst, melde dich nochmal, dann kann man die Anleitung verbessern. Danke :)
Hardware:
DEC740

Hi,

Ich nehme an du verwendest die neue Konfiguraton, die mit den Connections? Kannst du die swanctl.conf mal posten?
cat /usr/local/etc/swanctl/swanctl.conf

Genau, die neue Variante. Gern, meine Config lautet:


# cat /usr/local/etc/swanctl/swanctl.conf
# This file is automatically generated. Do not edit
connections {
    34cac9ac-3a43-4b1c-86f4-d2e535c3ef5b {
        proposals = aes256-sha256-modp2048
        unique = no
        aggressive = no
        version = 2
        mobike = yes
        local_addrs = my-server.mooo.com
        encap = yes
        rekey_time = 2400
        dpd_delay = 30
        pools = ikev2-ipv4-pool
        send_certreq = yes
        send_cert = always
        keyingtries = 0
        local-6a895aa5-cfd5-4f90-a3e2-0182183abcc9 {
            round = 0
            auth = pubkey
            id = my-server.mooo.com
            certs = 66053153143b6.crt
        }
        remote-2b5d6efe-1caf-44eb-9463-4f47d6296c61 {
            round = 0
            auth = eap-mschapv2
            eap_id = %any
        }
        children {
            07a8e2d2-9c70-440d-8fa4-61a03ac7d554 {
                esp_proposals = aes256-sha256-modp2048
                sha256_96 = no
                start_action = trap
                close_action = none
                dpd_action = clear
                mode = tunnel
                policies = yes
                local_ts = 0.0.0.0/0,::/0
                rekey_time = 600
                updown = /usr/local/opnsense/scripts/ipsec/updown_event.py --connection_child 07a8e2d2-9c70-440d-8fa4-61a03ac7d554
            }
        }
    }
}
pools {
    ikev2-ipv4-pool {
        addrs = 10.10.20.0/24
        dns = 192.168.1.1
    }
}
secrets {
    eap-c0646e69-693e-4dcd-b175-e57cd8d78248 {
        id-0 = user
        secret = crypted
    }
}
# Include config snippets
include conf.d/*.conf

Quote from: markus.tobatz on March 29, 2024, 08:34:34 PM
Mein Problem: Ich kriege es unter Android 13 nicht zum Laufen. Also der Connect funktioniert. Der Android Client baut die Verbindung auf (sehe es auch im IPsec-Plugin im OPNsense-Dashboard). Aber es geht *null* Traffic über die Leitung, kein Ping, keine Namensauflösung, kein HTTP, einfach nichts. Und das kann ich mir nicht erklären - der Windows-Client läuft ja.

Hört sich für mich so an, als ob der Client den Tunnel über IPv6 herstellt. Ist das der Fall?
OPNsense 24.7.11_2-amd64

Sieht für mich ganz in Ordnung aus. Kann schon sein mit dem IP6. Du hast jedoch keinen v6 Pool definiert. Lösch am besten den ::/0 Eintrag aus dem Child heraus.
Eventuell könnte das an den Policies liegen. Im Dashboard unter "VPN->IPsec-> Security Policy Database"  Wenn du mit dem Android verbindest sollten dort zwei Einträge erstellt werden.
source <Pool-IP>, destination 0.0.0.0/0[any]       und umgekehrt
source 0.0.0.0/0[any] , destination <Pool-IP>

Wenn das so erstellt wird sollte ipsec richtig funktionieren. Falls dann trotzdem der Ping in dein 192.168.1.0/24 Netz nicht geht, würde ich auf Firwall-Rules tippen.

May 08, 2024, 05:05:14 PM #6 Last Edit: May 08, 2024, 05:14:06 PM by markus.tobatz
Sorry hat eine Weile gedauert. Das VPN war bisher über IPv6 erreichbar, sollte ja eigentlich für den Aufbau den Tunnels unerheblich sein. Aber egal. Ich habe ihn aktuell gezwungen per IPv4 zu verbinden (indem ich eine nur per IPv4/A auflösbare Domain verwendet habe).

Die Einträge im Dashboard werden erzeugt (siehe Screenshot 1). Dennoch ist das Verhalten unverändert. Windows funktioniert einwandfrei, bei Android nach wie vor keine Namensauflösung, Ping etc. Ich kann mir daher auch keinen Reim drauf machen, warum das an der Firewall liegen soll (Windows Client läuft ja).

EDIT: Ein Unterschied fiel mir jetzt auf (siehe zweiter Screenshot). Dort ist als Protocol "esp" zu sehen, beim Connect von Android aus. Wenn ich mit dem Windows-Client verbinde, steht als Protocol "esp-udp". Also scheint Android das encapsuled UDP nicht zu können!?

Quote from: markus.tobatz on May 08, 2024, 05:05:14 PM
Sorry hat eine Weile gedauert. Das VPN war bisher über IPv6 erreichbar, sollte ja eigentlich für den Aufbau den Tunnels unerheblich sein.

[...]

EDIT: Ein Unterschied fiel mir jetzt auf (siehe zweiter Screenshot). Dort ist als Protocol "esp" zu sehen, beim Connect von Android aus. Wenn ich mit dem Windows-Client verbinde, steht als Protocol "esp-udp". Also scheint Android das encapsuled UDP nicht zu können!?

Du kannst zwischen Android und Opnsense leider keinen IPsec-Tunnel über IPv6 aufbauen. Wie Du bereits geschrieben hast, verwendet Android NAT-T (esp-udp). Dieses wird von der aktuell verwendeten FreeBSD-Version im Unterbau von Opnsense für IPv6 jedoch noch nicht unterstützt.
OPNsense 24.7.11_2-amd64

May 08, 2024, 05:26:09 PM #8 Last Edit: May 08, 2024, 05:39:45 PM by markus.tobatz
Nicht dass wir aneinander vorbeireden: Ich habe IPv6 jetzt bewusst beim Verbindungsaufbau unterbunden, indem ich einen IPv4-only Hostname verwende und die Firewall nur IPv4-Verbindungen akzeptiert. Ich bekomme ja den Verbindungsaufbau bestätigt, nur Traffic läuft keiner drüber. Es wird schon irgendwas in Richtung Firewall sein, aber ich habe keine Ahnung was!? Oder bringe ich hier irgendwas komplett durcheinander?

Quote from: markus.tobatz on May 08, 2024, 05:26:09 PM
Nicht dass wir aneinander vorbeireden: Ich habe IPv6 jetzt bewusst beim Verbindungsaufbau unterbunden, indem ich einen IPv4-only Hostname verwende und die Firewall nur IPv4-Verbindungen akzeptiert. Ich bekomme ja den Verbindungsaufbau bestätigt, nur Traffic läuft keiner drüber. Es wird schon irgendwas in Richtung Firewall sein, aber ich habe keine Ahnung was!? Oder bringe ich hier irgendwas komplett durcheinander?

Da Dein Internetanschluss offensichtlich eine öffentlich routbare IPv4-Adresse verfügt, kannst Du den Tunnel natürlich auch über IPv4 aufbauen. In diesem Szenario wird NAT-T auch von der Opnsense unterstützt. Falls dann kein Traffic über den Tunnel geht, sind entweder die Konfiguration des Tunnels oder die Firewallregeln nicht korrekt.
OPNsense 24.7.11_2-amd64

BREAKING: Ich glaube, ich hab es gerade am Laufen. Connect ist per IPv4 und IPv6 möglich, geroutet wird aber nur IPv4 aktuell. Was habe ich anders gemacht als in der Anleitung?

1) Ich habe die UDP encapsulation wieder *deaktiviert*
2) Für IPv4/6 auf dem WAN Interface eine Allow ESP Regel angelegt

Somit ist aktuell ein Connect mit den nativen Android und Windows-Clients möglich.

Da der öffentliche Transport somit scheinbar auch doch über IPv6 funktioniert, probiere ich vllt. mal noch das Routing von IPv6 über den Tunnel. Hab nur kein statisches Präfix...