Ahoj,
mám tu takový zapeklitý problém s OpenVPN a IPv6. Máme v práci více VPN serverů pro různé účely a jeden z nich některým uživatelům přiděluje statickou adresu (po připojení mají vybraní uživatelé vždy stejnou IPv4 adresu). To je řešeno pomocí Radius protokolu, kdy uživatele ověřuje Radius server a pokud má uživatel přidělenou statickou adresu, tak ji pomocí atributu Framed-IP-Address pošle VPN serveru, který ji přidělí klientovi. Nyní potřebuji, aby tento VPN server přiděloval i IPv6 adresy.
Zde narážím na problém -- plugin (http://www.nongnu.org/radiusplugin/) pro ověřování uživatelů pomocí radius protokolu nepodporuje IPv6 -- nezná, nečte a naposílá relevantní atributy, takže i když IPv6 Radius server pošle, klient má smůlu. S tím narážím i na druhý problém, pokud má klient jednu adresu (ipv4 nebo ipv6) přidělenou staticky a ne losováním z poolu, pak musí mít přidělenou i tu druhou adresu. Přidělení IP je řešeno tak, že radius auth plugin vytvoří soubor s ifconfig-push 172.24.56.252 255.255.255.0 který openvpn následně přečte a pošle klientovi.
Cesta by logicky mohla vést přes tento soubor daný volbou client-config-dir /etc/openvpn/ccd/
OpenVPN na to dokonce i pamatuje, existuje volba
client-connect /etc/openvpn/skript.sh
která umožňuje právě tyto věci. Nebylo by nic jednoduššího vytvořit takový skript, který získá správnou IPv6 adresu pro daného uživatele (za předpokladu, že má staticky přidělenou IPv4) a uloží ji do výše uvedeného souboru. OpenVPN při dalším kroku ,,push-ne" tyto hodnoty uživateli, klient si je nastaví a svět bude krásný a zachrání to deštné pralesy a takové ty blbosti.
Tolik ideální svět. Ten reálný vypadá tak, že nejsem schopen dostat ke klientovi IPv6 adresu, pokud má staticky přidělenou IPv4. Když nemá staticky IPv4, vylosuje si obě z daného poolu a vše je funkční.
Relevantní část konfigurace serveru:
dev tap
#dále smetí jako certifikáty a podobně
client-config-dir /etc/openvpn/ccd-node10/
script-security 3
client-connect /etc/openvpn/scripts/static-ipv6.sh
plugin /usr/lib/openvpn/radiusplugin.so /etc/openvpn/radius-node10.cnf
ifconfig 172.24.56.1 255.255.255.0
#ifconfig-pool 172.24.56.2 172.24.56.190 255.255.255.0
server 172.24.56.0 255.255.255.0
server-ipv6 2001:1234:801:386::/64
# client configuration
push "route-gateway 172.24.56.1"
push "redirect-gateway def1"
push "dhcp-option DNS 172.24.6.10"
push "dhcp-option DNS 172.24.4.33"
#push "route-ipv6 2000::/3"
Skript, který generuje IPv6:
#!/bin/bash
ipdigit=`echo "$ifconfig_pool_remote_ip" | awk -F'.' '{print $4}'`
ipv6sub=`cat $config | awk '/server-ipv6/{print $2}'`
ipv6rem=`echo $ipv6sub | sed -e "s-\/64-$ipdigit-"`
ipv6adr=`echo $ipv6sub | sed -e "s-\/64-1-"`
if [ -e "/etc/openvpn/ccd-node10/$username" ]; then
echo "ifconfig-ipv6-push $ipv6rem/64 $ipv6adr" >> /etc/openvpn/ccd/$username
cat /etc/openvpn/ccd-node10/$username > $auth_control_file
echo "ifconfig-ipv6-push $ipv6rem/64 $ipv6adr" >> $auth_control_file
fi
soubor ccd/login obsahuje po připojení:
ifconfig-push 172.24.56.252 255.255.255.0
ifconfig-ipv6-push 2001:1234:801:386::252/64 2001:1234:801:386::1
log serveru hlásí:
Wed Mar 2 21:51:06 2016 us=497633 46.135.194.2:35182 [72906] Peer Connection Initiated with [AF_INET]46.135.194.2:35182
Wed Mar 2 21:51:06 2016 us=497652 72906/46.135.194.2:35182 OPTIONS IMPORT: reading client specific options from: /etc/openvpn/ccd//72906
Wed Mar 2 21:51:06 2016 us=497700 72906/46.135.194.2:35182 MULTI_sva: WARNING: if --ifconfig-push is used for IPv4, automatic IPv6 assignment from --ifconfig-ipv6-pool does not work. Use --ifconfig-ipv6-push for IPv6 then.
Wed Mar 2 21:51:06 2016 us=501562 72906/46.135.194.2:35182 PLUGIN_CALL: POST /usr/lib/openvpn/radiusplugin.so/PLUGIN_CLIENT_CONNECT status=0
Wed Mar 2 21:51:06 2016 us=501576 72906/46.135.194.2:35182 OPTIONS IMPORT: reading client specific options from: /tmp/openvpn_cc_f9e73a53d2d0c048213ed5884392bc1b.tmp
Wed Mar 2 21:51:06 2016 us=501594 72906/46.135.194.2:35182 MULTI_sva: WARNING: if --ifconfig-push is used for IPv4, automatic IPv6 assignment from --ifconfig-ipv6-pool does not work. Use --ifconfig-ipv6-push for IPv6 then.
Wed Mar 2 21:51:06 2016 us=509644 72906/46.135.194.2:35182 OPTIONS IMPORT: reading client specific options from: /tmp/openvpn_cc_4cdd0a1c2962f98a4599c4af51b16911.tmp
Wed Mar 2 21:51:06 2016 us=509678 72906/46.135.194.2:35182 MULTI_sva: WARNING: if --ifconfig-push is used for IPv4, automatic IPv6 assignment from --ifconfig-ipv6-pool does not work. Use --ifconfig-ipv6-push for IPv6 then.
Wed Mar 2 21:51:08 2016 us=71794 72906/46.135.194.2:35182 PUSH: Received control message: 'PUSH_REQUEST'
Wed Mar 2 21:51:08 2016 us=71808 72906/46.135.194.2:35182 send_push_reply(): safe_cap=940
Wed Mar 2 21:51:08 2016 us=71826 72906/46.135.194.2:35182 SENT CONTROL [72906]: 'PUSH_REPLY,route-gateway 172.24.56.1,redirect-gateway def1,dhcp-option DNS 172.24.6.10,dhcp-option DNS 172.24.4.33,route-ipv6 2000::/3 2001:1234:801:386::1,tun-ipv6,route-gateway 172.24.56.1,ping 2,ping-restart 20,ifconfig 172.24.56.252 255.255.255.0' (status=1)
Log u klienta pro změnu:
Wed Mar 2 21:51:08 2016 SENT CONTROL [vpn.server.cz]: 'PUSH_REQUEST' (status=1)
Wed Mar 2 21:51:08 2016 PUSH: Received control message: 'PUSH_REPLY,route-gateway 172.24.56.1,redirect-gateway def1,dhcp-option DNS 172.24.6.10,dhcp-option DNS 172.24.4.33,route-ipv6 2000::/3 2001:1234:801:386::1,tun-ipv6,route-gateway 172.24.56.1,ping 2,ping-restart 20,ifconfig 172.24.56.252 255.255.255.0'
Wed Mar 2 21:51:08 2016 OPTIONS IMPORT: timers and/or timeouts modified
Wed Mar 2 21:51:08 2016 OPTIONS IMPORT: --ifconfig/up options modified
Wed Mar 2 21:51:08 2016 OPTIONS IMPORT: route options modified
Wed Mar 2 21:51:08 2016 OPTIONS IMPORT: route-related options modified
Wed Mar 2 21:51:08 2016 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Wed Mar 2 21:51:08 2016 ROUTE_GATEWAY 172.16.1.1/255.255.255.240 IFACE=wlan0 HWADDR=68:17:29:0a:fb:f4
Wed Mar 2 21:51:08 2016 ROUTE6: default_gateway=UNDEF
Wed Mar 2 21:51:08 2016 TUN/TAP device tap0 opened
Wed Mar 2 21:51:08 2016 TUN/TAP TX queue length set to 100
Wed Mar 2 21:51:08 2016 do_ifconfig, tt->ipv6=1, tt->did_ifconfig_ipv6_setup=0
Wed Mar 2 21:51:08 2016 /sbin/ip link set dev tap0 up mtu 1500
Wed Mar 2 21:51:08 2016 /sbin/ip addr add dev tap0 172.24.56.252/24 broadcast 172.24.56.255
Wed Mar 2 21:51:08 2016 /sbin/ip route add 172.24.19.246/32 via 172.16.1.1
Wed Mar 2 21:51:08 2016 /sbin/ip route add 0.0.0.0/1 via 172.24.56.1
Wed Mar 2 21:51:08 2016 /sbin/ip route add 128.0.0.0/1 via 172.24.56.1
Wed Mar 2 21:51:08 2016 add_route_ipv6(2000::/3 -> 2001:1234:801:386::1 metric -1) dev tap0
Wed Mar 2 21:51:08 2016 /sbin/ip -6 route add 2000::/3 dev tap0 via 2001:1234:801:386::1
RTNETLINK answers: No route to host
Wed Mar 2 21:51:08 2016 ERROR: Linux route -6/-A inet6 add command failed: external program exited with error status: 2
Wed Mar 2 21:51:08 2016 Initialization Sequence Completed
Mohli byste prosím poradit, codělám špatně, že nedostanu IPv6 adresu?
P.S. 172.24.X.Y jsou veřejné adresy, 172.16.1.Z je má domácí síť.
Tak si odpovím sám...
Nejspíš to nejde kvůli rozbitému/nedokonalému OpenVPN. Nejaká zmínka je o tom zde:
https://community.openvpn.net/openvpn/ticket/556
Takže mám smůlu. Můžu si ručně nastavit IPv6 na straně klienta, ale protlačit je ze strany serveru není možné.