Настройка IPv6 в OpenVPN

Использовать IPv6 внутри OpenVPN удобнее всего в режиме работы VPN под названием tap (а не «tun»), представляющем из себя эмуляцию внутри VPN обычного Ethernet-подключения.

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

Помимо него, на оба компьютера следует скопировать файл:

/etc/openvpn/tap.sh
#!/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, что происходит крайне редко), и при этом с достаточной степенью вероятности уникальным.

На сервере

/etc/openvpn/vpn-branch.conf
lport 1194
proto udp6
dev vpn-branch
dev-type tap
tun-mtu 1360
secret vpn-hq.key
script-security 2
up tap.sh
/etc/openvpn/vpn-branch.ipv6
LOCAL_IP6=2001:470:xxxx:1::1/64

Добавить в /etc/radvd.conf:

/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

На клиенте

/etc/openvpn/vpn-hq.conf
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), после чего туннель должен будет начать работать.

Ссылки


Who's online

There are currently 0 users and 5 guests online.