记录下我为openwrt的wireguard设置NAT6(使用路由进行IPV6 NAT)的过程
为什么要使用NAT6呢? IPV6的优点和好处不就是地址数量多到用不完,所以可以让每一个设备都拥有属于他的全球唯一IPV6地址吗?
这是因为,出于安全考虑,某些设备需要躲在NAT后面安全的访问互联网,而且对于wireguard这种无法进行IPV6 PD/DHCP分配的协议来说,亦或者是其他的VPN (例如 openvpn) 自动分配的IPV6地址是临时IPV6地址,需要NAT6才能让下级客户端拥有访问IPV6网络的能力.
亦或者你的路由可怜的只能拿到/128的IPV6地址,为了让路由器下的设备都能访问IPV6网站,不得不使用NAT6了
基本配置wireguard不再赘述
决定wireguard的网段
我这里使用
IPV4: 10.3.3.1 /24 IPV6: dd01:ffa1::1 / 64
这里的IPV4和IPV6都是内部地址,如果想要外网访问内部地址就需要在网关处做NAT,而想要内部地址访问外网也需要网关NAT
而wireguard的NAT能力由操作系统提供, 例如我在 openwrt (Linux Base)上搭建,就需要用到iptables 和 ip6tables进行NAT配置
打开系统的数据包转发能力
往系统配置文件 /etc/sysctl.conf 内加入 net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1
分别打开IPV4和IPV6的内核包转发,保存文件后使用以下命令生效
# sysctl -p /etc/sysctl.conf
### 打开iptables的对应端口数据包转发
#### 这里假设,wg0为wireguard端口,而eth2为外网连接出口
iptables -I FORWARD -i wg0 -o eth2 -j ACCEPT
ip6tables -I FORWARD -i wg0 -o eth2 -j ACCEPT
现在,由于netfilter/iptables是一个无状态的防火墙,我们需要让 iptables 允许已建立的连接通过。要做到这点,我们要运行下面的命令。
iptables -A FORWARD -i eth2 -o wg0 -m state --state ESTABLISHED,RELATED -j ACCEPT
我不确定这一句是否有用,这是网上某些帖子说的,我自己没有加这一句
最后,添加自动源地址转换条目
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
为了保险起见,我使用的是只对指定的源IP的数据包进行自动转发
iptables -t nat -A POSTROUTING -s ${wireguard_ipv4_localnet} -o eth2 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -s ${wireguard_ipv6_localnet} -o eth2 -j MASQUERADE
警告:
如果不指定-o的话,就允许其数据包根据网关路由表自动选择合适的接口转发数据包,此举可能造成一定的危险,造成内网随意互访,谨慎使用
### 此时还是不能正常访问外网的话
#### 如果尝试ping网关的wireguard地址,IPV4 /IPV6均可以ping通,那就怀疑是不是网关的IPV4/ IPV6路由表未设置完成
ip -6 route add default from ${wireguard_ipv6_localnet} dev ${out_dev}
### 一般到这里,wireguard客户端们就可以正常的使用网络了,包括IPV4和IPV6