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íť.