Вы находитесь здесь: version6.ru » Настройка IPv6 в OpenVPN
Различия
Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
openvpn [2011-07-01 07:01 UTC] rm |
openvpn [2012-02-17 09:19 UTC] (текущий) rm |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== Настройка IPv6 в OpenVPN ====== | ====== Настройка IPv6 в OpenVPN ====== | ||
- | OpenVPN поддерживает IPv6 как внутри, так и снаружи туннеля. Однако поддержкой этой на сегодняшний день можно воспользоваться только с помощью собственного скрипта для поднятия интерфейса. Этот скрипт (''up-ipv6.sh'') приведён ниже. | + | Использовать IPv6 внутри OpenVPN удобнее всего в режиме работы VPN под названием tap (а не "tun"), представляющем из себя эмуляцию внутри VPN обычного Ethernet-подключения. |
- | ===== Выбор транспортного протокола ===== | + | OpenVPN-туннель может работать и при полном отсутствии IPv4, т.е. использовать в качестве транспорта UDP/IPv6, и внутри туннеля также, пропускать IPv6-трафик. Именно такой вариант я и рекомендую -- дело в том, что при использовании OpenVPN поверх IPv4 нужно будет обеспечивать на файрволлах обоих сторон надёжный пропуск-проброс UDP-пакетов на внутренние IPv4-адреса терминирующих VPN компьютеров (TCP тоже поддерживается, но к использованию авторами OpenVPN не рекомендован), что может оказаться немногим проще, чем настроить на этих же роутерах [[/6to4/howto|6to4]] или [[/he.net/howto|другой]] туннель. |
- | OpenVPN-туннель может работать и при полном отсутствии IPv4, т.е. использовать в качестве транспорта UDP/IPv6, и внутри туннеля также, пропускать IPv6-трафик. Именно такой вариант я и рекомендую -- дело в том, что при использовании OpenVPN поверх IPv4 нужно будет обеспечивать на файрволлах обоих сторон надёжный пропуск-проброс UDP-пакетов на внутренние IPv4-адреса терминирующих VPN компьютеров (TCP тоже поддерживается, но к использованию авторами OpenVPN не рекомендован), что может оказаться немногим проще, чем настроить на этих же роутерах элементарный [[/6to4/howto|6to4]]. | + | |
- | ===== Конфигурационные файлы ===== | ||
Для этого примера предположим, что мы хотим связать главный офис фирмы (HQ) с одним из её филиалов (Branch) в режиме VPN точка-точка, с разделяемым секретным ключом (''vpn-hq.key''), IPv6 нам предоставляет [[/he.net/howto|tunnelbroker.net]], в главном офисе используются различные подсети из ''2001:470:xxxx::/48'', а VPN-клиенту мы решили выдать ''2001:470:xxxx:1::/64''. | Для этого примера предположим, что мы хотим связать главный офис фирмы (HQ) с одним из её филиалов (Branch) в режиме VPN точка-точка, с разделяемым секретным ключом (''vpn-hq.key''), IPv6 нам предоставляет [[/he.net/howto|tunnelbroker.net]], в главном офисе используются различные подсети из ''2001:470:xxxx::/48'', а VPN-клиенту мы решили выдать ''2001:470:xxxx:1::/64''. | ||
- | ==== На обоих компьютерах ==== | + | ===== Общие настройки (на обоих компьютерах) ===== |
- | Файл ''/etc/openvpn/vpn-hq.key'' будет содержать секретный ключ, который при использовании туннеля с шифрованием в режиме "shared secret" должен быть одинаковым на всех соединяемых компьютерах. Сгенерировать его можно следующим образом((http://openvpn.net/index.php/open-source/documentation/miscellaneous/78-static-key-mini-howto.html)): | + | Файл ''/etc/openvpn/vpn-hq.key'' будет содержать секретный ключ, который при использовании туннеля с шифрованием в режиме "shared secret" должен быть одинаковым на всех соединяемых компьютерах. Сгенерировать его можно следующим образом: |
<code>openvpn --genkey --secret /etc/openvpn/vpn-hq.key</code> | <code>openvpn --genkey --secret /etc/openvpn/vpn-hq.key</code> | ||
Помимо него, на оба компьютера следует скопировать файл: | Помимо него, на оба компьютера следует скопировать файл: | ||
- | <file bash /etc/openvpn/up-ipv6.sh> | + | <file bash /etc/openvpn/tap.sh> |
#!/bin/bash | #!/bin/bash | ||
+ | |||
INTERFACE=$1; shift; | INTERFACE=$1; shift; | ||
TUN_MTU=$1; shift; | TUN_MTU=$1; shift; | ||
Строка 23: | Строка 21: | ||
MODUS=$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 $INTERFACE up | ||
ip link set mtu $TUN_MTU dev $INTERFACE | ip link set mtu $TUN_MTU dev $INTERFACE | ||
+ | echo 64 > /proc/sys/net/ipv6/conf/$INTERFACE/accept_ra_rt_info_max_plen | ||
- | . /etc/openvpn/$INTERFACE.ipv6 | + | 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 | ||
- | for A in $LOCAL_IP6; do | + | exit 0</file> |
- | ip -6 addr add $A dev $INTERFACE | + | По-умолчанию, при каждом перезапуске VPN создаются туннельные интерфейсы со случайным MAC-адресом. Это неудобно тем, что любые открытые внутри VPN соединения после перезапуска VPN подвисают на долгое время -- до тех пор, пока удалённый компьютер не обнаружит изменившийся MAC-адрес другого конца туннеля. Указанным же выше способом (строка с ''ifconfig'') можно добиться того, чтобы MAC-адрес на каждом клиентском компьютере был каждый раз одним и тем же (до смены hostname, что происходит крайне редко), и при этом с достаточной степенью вероятности уникальным. |
- | done | + | |
- | for R in $ROUTE_IP6; do | + | ===== На сервере ===== |
- | ip -6 route add $R dev $INTERFACE | + | |
- | done | + | |
- | + | ||
- | exit 0 | + | |
- | </file> | + | |
- | + | ||
- | ==== На сервере (hq.example.com) ==== | + | |
<file - /etc/openvpn/vpn-branch.conf>lport 1194 | <file - /etc/openvpn/vpn-branch.conf>lport 1194 | ||
proto udp6 | proto udp6 | ||
dev vpn-branch | dev vpn-branch | ||
- | dev-type tun | + | dev-type tap |
- | tun-ipv6 | + | tun-mtu 1360 |
secret vpn-hq.key | secret vpn-hq.key | ||
script-security 2 | script-security 2 | ||
- | up up-ipv6.sh</file> | + | up tap.sh</file> |
<file bash /etc/openvpn/vpn-branch.ipv6> | <file bash /etc/openvpn/vpn-branch.ipv6> | ||
Строка 53: | Строка 50: | ||
</file> | </file> | ||
- | ==== На клиенте ==== | + | Добавить в ''/etc/radvd.conf'': |
- | <file - /etc/openvpn/vpn-hq.conf>remote hq.example.com 1194 | + | <file - /etc/radvd.conf> |
- | proto udp6 | + | interface vpn-branch { |
- | dev vpn-hq | + | AdvSendAdvert on; |
- | dev-type tun | + | IgnoreIfMissing on; |
- | tun-ipv6 | + | AdvDefaultLifetime 0; |
- | secret vpn-hq.key | + | prefix 2001:470:xxxx:1::1/64 { }; |
- | script-security 2 | + | route 2001:470:xxxx::/48 { }; |
- | up up-ipv6.sh | + | }; |
- | ping 120 | + | |
- | ping-restart 300 | + | |
- | up-delay | + | |
- | </file> | + | |
- | + | ||
- | <file bash /etc/openvpn/vpn-hq.ipv6> | + | |
- | LOCAL_IP6=2001:470:xxxx:1::2/64 | + | |
- | ROUTE_IP6=2001:470:xxxx::/48 | + | |
</file> | </file> | ||
- | ===== Включение маршрутизации на сервере ===== | + | Нужно также включить на сервере IP forwarding, для чего добавить в ''/etc/sysctl.conf'' следующие две строки и выполнить ''sysctl -p'' с правами ''root'': |
- | Если необходимо разрешить VPN-клиенту доступ к другим подсетям, кроме используемой непосредственно для организации туннеля, либо выпустить его "во внешний мир" через Интернет-соединение сервера, следует включить на сервере IP forwarding, для чего добавить в ''/etc/sysctl.conf'' следующие две строки и выполнить ''sysctl -p'' с правами ''root'': | + | |
<file>net.ipv6.conf.all.forwarding=1 | <file>net.ipv6.conf.all.forwarding=1 | ||
net.ipv6.conf.default.forwarding=1</file> | net.ipv6.conf.default.forwarding=1</file> | ||
...а также добавить соответствующее правило в настройки используемого IPv6-файрволла: | ...а также добавить соответствующее правило в настройки используемого IPv6-файрволла: | ||
<file>ip6tables -A FORWARD -i vpn-branch -j ACCEPT</file> | <file>ip6tables -A FORWARD -i vpn-branch -j ACCEPT</file> | ||
+ | |||
+ | ===== На клиенте ===== | ||
+ | <file - /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</file> | ||
===== Запуск туннеля ===== | ===== Запуск туннеля ===== | ||
- | После создания на обоих компьютерах всех указанных выше файлов, достаточно просто перезапустить OpenVPN (в Debian/Ubuntu -- ''/etc/init.d/openvpn restart''), после чего туннель должен будет начать работать. | + | После создания на обоих компьютерах всех указанных выше файлов, достаточно просто перезапустить OpenVPN (в Debian/Ubuntu -- ''/etc/init.d/openvpn restart'') и RADVD (''/etc/init.d/radvd restart''), после чего туннель должен будет начать работать. |
===== Ссылки ===== | ===== Ссылки ===== | ||
- | * [[http://www.sixxs.net/forum/?msg=general-535044|Как раздать IPv6 по OpenVPN]] (третье сообщение) | + | * http://openvpn.net/index.php/open-source/documentation/miscellaneous/78-static-key-mini-howto.html |
openvpn.1309503686.txt.gz · Последние изменения: 2011-07-01 07:01 UTC От rm