OpenVPN-туннель может работать и при полном отсутствии IPv4, т.е. использовать в качестве транспорта UDP/IPv6, и внутри туннеля также, пропускать IPv6-трафик. Именно такой вариант я и рекомендую – дело в том, что при использовании OpenVPN поверх IPv4 нужно будет обеспечивать на файрволлах обоих сторон надёжный пропуск-проброс UDP-пакетов на внутренние IPv4-адреса терминирующих VPN компьютеров (TCP тоже поддерживается, но к использованию авторами OpenVPN не рекомендован), что может оказаться немногим проще, чем настроить на этих же роутерах 6to4 или другой туннель.
Для этого примера предположим, что мы хотим связать главный офис фирмы (HQ) с одним из её филиалов (Branch) в режиме VPN точка-точка, с разделяемым секретным ключом (vpn-hq.key
), IPv6 нам предоставляет tunnelbroker.net, в главном офисе используются различные подсети из 2001:470:xxxx::/48
, а VPN-клиенту мы решили выдать 2001:470:xxxx:1::/64
.
Файл /etc/openvpn/vpn-hq.key
будет содержать секретный ключ, который при использовании туннеля с шифрованием в режиме «shared secret» должен быть одинаковым на всех соединяемых компьютерах. Сгенерировать его можно следующим образом:
openvpn --genkey --secret /etc/openvpn/vpn-hq.key
Помимо него, на оба компьютера следует скопировать файл:
#!/bin/bash INTERFACE=$1; shift; TUN_MTU=$1; shift; UDP_MTU=$1; shift; LOCAL_IP=$1; shift; REMOTE_IP=$1; shift; MODUS=$1; shift; ifconfig $INTERFACE hw ether `echo -n 02: ; hostname | md5sum | sed 's/\(..\)/\1:/g; s/.$//' | colrm 15` ip link set $INTERFACE up ip link set mtu $TUN_MTU dev $INTERFACE echo 64 > /proc/sys/net/ipv6/conf/$INTERFACE/accept_ra_rt_info_max_plen if [ -f "/etc/openvpn/$INTERFACE.ipv6" ]; then . /etc/openvpn/$INTERFACE.ipv6 for A in $LOCAL_IP6; do ip -6 addr add $A dev $INTERFACE done fi exit 0
По-умолчанию, при каждом перезапуске VPN создаются туннельные интерфейсы со случайным MAC-адресом. Это неудобно тем, что любые открытые внутри VPN соединения после перезапуска VPN подвисают на долгое время – до тех пор, пока удалённый компьютер не обнаружит изменившийся MAC-адрес другого конца туннеля. Указанным же выше способом (строка с ifconfig
) можно добиться того, чтобы MAC-адрес на каждом клиентском компьютере был каждый раз одним и тем же (до смены hostname, что происходит крайне редко), и при этом с достаточной степенью вероятности уникальным.
lport 1194 proto udp6 dev vpn-branch dev-type tap tun-mtu 1360 secret vpn-hq.key script-security 2 up tap.sh
LOCAL_IP6=2001:470:xxxx:1::1/64
Добавить в /etc/radvd.conf
:
interface vpn-branch { AdvSendAdvert on; IgnoreIfMissing on; AdvDefaultLifetime 0; prefix 2001:470:xxxx:1::1/64 { }; route 2001:470:xxxx::/48 { }; };
Нужно также включить на сервере IP forwarding, для чего добавить в /etc/sysctl.conf
следующие две строки и выполнить sysctl -p
с правами root
:
net.ipv6.conf.all.forwarding=1 net.ipv6.conf.default.forwarding=1
…а также добавить соответствующее правило в настройки используемого IPv6-файрволла:
ip6tables -A FORWARD -i vpn-branch -j ACCEPT
remote hq.example.com 1194 proto udp6 dev vpn-hq dev-type tap tun-mtu 1360 secret vpn-hq.key script-security 2 up tap.sh
После создания на обоих компьютерах всех указанных выше файлов, достаточно просто перезапустить OpenVPN (в Debian/Ubuntu – /etc/init.d/openvpn restart
) и RADVD (/etc/init.d/radvd restart
), после чего туннель должен будет начать работать.