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

Debian: IPv6-в-IPv4 через OpenVPN

Следуя (примерно) инструкциям https://www.zagbot.com/openvpn_ipv6_tunnel.html у меня теперь есть следующее:

Клиент

martin@theoria:~$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:50:8d:b3:fd:f4  
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::250:8dff:feb3:fdf4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:31372164 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33131753 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:15453951555 (15.4 GB)  TX bytes:26797262646 (26.7 GB)
          Interrupt:23 Base address:0xa000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1985259 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1985259 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:347645379 (347.6 MB)  TX bytes:347645379 (347.6 MB)

sit1      Link encap:IPv6-in-IPv4  
          inet6 addr: 2001:41d0:2:b353::10/64 Scope:Global
          inet6 addr: fe80::a08:a/128 Scope:Link
          UP POINTOPOINT RUNNING NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.10  P-t-P:10.8.0.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:1106 (1.1 KB)  TX bytes:1598 (1.5 KB)

virbr0    Link encap:Ethernet  HWaddr 12:86:9c:16:08:fd  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr 00:0e:2e:4e:94:8a  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Сервер

root@martineve:~# ifconfig 
eth0      Link encap:Ethernet  HWaddr e0:69:95:72:85:77  
          inet addr:188.165.232.xxx  Bcast:188.165.232.255  Mask:255.255.255.0
          inet6 addr: fe80::e269:95ff:fe72:8577/64 Scope:Link
          inet6 addr: 2001:41d0:2:b353::1/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:49817 errors:0 dropped:6 overruns:0 frame:0
          TX packets:51419 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:21105790 (20.1 MiB)  TX bytes:36400780 (34.7 MiB)
          Interrupt:20 Memory:fe500000-fe520000 

eth0:0    Link encap:Ethernet  HWaddr e0:69:95:72:85:77  
          inet addr:87.98.254.xxx  Bcast:87.255.255.255  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:20 Memory:fe500000-fe520000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:14274 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14274 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:10206299 (9.7 MiB)  TX bytes:10206299 (9.7 MiB)

sit10     Link encap:IPv6-in-IPv4  
          inet6 addr: 2001:41d0:2:b353::3/64 Scope:Global
          inet6 addr: fe80::a08:1/128 Scope:Link
          UP POINTOPOINT RUNNING NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:16000 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13254 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:9839924 (9.3 MiB)  TX bytes:5791219 (5.5 MiB)

Каждое устройство может пинговать другое по сети IPv6 между ними:

Клиент:

PING 2001:41d0:2:b353::3(2001:41d0:2:b353::3) 56 data bytes
64 bytes from 2001:41d0:2:b353::3: icmp_seq=1 ttl=64 time=25.3 ms

Сервер:

PING 2001:41d0:2:b353::10(2001:41d0:2:b353::10) 56 data bytes
64 bytes from 2001:41d0:2:b353::10: icmp_seq=1 ttl=64 time=94.7 ms

Однако из клиента я не могу получить доступ нигде снаружи.

Клиент:

martin@theoria:~$ ip -6 route show
2001:41d0:2:b353::/64 via :: dev sit1  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 via :: dev sit1  proto kernel  metric 256 
default via 2001:41d0:2:b353::1 dev sit1  metric 1024 
martin@theoria:~$ sudo route -A inet6
[sudo] password for martin: 
Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
2001:41d0:2:b353::/64          ::                         Un   256 0     1 sit1
fe80::/64                      ::                         U    256 0     0 eth0
fe80::/64                      ::                         Un   256 0     0 sit1
::/0                           2001:41d0:2:b353::1        UG   1024 0     0 sit1
::/0                           ::                         !n   -1  1   520 lo
::1/128                        ::                         Un   0   2    56 lo
2001:41d0:2:b353::10/128       ::                         Un   0   1     3 lo
fe80::a08:a/128                ::                         Un   0   1     0 lo
fe80::250:8dff:feb3:fdf4/128   ::                         Un   0   1     0 lo
ff00::/8                       ::                         U    256 0     0 eth0
ff00::/8                       ::                         U    256 0     0 sit1
::/0                           ::                         !n   -1  1   520 lo

Сервер:

root@martineve:~# ip -6 route show
2001:41d0:2:b353::10 dev sit10  metric 1024 
2001:41d0:2:b353::/64 dev eth0  proto kernel  metric 256 
2001:41d0:2:b353::/64 via :: dev sit10  proto kernel  metric 256 
2001:41d0:2:b300::/56 dev eth0  proto kernel  metric 256  expires 2590467sec
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 via :: dev sit10  proto kernel  metric 256 
ff00::/8 dev eth0  metric 256 
ff00::/8 dev sit10  metric 256 
default via fe80::5:73ff:fea0:0 dev eth0  metric 1024 
root@martineve:~# route -A inet6 
Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
::1/128                        ::                         Un   0   1   196 lo
2001:41d0:2:b353::/128         ::                         Un   0   1     0 lo
2001:41d0:2:b353::/128         ::                         Un   0   1     0 lo
2001:41d0:2:b353::1/128        ::                         Un   0   1   101 lo
2001:41d0:2:b353::3/128        ::                         Un   0   1     3 lo
2001:41d0:2:b353::10/128       ::                         U    1024 0     0 sit10
2001:41d0:2:b353::/64          ::                         U    256 0     0 eth0
2001:41d0:2:b353::/64          ::                         Un   256 0     0 sit10
2001:41d0:2:b300::/56          ::                         UAe  256 0     2 eth0
fe80::/128                     ::                         Un   0   1     0 lo
fe80::a08:1/128                ::                         Un   0   1     0 lo
fe80::e269:95ff:fe72:8577/128  ::                         Un   0   1    49 lo
fe80::/64                      ::                         U    256 0     0 eth0
fe80::/64                      ::                         Un   256 0     0 sit10
ff00::/8                       ::                         U    256 0     0 eth0
ff00::/8                       ::                         U    256 0     0 sit10
::/0                           fe80::5:73ff:fea0:0        UG   1024 0     0 eth0
::/0                           ::                         !n   -1  1   113 lo

Сервер имеет общее подключение по IPv6:

PING aaaa.test-ipv6.com(jason-fesler.f0-8.switch2a.fmt.he.net) 56 data bytes
64 bytes from jason-fesler.f0-8.switch2a.fmt.he.net: icmp_seq=1 ttl=53 time=164 ms

Клиент не:

PING aaaa.test-ipv6.com(jason-fesler.f0-8.switch2a.fmt.he.net) 56 data bytes
^C
--- aaaa.test-ipv6.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2015ms

Я пробовал это безрезультатно:

root@martineve:~# cat /proc/sys/net/ipv6/conf/all/forwarding 
1

Что мне нужно сделать, чтобы позволить клиенту получить доступ к большому внешнему миру IPv6?

В конечном итоге ответ был в исходной ссылке, которая у меня была!

Когда вы выполняете такую ​​маршрутизацию, вы должны указать бит «ip add neigh proxy [ip] eth0».

У вас много маршрутов с одинаковым приоритетом и на разных устройствах. Вы маршрутизируете свой / 64 из eth0, что может вызвать у вас проблемы. Как правило, проще иметь разные / 64 для разных подсетей.

Прежде чем пытаться связаться с вами, проверьте подключение IPv6 в вашей сети. Могут ли клиент и хост пинговать друг друга по IPv6. Это должно сработать, прежде чем вы сможете маршрутизировать.

Некоторые провайдеры выделяют / 64 для маршрутизации между вашим сервером и своей сетью. Эти соединения могут поддерживать только один адрес, который должен быть назначен вашему внешнему интерфейсу. Они также должны предоставить / 48, / 56 или / 60 для нужд вашей внутренней сети.

РЕДАКТИРОВАТЬ: Я снова просмотрел вашу маршрутизацию и сравнил ее с моей. Я бы посоветовал проверить ваш ip -6 neigh вывод. В моем случае у меня есть соединение точка-точка IPv6 через туннель, и он не показывает мой внешний маршрутизатор. Похоже, у вас есть внешний адрес 2001: 41d0: 2: b353 :: / 64 для внешней маршрутизации и 2001: 41d0: 2: b300 :: / 56 для внутренней сети. Попробуйте использовать 2001: 41d0: 2: b300 :: / 64 для внутреннего сетевого блока маршрутизатора и 2001: 41d0: 2: b301 :: / 64 для блока удаленных серверов. Попробуйте более похожую конфигурацию.

Сервер: (sit0 - 2001: 41d0: 2: b300 :: 2)

default dev eth0   metric 1024  mtu 1480 advmss 1420 hoplimit 0
2000::/3  dev eth0  metric 1024  mtu 1480 advmss 1420 hoplimit 0
2001:41d0:2:b301::/64  via 2001:41d0:2:b301::3 dev sit0  proto kernel  metric 256  mtu 1480 advmss 1420 hoplimit 0

Клиент: (sit1 - 2001: 41d0: 2: b301 :: 3)

default dev sit1   metric 1024  mtu 1480 advmss 1420 hoplimit 0
2000::/3  dev via 2001:41d0:2:b3010::2sit1 metric 1024  mtu 1480 advmss 1420 hoplimit 0

Чтобы развернуть самостоятельный ответ OP.

Проблема в том, что ваши пакеты попадают в Интернет, но ответы не возвращаются.

Ваш хостинг-провайдер предоставил вам блокировку «по ссылке» (вероятно, / 64, хотя мы этого точно не знаем). Вы можете использовать любой адрес из своего блока, но для этого ваш сервер должен отвечать на запросы обнаружения соседей для этого адреса. Ваш сервер будет отвечать на запросы обнаружения соседей для 2001: 41d0: 2: b353 :: 1, потому что он связан с интерфейсом, обращенным к вашему провайдеру, но не будет отвечать на запросы обнаружения соседей для 2001: 41d0: 2: b353 :: 10 . Таким образом, маршрутизатор вашего хостинг-провайдера не знает, куда отправлять ответы на пакеты, которые отправляет ваш клиент.

Есть несколько возможных решений этой проблемы.

Один из них - использовать команду «ip -6 neigh add proxy 2001: 41d0: 2: b353 :: 10 eth0», чтобы явно указать ядру, что оно должно отвечать на запросы обнаружения соседей для 2001: 41d0: 2: b353 :: 10 получил по eth0. Это немного хакерское решение, но, к сожалению, для некоторых поставщиков это единственный вариант.

Другой - попросить вашего хостинг-провайдера предоставить вам «маршрутизируемый» блок. С маршрутизируемым блоком вместо того, чтобы выполнять обнаружение соседей отдельно для каждого адреса в вашем блоке, они будут рассматривать ваш сервер как маршрутизатор.

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

P.S. openvpn теперь может передавать трафик ipv6 напрямую, вам больше не нужно создавать туннель внутри туннеля.