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


13

我正在尝试通过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/forwarding。ip6tables具有允许所有链条使用的策略。

我的问题是,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

可能您POSTROUTING ... MASQUERADEnat表中寻找。但是我不确定我是否完全理解。您是否在尝试隧道IPv6流量?如果是,您是否设置了相应的设施?-p ipv6IPv4(!)规则中是否允许数据包?
0xC0000022L 2014年

您是否有路由器的IP配置(在eth0上)?您控制路由器吗?(您可以添加路线吗?)
ysdx 2014年

尝试使用iptables原始表TRACE目标(此处可能不多)ip neighbourip route get。另外,请指定是ping google.ca
pilona

ping google.com或goole.com。
totti 2014年

@totti google.com,是一个错字
IKKE

Answers:


12

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

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

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

为子网添加路由

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

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

1
谢谢,我会调查一下。我现在明白了这个问题。ipsidixit.net/2010/03/24/239包含有关此内容的更多详细信息。
Ikke 2014年

我有来自客户端的IP作为邻居代理。我已启用sys.net.ipv6.conf.all.proxy_ndp,但仍无法ping google.com。当我检查服务器时,我在eth0上看到ndp请求包,但是没有任何广告出去。
Ikke 2014年

1
安装并设置npd6之后,它突然可以工作了!
Ikke 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.