Debian:通过 OpenVPN 将 IPv6 引入 IPv4

Debian:通过 OpenVPN 将 IPv6 引入 IPv4

大致按照以下说明操作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 通对方:

客户:

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 的外部世界?

答案1

您有许多具有相同优先级和不同设备的路由。您正在将 /64 路由出 eth0,这可能会给您带来问题。通常,为不同的子网设置不同的 /64 会更容易。

在尝试连接之前,请先验证网络内的 IPv6 连接。客户端和主机是否可以通过 IPv6 相互 ping 通。必须先进行 ping 操作,然后才能进行路由。

一些提供商会专门为您的服务器和其网络之间的路由分配一个 /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

答案2

好的,最终的答案就在我原来的链接里!

当你进行这种路由时,你必须指定“ip add neigh proxy [ip] eth0”位。

答案3

扩展 OP 的自我回答。

问题在于您的数据包可以传输到互联网,但答复却无法返回。

您的托管服务提供商为您提供了一个“在线”地址块(可能是 /64,尽管我们不确定)。您可以使用地址块中的任何地址,但要做到这一点,您的服务器必须响应该地址的邻居发现请求。您的服务器将响应 2001:41d0:2:b353::1 的邻居发现请求,因为它与您的提供商面向的接口相关联,但它不会响应 2001:41d0:2:b353::10 的邻居发现请求。因此,您的托管服务提供商的路由器不知道将客户端发送的数据包的回复发送到哪里。

对此有几种可能的解决方案。

一种方法是使用“ip -6 neigh add proxy 2001:41d0:2:b353::10 eth0”命令明确告诉内核,您希望它响应在 eth0 上收到的针对 2001:41d0:2:b353::10 的邻居发现请求。这是一种有点不靠谱的解决方案,但不幸的是,对于某些提供商来说,这是您唯一的选择。

另一种方法是要求您的托管服务提供商为您提供“路由”块。有了路由块,他们就会将您的服务器视为路由器,而不是对块中的每个地址分别进行邻居发现。

最后一种可能性是使用 ip6tables 进行伪装。这是比第一种方法更具黑客性的选择。

PS openvpn 现在可以直接承载 ipv6 流量,您不再需要在隧道内建立隧道。

相关内容