本文以最差网络环境进行设置, 如果网络条件够好可以降低一部分设备要求, 同时可以减少一些不必要的设置.
前置条件:
2条宽带均支持ipv6, 且至少其中一条宽带可以访问到另一条宽带ipv6的至少2个udp端口
用到的设备:
2台tp-link高版本的er系列路由器(本文以一台er3200g v1.0和一台er6110g v4.0为例)
2台支持ipv6的小主机(本文以刷了armbian系统的机顶盒为例)
设备连接和部分配置图:

开始配置
配置er6110g (响应方, 至少有2个udp端口能被访问到一方,假如端口为8001和8002)
-
创建vlan
image.png
2.配置nat

3.配置IPSec



配置er6110g下的Linux小主机
配置端口转发: PortForward u :8001+:8002 192.168.111.1:500+192.168.111.1:4500
PortForward 见前面的文章, 可以创建一个host网络的docker长期运行
配置er3200g下的Linux小主机
配置端口转发: PortForward u :500+:4500 [2408::6110]:8001+[2408::6110]:8002
假设[2408::6110]为er6110g的wan口ip
PortForward 见前面的文章, 可以创建一个host网络的docker长期运行
配置er3200g (发起方)
-
创建vlan
image.png -
配置IPSec
image.png


问题排查



优化
如果被访问方可以获取到 ipv6子网前缀 就不需要再配置nat66了, 直接给它下面的Linux设备分配一个公网ipv6, 然后让发起方直接连拥有公网ipv6的armbian设备即可. 然后再配合ddns, 直接通过域名访问.
在通过ipv6进行数据转发时 建议通过u2t + t2u进行转发, 同时配置转发设备
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf && sysctl -p
(armbian默认为bbr)
原因有2:
a. 一台设备一般可以分配多个ipv6, 在转发udp数据时可能存在响应方不采用收到数据的ipv6地址去响应数据(前面文章有说到过)
b. 在用网高峰期可能会存在单线程tcp传输数据慢的问题(尤其是跨运营商, 这个问题困扰了我很久. 即使是公网ipv6直连也存在这样的问题, 和IPSec无关). 因为大多数设备的 tcp_congestion_control 是CUBIC, 在高延迟 高丢包率网络中速度会非常慢(tcp单线程40兆上行只能跑到5兆左右). 采用tcp传数据后, 用户设备的丢包率就会变为0 , 压力全部给到了ipv6数据转发设备, ipv6数据转发设备又采用的bbr 速率会有非常明显的提升(单线程几乎能跑慢带宽).


