Назад | Перейти на главную страницу

Как я могу настроить OpenVPN с IPv4 и IPv6 с помощью устройства Tap?

Мне удалось настроить OpenVPN для полного подключения IPv4 с помощью tap0. Теперь я хочу сделать то же самое для IPv6.

Адреса и настройка сети (обратите внимание, что мой настоящий префикс заменен на 2001: db8):

2001:db8::100:0:0/96    my assigned IPv6 range
2001:db8::100:abc:0/112 OpenVPN IPv6 range
2001:db8::100:abc:1     tap0 (on server) (set as gateway on client)
2001:db8::100:abc:2     tap0 (on client)
2001:db8::1:2:3:4       gateway for server

 Home laptop   (tap0: 2001:db8::100:abc:2/112 gateway 2001:db8::100:abc:1/112)
  |      | |      (running Kubuntu 10.10; OpenVPN 2.1.0-3ubuntu1)
  | wifi | |
   router  |
      |   OpenVPN
  INTERNET |
eth0  |   /tap0
     VPS        (eth0:2001:db8::1:2:3:4/64    gateway 2001:db8::1)
               (tap0: 2001:db8::100:abc:1/112)
                  (running Debian 6; OpenVPN 2.1.3-2)

Сервер имеет как собственные возможности подключения IPv4, так и IPv6, у клиента только IPv4.

Я могу ping6 на мой сервер и с моего сервера через OpenVPN, но не на другие машины (например, ipv6.google.com).

net.ipv6.conf.all.forwarding установлен на 1, Я пробовал отключить net.ipv6.conf.all.accept_ra а также без везения.

С помощью tcpdump И на сервере, и на клиенте я вижу, что пакеты фактически передаются через tap0 на eth0. Маршрутизатор (2001: db8 :: 1) отправляет запрос соседа для клиента (2001: db8 :: 100: abc: 2) на eth0 после того, как он получает эхо-запрос ICMP6. Сервер не отвечает на этот запрос, что приводит к тому, что эхо-запрос ICMP6 не маршрутизируется к месту назначения.

Как я могу заставить это соединение IPv6 работать?

Ответ Тимоти Болдуинса направил меня на правильный путь, хотя ответ был довольно загадочным. Объявления / запросы соседей IPv6 похожи на ARP для IPv6. Он используется, чтобы «видеть» другие машины в сети. Маршрутизатор отправляет запрос соседу, на который машина (сервер или клиент) должна ответить объявлением соседа.

Даже с net.ipv6.conf.all.forwarding установлен в 1, соседние объявления и запросы не пересылаются. Чтобы направлять объявления и запросы соседей по протоколу eth0, eth0 должен быть установлен в качестве прокси для IPv6-адреса клиента, находящегося за tap0, а проксирование для соседних вещей должно быть включено для eth0:

echo 1 > /proc/sys/net/ipv6/conf/eth0/proxy_ndp
/sbin/ip -6 neigh add proxy 2001:db8::100:abc:2 dev eth0

К сожалению, получить список добавленных прокси невозможно. ip -6 показывать сообщения об ошибках при повторном выполнении команды. Я также не уверен, что "Neigh del proxy" работает, он не выдает сообщение об ошибке и Источник C не имеет для меня особого значения.


Поскольку я не хочу делать все вручную, я создал сценарий, который выполняет всю работу за меня.

Конфигурация сервера

Адреса IPv6 основаны на части IPv4 ( 1 в 10.8.0.1). Префикс и маска сети хранятся в /etc/openvpn/variables.

Следующие шаги сделаны для настройки OpenVPN с зашифрованным подключением IPv4 / IPv6 к Интернету через собственное подключение IPv4. Ключи RSA и tls-auth используются для аутентификации и предотвращения MITM.

/etc/openvpn/variables содержит переменные, которые используются для сценария запуска (запускается при запуске после создания устройства tap0) и сценария подключения клиента (запускается после проверки подлинности клиента).

# this prefix is handled out by the provider, replace it with your own prefix
prefix=2001:db8::abc
# netmask, 2001:db9::abc:0000 - 2001:db9::abc:FFFF
prefixlen=112

/etc/openvpn/server-clientconnect.sh выполняется от имени пользователя root и обеспечивает правильную маршрутизацию IPv6, добавляя адрес IPv6 к прокси-серверу eth0. Так как client-connect вызывается после переключения OpenVPN на пользователя, указанного User настройка sudo необходим для того, чтобы дать скрипту достаточные права для запуска от имени пользователя root. Конечно, переменные должны быть проверены перед использованием, число должно быть от 2 до 254 включительно (1 - шлюз, 255 - широковещательный адрес).

#!/bin/sh
. /etc/openvpn/variables
if [ -z "$ifconfig_pool_remote_ip" ]; then
        echo "Missing environment variable."
        exit 1
fi
ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
        echo "Invalid IP part."
        exit 1
fi
hexipp=$(printf '%x' $ipp)
/sbin/ip -6 neigh add proxy $pfx:$hexipp dev eth0

Чтобы это работало, пользователь vpn должно быть разрешено запускать скрипт при сохранении $ifconfig_pool_remote_ip который содержит удаленный сетевой IPv4-адрес. Добавьте следующие строки в файл sudoers, выполнив sudo visudo и добавив:

Defaults:vpn env_keep=ifconfig_pool_remote_ip
vpn ALL=NOPASSWD: /etc/openvpn/server-clientconnect.sh

/etc/openvpn/server-up.sh включает IPv4, IPv6 forwarding (eth0 + tap0 не работал, действительно надо было all) и соседний прокси на eth0. Добавляет адрес шлюза к серверам tap0 слишком.

#!/bin/sh
. /etc/openvpn/variables
/sbin/ip -6 addr add $pfx:1/$pfxlen dev $dev
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
echo 1 > /proc/sys/net/ipv6/conf/eth0/proxy_ndp

Наконец, файл конфигурации OpenVPN по адресу /etc/openvpn/internet.conf:

proto udp
dev tap
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
script-security 2
up /etc/openvpn/server-up.sh
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
# encrypt all traffic
push "redirect-gateway def1"
# keep the same IP addresses each time
ifconfig-pool-persist ipp.txt
keepalive 10 120
tls-auth ta.key 0
cipher BF-CBC
comp-lzo
# OpenVPN will switch to this user, it is also used for sudo
user vpn
group vpn
persist-key
persist-tun

Для полноты, разрешения и права собственности на файлы в /etc/openvpn:

drwx------  root root  .
-rw-------  root root  ca.crt
-rw-------  root root  dh1024.pem
drwx------  root root  easy-rsa      <-- left from creation of keys
-rw-------  root root  ipp.txt
-rwx------  root root  server-clientconnect.sh
-rw-------  root root  internet.conf
-rw-------  root root  variables
-rwx------  root root  server-up.sh
-rw-------  root root  server.crt
-rw-------  root root  server.key
-rw-------  root root  ta.key
-rwx------  root root  update-resolv-conf <-- this was installed by default

Настройки брандмауэра:

itpables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -i tap0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
ip6tables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -s 2001::db8::abc:0/112 -i tap0 -o eth0 -j ACCEPT

Конфигурация на клиенте

/etc/openvpn/client.conf:

client
dev tap
proto udp
remote 178.21.112.251 1194
script-security 2
up /etc/openvpn/client-up.sh
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert home.crt
key home.key
ns-cert-type server
tls-auth ta.key 1
cipher BF-CBC
comp-lzo

ta.key и ca.key это те же файлы с сервера. home.key и home.crt файлы, созданные на сервере.

client-up.sh добавляет IPv6-адрес и маршрут (на основе IPv4-адреса):

#!/bin/sh
pfx='2001:db8::abc'
pfxlen=112
hexippart=`printf '%x' "$(echo $ifconfig_local | cut -d. -f4)"`
/sbin/ip -6 addr add $pfx:$hexippart/$pfxlen dev $dev
/sbin/ip -6 route add default via $pfx:1 dev $dev

Гид на http://www.ipsidixit.net/2010/03/24/239/ был очень полезен и Страница руководства OpenVPN полезен для получения информации о различных настройках.

Маршрутизатор восходящего потока настроен на 2001: db8 :: 100: abc: 2 как на прямую ссылку, установите net.ipv6.conf.eth0.proxy_ndp = 1, чтобы сделать вид, что это так.