MENU

记一次在OpenWrt 进行NAT66的经历

October 3, 2020 •

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-ip6tableskmod-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链接.