Мне удалось настроить 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, чтобы сделать вид, что это так.