最近在折腾 fullcone NAT,发现 linux 内核并没有支持 fullcone NAT,需要加载内核模块和 iptable 插件。
内核模块使用的是这个 fork 的版本。里面自带了 dkms 脚本,在 PVE 内 clone 之后运行直接 dkms-install.sh 即可(当然需要预先安装 dkms 依赖以及下载内核头文件)。
然后需要在 openwrt 内给 iptable 加上 FULLCONENAT 的支持。目前查到的版本都是 openwrt 下包括内核模块和 iptable mod 的。由于我们用 lxc 的 openwrt 所以内核模块并不需要在 openwrt 下安装,所以我 fork 了一个只有 iptable extension 的版本,并且针对上面的内核模块适配了一下(就是添加 ipv6 的兼容而已)。放到 openwrt 的 SDK 里面编译一下非常快就能完成了。然后直接安装之后 openwrt 的 iptable 就能支持 FULLCONENAT 了。
安装好之后,openwrt 下防火墙的自定义规则里面:
iptables -t nat -A PREROUTING -i pppoe-wan -j FULLCONENAT
iptables -t nat -A POSTROUTING -o pppoe-wan -j FULLCONENAT
这里的 pppoe-wan 是我的 wan 口。
使用 NatTypeTester 测试,选择 RFC3489,服务器选 stun.miwifi.com,点击测试之后能看到是 Full Cone。(可能需要关闭 windows 防火墙)