openSUSE Tumbleweed Dual Stack openvpn搭建实践 迈入ipv6

本次搭建 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 解决方案;

具体实践步骤:

  1. 为了避免路由问题,将服务器端主机设为静态地址,且为 /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

  1. 具体步骤可参考 openvpn wiki:
    en.opensuse.org/SDB:OpenVPN_Installation_and_Setup

  2. 不一样的地方主要是配置文件
    服务器端:

其中在上面的两个脚本中实现添加 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 即可。

我以前考虑过自己在 VPS 上能不能搭一个 IPv6 Tunnel, 后来发现我的路由器不支持 IPv6, 再后来杭州电信提供了原生 IPv6…
另外这种搞法我理解不局限于 OpenVPN, 其他的 VPN 协议应该都可以的说

杭州电信都有提供原生 ipv6 了啦?上海这边好像都没有动静!对的,应该其他味品恩也可以的,不过我对 openvpn 比较熟悉,所以就以此为案例说明啦,其实配置到不麻烦,关键是现在 vps 很少提供小于 /64 的 ipv6,而大于 /64 子网分配 ipv6 则会有很多问题,这篇文章主要也是基于这个问题进行一些实践性说明!