本次搭建 openvpn dual stack 主要是实现以下目标:通过 openvpn 从 vps 上获得一个原生的 ipv6 地址,国外 ipv6 现在越来越普及了,而国内还感觉不到动静,作为技术宅,当然自己动手,丰衣足食啦。
(一) 服务器端的网络设置
本次搭建所用 vps 仅对每一个 server 机器提供一个 /64 的 ipv6 pool ,而且不是可 routed 的 ipv6 block,是通过更为 native 的 SLAAC 方式让每一个 server 机器自动获得 ipv6 address 和 route,对于采用这种网络布局搭建 openvpn server, openvpn wiki 建议两种方式,一种是
另一种正如 openvpn wiki 中说的:
community.openvpn.net/openvpn/wiki/IPv6
不幸的是,本次搭建所用的 vps 的 ipv6 是通过 SLAAC 获得的 ipv6 地址和路由,非常 native,而咨询客服,又无法提供 routed ipv6 block,关键是获取额外 ip 还要花钱哇,鉴于此,摸索出采用如下解决方案:
将通过 SLAAC 获得的 ipv6 block split 为两个 /65,或者其他任意子网,本次实例采用 /112,主机的出口 ipv6 设为 /128,以避免路由问题,正如 ipv6 wiki 中所说:
同时为了解决 ipv6 SLAAC/RA route advertisement 问题,采用 ipv6 在数据链路层的原生提供的 NDP(neighboor discovery protocl)proxy 解决方案;
具体实践步骤:
-
为了避免路由问题,将服务器端主机设为静态地址,且为 /128 后缀,在 yast->System->NetworkSettings 中设定
命令:yast2 network
注意要设置额外的 iPv4 地址和路由,以及 dns 解析服务器,ipv6 路由不需要设定。
2)设置 sysctl 参数
由于 server 上游通过 SLAAC/RA 方式获得 ipv6 路由,因此虽然上述 yast2 中设置的 ipv6 的地址,但没有 ipv6 路由,ipv6 和 internet 是不通的,同时因为打开了 ipv6 forwarding 因此还是要设置 SLAAC 的 RA=2,来保证能正确获取 ipv6 路由,但设置了 RA=2, 同时又会导致机器自动添加 SLAAC 获得的地址,综上,设置如下参数:
net.ipv6.conf.ens3.accept_ra = 2
net.ipv6.conf.ens3.autoconf = 0
上述方案主要参考 suse 中文档中写的:
[suse.com/documentation/sles-12/book_sle_admin/data/sec_basicnet_router.html](https://www.suse.com/documentation/sles-12/book_sle_admin/data/sec_basicnet_router.html)
打开其他 sysctl 设定,主要涉及 forwarding ndp_proxy
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
实际实践中发现在 suse 中的 /etc/sysctl.conf 中设置参数 net.ipv6.conf.all.proxy_ndp = 1 不起作用(可能是自己哪里设置有误),所以在我在 openvpn 的配置文件中中设置:
........
/sbin/ip -6 neigh add proxy $ipv6 dev ens3
/sbin/ip -6 neigh add proxy $ifconfig_ipv6_local dev ens3
/sbin/sysctl net.ipv6.conf.ens3.proxy_ndp=1
(二) 服务器端安装、配置 openvpn
-
具体步骤可参考 openvpn wiki:
en.opensuse.org/SDB:OpenVPN_Installation_and_Setup -
不一样的地方主要是配置文件
服务器端:
其中在上面的两个脚本中实现添加 ipv6 neigh proxy:
# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev ens3
/sbin/ip -6 neigh del proxy $ipv6 dev ens3
(三) 启动服务器端 openvpn,此时应该会打开 tun0 虚拟网卡,同时配置给 tun0 虚拟网卡 ipv4 及 ipv6 地址,如果设置正确的话,可以从 internet 或者其他机器上 ping6 这个地址 ;
(四) 客户端安装、配置、连接 vpn
(五) 服务器端防火墙设定
主要打开以下项及相关的设定的端口:
(六) 由于 windows 不支持 ipv6 的 NDP,采用的是 Radaom 方式获取 ipv6,因此 window 客户端需要做以下两个设置,进入 dos 界面,并且在命令提示符中输入 netsh interface IPV6 set global randomizeidentifiers=disabled 命令,按下回车键,这样 win10 系统用户就可以强制性的使用 ipv6 地址解析协议。将上述命令写入脚本或者采用如下命令,使其永久生效:
Set-NetIPv6Protocol -RandomizeIdentifiers Disabled
Set-NetIPv6Protocol -UseTemporaryAddresses Disabled
(七) !! 前提,由于大家都知道的原因,openvpn 本身是不能稳定连接外面网的,请使用其他相关软件提供的 socks5 代理,并打开 udp 转发,在 openvpn 的配置文件中设置 socks proxy 即可。