通过openvpn隧道路由公共ipv6流量

不是

我想做的是通过vpn隧道路由IPv6流量。这样,我应该能够在不支持IPv6的网络中使用IPv6。

我有一个分配了IPv6块的VPS。我想用于openvpn客户端的部分代码块。我想到的范围是2001:db8::111:800:0/112(前缀是匿名的),因为openvpn仅支持/ 64和/ 112作为子网。

通过隧道的IPv6已经可以正常工作了,我可以从客户端ping服务器(2001:db8::111:800:1),以及服务器上的接口(2001:db8::111:100:1002001:db8:216:3dfa:f1d4:81c0)。

但是,当尝试从客户端ping google.com时,我没有响应(ping超时)。为了调试此问题,我使用tcpdump捕获了服务器上的流量,并且可以看到ping数据包发出了,但没有回信。将日志规则添加到ip6tables可以看到相同的信息包,但没有数据包进来。

我使用了一个在线traceroute工具,该工具从服务器获取超时。我还尝试直接在接口上设置ip,这确实导致ip(2001:db8::111:800:1001)可以访问,因此我认为这是路由问题。

我已通过启用了ipv6转发/proc/sys/net/ipv6/conf/all/forwardingip6tables具有允许所有链条使用的策略。

我的问题是,Linux究竟需要什么来接受未分配给接口的ip的数据包并进一步路由它?仅存在的一条路线似乎还不够。

这是我的客户端和服务器的设置。如果需要更多信息,请告知它。

客户

# ip -6 addresses
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
    inet6 2001:db8::111:800:1001/112 scope global 
       valid_lft forever preferred_lft forever

# ip -6 routes
2001:db8::111:800:0/112 dev tun0  proto kernel  metric 256 
2000::/3 dev tun0  metric 1024 

服务器

# ip -6 address
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8:216:3dfa:f1d4:81c0/64 scope global dynamic 
       valid_lft 86254sec preferred_lft 14254sec
    inet6 2001:db8::111:100:100/128 scope global 
       valid_lft forever preferred_lft forever
12: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
    inet6 2001:db8::111:800:1/112 scope global 
       valid_lft forever preferred_lft forever

# ip -6 route
2001:db8::111:100:100 dev eth0  proto kernel  metric 256 
2001:db8::111:800:0/112 dev tun0  proto kernel  metric 256 
2001:db8::/64 dev eth0  proto kernel  metric 256  expires 86194sec
default via fe80::230:48ff:fe94:d6c5 dev eth0  proto ra  metric 1024  expires 1594sec
ysdx

您需要告诉路由器将服务器用于此VPN子网:针对您的问题的正确解决方案是在路由器上为OpenVPN子网添加路由。

如果由于无法触摸路由器而无法执行此操作,则另一种解决方案是为eth0链接上的客户端设置NDP代理

使用VPS时,您可能无法将路由添加到路由器:您可能必须使用第二种解决方案。

为子网添加路由

解决问题的正确方法是告诉路由器,必须通过OpenVPN服务器(这是Linux)路由VPN子网:

ip route add 001:db8::111:800::/112 via 2001:db8::111:100:100

您必须在服务器上启用IPv6转发:

sysctl sys.net.ipv6.conf.all.forwarding=1

NDP代理

似乎路由器已配置为在eth0链路上发送整个IPv6范围:您可以设置NDP代理。

eth0尝试从客户端访问Internet的其余部分时,应该在服务器接口上看到针对OpenVPN子网的NDP请求

您还需要在服务器和NDP代理上启用IPv6转发:

sysctl -w net.ipv6.conf.all.proxy_ndp = 1

子网NDP代理

Linux内核不允许为子网添加NDP代理,而只能为单个IP添加NDP代理。您可以使用守护程序(例如ndppd)为整个子网(从未使用过)设置NDP代理。

每个IP NDP代理

另一个解决方案是可以为VPN子网的每个IPv6添加一个NDP代理:

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done

这应该可以工作,因为OpenVPN子网中的IP数量相对较少。

具有OpenVPN挂钩的动态NDP代理

您应该能够使用OpenVPN挂钩动态添加NDP代理。

在OpenVPN服务器conf中添加钩子:

learn-address /etc/openvpn/learn-address

使用以下learn-address脚本:

#!/bin/sh

action="$1"
addr="$2"

case "$action" in
    add | update)
        ip neigh replace proxy "$addr" dev tun0
        ;;
    delete)
        ip neigh del proxy "$addr" dev tun0
        ;;
esac

看到这个线程

简短答案

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过OpenVPN隧道路由所有流量

来自分类Dev

通过Debian pptpd将IPv6流量路由到Hurricane Electric的IPv6隧道中

来自分类Dev

OpenVPN IPv6通过服务器路由流量

来自分类Dev

配置openvpn客户端以通过Openwrt中的VPN隧道路由所有LAN流量

来自分类Dev

通过Openvpn隧道路由某些客户端

来自分类Dev

ip6tables允许来自OpenVPN的IPv6流量通过我的VPS

来自分类Dev

IPv6在OpenVPN上的路由问题

来自分类Dev

在Linux中从SLIP隧道传输IPv6流量

来自分类Dev

通过SSH隧道访问IPv6地址

来自分类Dev

通过自己的Linux(连接IPv6)服务器的IPv6隧道

来自分类Dev

通过OpenVPN隧道传输特定流量

来自分类Dev

配置Linux路由器以通过OpenVPN隧道转发某些LAN主机的流量和DNS?

来自分类Dev

无法创建多个IPv6隧道

来自分类Dev

Ubuntu 17.10中的ipv6隧道?

来自分类Dev

如何通过IPV6访问路由器?

来自分类Dev

正确路由IPv6

来自分类Dev

通过OpenVPN路由所有流量

来自分类Dev

通过OpenVPN路由所有流量

来自分类Dev

无法通过LAN使用IPv6隧道访问某些网站

来自分类Dev

如何在Go中通过隧道路由http Get?

来自分类Dev

如何通过SSH隧道路由互联网?

来自分类Dev

远程支持:通过ssh隧道路由RDP?

来自分类Dev

如何通过SSH隧道路由互联网?

来自分类Dev

仅通过隧道发送 openvpn ip 专用 ip 流量

来自分类Dev

4in6隧道(通过OpenVPN?)

来自分类Dev

如何通过VPS将带有SSL的DDNS域通过隧道传输到IPv6主机(Raspberry Pi)

来自分类Dev

从ISP级别NAT后面的IPv6隧道

来自分类Dev

Debian IPv6路由

来自分类Dev

通过SSH隧道的OpenVPN