我如何使用tap设备来设置IPv4和IPv6的OpenVPN?

我设法使用tap0来设置OpenVPN的全部IPv4连接。 现在我想为IPv6做同样的事情。

地址和networking设置(注意我的真实前缀被2001:db8replace):

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。

我可以通过OpenVPN ping到和从我的服务器,而不是其他机器(例如, ipv6.google.com )。

net.ipv6.conf.all.forwarding设置为1 ,我试过也禁用net.ipv6.conf.all.accept_ra ,没有运气。

在服务器和客户端都使用tcpdump ,我可以看到数据包实际上是通过tap0传输到eth0的。 路由器(2001:db8 :: 1)在接收到ICMP6回显请求后,向客户端发送邻居请求(2001:db8 :: 100:abc:2)给eth0。 服务器不响应该请求,导致ICMP6回声请求不被路由到目的地。

我怎样才能使这个IPv6连接工作?

蒂莫西·鲍德温斯(Timothy Baldwins)的回答让我走上了正轨,虽然答案相当含糊。 IPv6邻居通告/请求就像IPv6的ARP一样。 它被用来“看”networking上的其他机器。 路由器发送邻居请求,机器(服务器或客户端)应该在邻居请求上应答邻居通告。

即使将net.ipv6.conf.all.forwarding设置为1 ,邻居通告和请求也不会被转发。 为了使eth0转发邻居广告和请求,eth0应该被设置为tap0后面的客户端的IPv6地址的代理,并且为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在重复执行命令时也不会显示错误消息。 我也不确定如果“邻居代理”的作品,它不会给出错误消息, C源对我来说并不真正有意义。


因为我不想手动做所有的事情,所以我创build了一个脚本来完成我的工作。

服务器configuration

IPv6地址基于IPv4部分(10.8.0.1中的1 )。 前缀和networking掩码存储在/etc/openvpn/variables

接下来的步骤是通过本地IPv4连接来设置OpenVPNencryption的IPv4 / IPv6连接到互联网。 RSA密钥和tls-auth用于authentication和MITM预防。

/etc/openvpn/variables包含用于up脚本(在启动时运行,在创buildtap0设备后运行)和客户端连接脚本(在客户端validation后运行)的variables。

 # 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地址添加到eth0代理来确保IPv6路由正确。 由于client-connect是在OpenVPN切换到User设置指定的User之后调用的,因此需要User sudo为脚本提供足够的权限才能以root身份运行。 当然,variables在使用之前应该被检查,数字应该在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运行脚本,同时保留包含远程networkingIPv4地址的$ifconfig_pool_remote_ip 。 通过执行sudo visudo将下一行添加到sudoers文件并追加:

 Defaults:vpn env_keep=ifconfig_pool_remote_ip vpn ALL=NOPASSWD: /etc/openvpn/server-clientconnect.sh 

/etc/openvpn/server-up.sh eth0上启用IPv4,IPv6转发(eth0 + tap0不工作,实际上必须all )和邻居代理。 它也将网关地址添加到服务器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 

最后,/etc/openvpn/ /etc/openvpn/internet.conf的OpenVPNconfiguration文件:

 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 

在客户端configuration

/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.keyca.key是来自服务器的相同文件。 home.keyhome.crt是在服务器上创build的文件。

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/上的指南非常有用&#xFF0C; OpenVPN手册页对于各种设置的信息非常有用。

上游路由器configuration为2001:db8 :: 100:abc:2,直接连接上,设置net.ipv6.conf.eth0.proxy_ndp = 1假装它是。