MENU

记一次在OpenWrt 进行NAT66的经历

IETF 一直不推荐人们使用 NAT66(NAT 这个词在 IPv6 上已经被占用)。这么做并非无中生有,多年以来,由于 NAT 网关的存在,本来应该为无状态(stateless)、无连接(connectionless)的 IP 协议已经变成了一种临时的“有状态(stateful)”、面向连接(connection-oriented)的协议,这主要是因为大量的设备需要接入互联网而不得已为之。

这种地址转换能给我们带来一种虚假的安全感。我已经听过许多人表达过这样一种看法:“从内部网络安全角度来看,NAT 是必不可少的一环(然而事实并非如此)”。

IPv6 地址空间非常庞大,运营商可以给客户分配足够多的/64 地址。但是,这可是学校.

由于学校的 IPv6 下发只有一个/128,且对应客户端强绑定 mac 地址,如 "2001:xxx:xxx:xxxx:macAddress",因此,不得不在路由器下使用 nat66 使子设备接入教育网.

我们的路由器需要准备好:

设置一个内网 IPv6 地址池

安装 nat6 的 openwrt 插件和 ip6tables,软件包名是 kmod-ip6tables 和 kmod-ipt-nat6
编辑/etc/config/network,在 wan 配置中加入你的内网 IPv6 地址池.

config interface ‘lan’

option ip6addr $yourIPv6Pool

设置内核开启 IPv6 的转发. cat /proc/sys/net/ipv6/conf/all/forwarding 并确保结果是 1.

echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
sysctl -a

编辑防火墙规则 "/etc/config/firewall",需要注意的是:这里 fd23:d50c:491d::/48 是我的路由器本地 IPv6 地址.eth0.2 则是 wan6 网口.

# allow icmp on ipv6
ip6tables -I INPUT -p ipv6-icmp -j ACCEPT
ip6tables -I OUTPUT -p ipv6-icmp -j ACCEPT
ip6tables -I FORWARD -p ipv6-icmp -j ACCEPT
# allow loopback
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT
#allow lan forwarding
ip6tables -A FORWARD -i eth0.2 -j ACCEPT
ip6tables -A OUTPUT -o eth0.2 -j ACCEPT
# allow link-local
ip6tables -A INPUT -s fe80::/10 -j ACCEPT
ip6tables -A INPUT -s fe80::/10 -j ACCEPT
# allow multicast
ip6tables -A INPUT -s ff00::/8 -j ACCEPT
ip6tables -A OUTPUT -s ff00::/8 -j ACCEPT
# allow forwarding
ip6tables -A FORWARD -i eth0.2 -j ACCEPT
ip6tables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
#Add ipv6-ipv6 NAT chain
ip6tables -t nat -I POSTROUTING -s  fd23:d50c:491d::/48 -o eth0.2 -j MASQUERADE

确认默认路由指向 IPv6 网口,ip -6 route
如果没有或者是出现 route default via globalipv6address dev youripv6interface,你需要将这条删掉并重新添加 ip route add ::/0 dev youripv6address 以匹配 ip6tables 的 nat 链.
重启 network 和 iptables.

/etc/init.d/network restart
/etc/init.d/firewall restart

系统启动时候,创建一个开机启动项,自动添加默认 route vim /etc/init.d/autoroute

#!/bin/sh /etc/rc.common
#/init.d/autoroute

START=99

start(){
    ip -6 route add ::/0 dev eth0.2
    echo "autoRoute is startd"
}

stop()
{
    ip -6 route del ::/0 dev eth0.2
    echo "autoRoute is stopd"
}

然后添加 service enable autoroute 添加进开机启动项.

最后,测试你的 IPv6 链接.

Last Modified: March 4, 2022