Wherelse Blog

Openwrt的IPV6 NAT的实现

2020-05-17 · 4 min read
网络

Openwrt's implementation of IPV6 NAT

身处校园网环境,只能通过 PPPOE 获取到一个 /64 的 IPV6 地址,如果想使用路由器则只能通过 IPV6 NAT 或者 relay 中继的方式获得地址。relay方式可以获得公网地址,但是我尝试了很多次,即时获得了公网地址,也不能成功的上网,不知问题出在何处,转而继续研究 IPV6 NAT。

IPV6 NAT 其实并不推荐,因为路由下的设备就不能获得公网的 IPV6 地址了,就失去了使用 IPV6 的一大意义,这个只推荐在校园网环境下折中这样使用了,公网家庭宽带条件下还是推荐使用穿透模式或者直接通过 DHCPV6 直接分发公网 IPV6 地址。

基本配置

我这里使用的 Openwrt 的版本是 Lienol 的 19.07 ,下面的方法在我使用的这个镜像中成功实现。

  1. 网络->接口 中, 设置全局网络选项中的 IPv6 ULA 前缀 , 将其改为:dd00:101:101::/48
  2. 网络->接口->LAN 中,设置 DHCP 服务器,将路由器通告服务、DHCPv6 服务选为服务器模式,NDP 代理选为已禁用,DHCPv6 模式选为无状态+有状态,同时勾选 总是通过默认路由
  3. 网络->防火墙->自定义规则 中添加以下内容:
WAN6=pppoe-wan
LAN=br-lan
ip6tables -t nat -A POSTROUTING -o $WAN6 -j MASQUERADE
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -i $LAN -j ACCEPT

WAN6=pppoe-wan 这里需要根据自己路由器的实际情况进行修改,如果是 PPPOE 拨号,则一般为 pppoe-wan 。

一部分情况下,NAT 就已经可以使用了,但是有时因为路由表的原因还是会导致无法上网,需要进行进一步的处理。这里开始需要使用 SSH 或者网页的 TTYD 终端连接到路由器。

进一步配置

  • 在终端中输入:ip -6 route, 查看自己的 IPV6 网关,在 PPPOE 拨号情况下正常的网关应该类似于:
default via fe80::96db:daff:fe3e:8fcf dev pppoe-wan proto ra metric 1024  ······

但是可能会存在错误的网关,如:

default from 2001:xxx:xxxx:xxxx::/64 via fe80::96db:daff:fe3e:8fcf dev        pppoe-wan proto static metric 512 pref medium

这些会导致路由可以正常使用 IPV6 而通过 NAT 分配的设备无法正常使用 IPV6,我们需要使用脚本将错误的网关进行更改。

  • 添加网关修改脚本。在终端中输入: vi /etc/hotplug.d/iface/99-ipv6, 进入编辑界面,将以下内容复制进去:
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
iface=wan6
[ -z "$iface" -o "$INTERFACE" = "$iface" ] || exit 0

# Bad route 1
bad=$(ip -6 route show default | grep -v "pppoe-wan" | sed 's/expire.*//')
logger -t IPv6 "Old IPv6 route w/o PPPoE: $bad"
if [ "x$bad" != "x" ]; then
  logger -t IPv6 "Remove old IPv6 route..."
	status=$(ip -6 route delete $bad 2>&1)
	logger -t IPv6 "Done: $status"
fi

# Bad route 2
good=$(ip -6 route show default | grep "pppoe-wan" | sed 's/from [^ ]* //' | head -n1)
logger -t IPv6 "Good route is: $good"
logger -t IPv6 "Add good IPv6 route..."
status=$(ip -6 route add $good 2>&1)
logger -t IPv6 "Done: $status"

使用 :wq 保存退出。

  • 然后为脚本赋予可执行权限:
chmod +x /etc/hotplug.d/iface/99-ipv6
  • 重启路由,完成配置。

参考文章

https://gitlab.com/XDOSC/WIFI/-/wikis/tips/ipv-6-router
https://www.jianshu.com/p/eb07eaac6167