OpenVPN preko WebSocketa

Imam vprašanje glede iptables.

Problem je naslednji: uporabljam OpenVPN povezavo preko WebSocketov.

Setup je naslednji:

Na strežniku (Debian 9):

1. Zaženem OpenVPN server

sudo systemctl start openvpn@MyVPN_WS.service

OpenVPN strežnik je skonfiguriran tako, da posluša na TCP/8081 portu. Ta port je sicer za firewallom in ni dostopen od zunaj.


2. Zaženem Chisel (https://github.com/jpillora/chisel)

chisel server --port 8080 --auth me:mypasswd --socks5 &

Chisel vzpostavi websocket povezavo preko katere potem tečejo TCP paketki. Zadeva se zažene in posluša na portu 8080:

[1] 30289
root@vpn:/etc/openvpn# 2017/10/26 22:00:14 server: SOCKS5 Enabled
2017/10/26 22:00:14 server: Fingerprint b8:ad:8e:15:60:8f:f7:e0:f6:e8:ce:56:e4:85:d3:c5
2017/10/26 22:00:14 server: User authenication enabled
2017/10/26 22:00:14 server: Listening on 8080...


Na odjemalcu (Ubuntu 17.04) pa zaženem:

1. Najprej zaženem Chisel v client načinu:

chisel client --auth me:mypasswd http://myvpnserver.com:8080 socks

Zadeva se zažene in vzpostavi povezavo preko WebSocketa do strežnika:

2017/10/26 22:01:48 client: Connecting to ws://myvpnserver.com:8080
2017/10/26 22:01:48 client: tunnel#1 127.0.0.1:1080=>socks: Listening
2017/10/26 22:01:58 client: Retrying in 100ms...
2017/10/26 22:02:09 client: Retrying in 200ms...
2017/10/26 22:02:19 client: Fingerprint b8:ad:8e:15:60:8f:f7:e0:f6:e8:ce:56:e4:85:d3:c5
2017/10/26 22:02:19 client: Connected (Latency 37.582275ms)

Zdaj načeloma lahko preko WebSocket povezave (preko SOCKS5) dostopam neposredno do oddaljenega strežnika, tudi do portov, ki so od zunaj za firewallom. Na tej točki mi omrežje dela še povsem normalno.

2. Nato zaženem OpenVPN odjemalca:

openvpn --config MyVPN.conf

Config datoteka odjemalca vsebuje dva ključna parametra:

remote XX.XX.XX.XXX 8081
socks-proxy 127.0.0.1 1080

Ta dva parametra pomenita:

  • OpenVPN se povezuje preko SOCKS proxya
  • OpenVPN se poveže na server na port 8081


Zdaj pa problem.

OpenVPN se uspešno poveže. Ifconfig mi pokaže da imam tun0 napravo z ustreznim IP naslovom (10.10.6.2). Tako na server kot na client strani je iz logov razvidno, da je povezava uspešna.

Vendar pa ne morem pingat serverja (na 10.10.6.1). Pravzaprav ne morem pingat nobenega IP naslova. IP forwarding tudi ne deluje, čeprav je na serverju omogočen, skratka, omrežje ne dela.

Mislim pa, da vem v čem je problem.

Verjetno je problem v tem, da mi OpenVPN nastavi default routo oziroma default gateway na 10.10.6.1. Iz tega razloga potem tudi "prestavi" WebSocket povezavo preko tega default gatewaya. Zato verjetno vse skupaj crkne. Je pa zanimivo - edina stvar ki deluje, je OpenVPN povezava.

Skratka, moral bi narediti nekako tako, da websocket povezava teče mimo default gatewaya, oziroma, da mi OpenVPN nastavi default gateway za vse ostale povezave, razen za WebSocket.

Kako to narediti z iptables?

Komentarji

  • Client config:
    client
    remote XX.XX.XX.XX 8081
    proto tcp
    socks-proxy 127.0.0.1 1080
    dev tun
    mute-replay-warnings
    tls-version-min 1.2
    remote-cert-tls server

    <ca>
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    </ca>

    <cert>
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    </cert>

    <key>
    -----BEGIN PRIVATE KEY-----
    ...
    -----END PRIVATE KEY-----
    </key>

    <tls-auth>
    -----BEGIN OpenVPN Static key V1-----
    ...
    -----END OpenVPN Static key V1-----
    </tls-auth>

    key-direction 1
    auth SHA256
    cipher AES-256-CBC
    auth-nocache

    # rocno dodam routo v VPN2 omrezje:
    route 10.10.8.0 255.255.255.0

    script-security 2
    up /etc/openvpn/update-resolv-conf
    down /etc/openvpn/update-resolv-conf

    ping 10
    ping-restart 60
    verb 5
    mute 20


  • Server config:

    mode server
    tls-server
    local XX.XX.XX.XX
    proto tcp4
    port 8081
    dev tun
    ca /etc/openvpn/serverkeys/ca.crt
    cert /etc/openvpn/serverkeys/server.crt
    key /etc/openvpn/serverkeys/server.key
    dh /etc/openvpn/serverkeys/dh4096.pem
    crl-verify /etc/openvpn/serverkeys/crl.pem
    tls-auth /etc/openvpn/serverkeys/ta.key 0
    tls-version-min 1.2
    remote-cert-tls client
    tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
    auth SHA256
    cipher AES-256-CBC
    server 10.10.9.0 255.255.255.0
    persist-key
    persist-tun
    topology subnet
    push "topology subnet"
    push "redirect-gateway def1"
    push "route 10.10.8.0 255.255.255.0"
    client-to-client
    push "dhcp-option DNS 10.10.8.1"
    push "dhcp-option DOMAIN vpn.tralala.si"
    mtu-disc maybe
    user nobody
    group nogroup
    keepalive 10 120
    verb 3
    status /var/log/openvpn/status_ws.log
    log /var/log/openvpn/openvpn_ws.log
    log-append /var/log/openvpn/openvpn_ws.log
    script-security 2
    client-connect /etc/openvpn/signal-status.sh
    client-disconnect /etc/openvpn/signal-status.sh
    mute 20


    To je kar se OpenVPN tiče.

Za komentiranje se prijavite ali pa se vpišite.