OpenWrt 内网下发 IPv6

2018 年 4 月,工业和信息化部发布了关于贯彻落实《推进互联网协议第六版 (IPv6) 规模部署行动计划》的通知,大力推广下一代互联网技术 IPv6。

时至今日,高校教育网以及各大运营商已经基本支持了 IPv6 地址的分配。然而绝大多数家庭的路由器还不能支持自动下发,因此并没有享受到下一代互联网的快感。

这里主要介绍使用 OpenWrt/LEDE 来解决内网设备分配 IPv6 的问题。

想要让路由器下的设备获得 IPv6 地址通常有三种方式:relay(中继)、NAT(地址转换)、Passthrough(穿透)。下面分三个部分谈谈具体的配置方案。

中继模式(relay)

OpenWrt 早在 15.05 就内置了 relay 协议,具体是通过 odhcpd 来实现的。

这种方案可以让子网设备分到公网 IPv6 的地址,是最为科学的,然而 odhcpd 的实现有很多 bug,在实际使用中有时候会掉线,需要重启服务才能解决,因此在部分设备上体验不佳。

具体操作如下

进入路由器终端

$ ssh root@192.168.1.1

编辑 dhcp 配置文件,修改如下

$ vi /etc/config/dhcp

config dhcp 'lan'
    option interface 'lan'
    option start '100'
    option limit '150'
    option leasetime '12h'
    option ra 'relay'
    option ndp 'relay'
    option dhcpv6 'relay'
    option ra_management '1'

config dhcp 'wan'
    option interface 'wan'
    option ignore '1'

config dhcp 'wan6'
    option interface 'wan'
    option ra 'relay'
    option ndp 'relay'
    option dhcpv6 'relay'
    option master '1'

编辑 network 文件,将地址第一个字母 f 修改为 d

$ vi /etc/config/network

config globals 'globals'
    option ula_prefix 'dd53:abcd:abcd::/48'

最后重启即可

穿透模式(Passthrough)

Passthrough 的原理是将内外网进行桥接,然后对 IPv4 流量采用 NAT 方式进行转发,稳定性相当好,唯一的缺点就是路由器自身会失去 IPv6 的访问,因此如果想在路由器上做离线下载等功能就会非常麻烦。

配置如下

安装 ebtables 和 kmod-ebtables-ipv6 模块

$ opkg update 
$ opkg install ebtables kmod-ebtables-ipv6

设置 IPv4 转发

$ interface=`ip -6 route | grep "default from" | awk '{print $7}'` 
$ ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i $interface 

内外网桥接

$ brctl addif br-lan $interface

杀死 odhcpd

$ /etc/init.d/odhcpd stop 
$ /etc/init.d/odhcpd disable 

点击 LAN 接口的 edit 按钮进入设置,在 IPv6 Settings 选项卡中勾上 Always announce default router

做完这些步骤,稍等一会儿子网设备就会分到相应的公网 IPv6 地址了

IPv6-Passthrough
系统设置 – 网络

地址转换(NAT)

IPv6 的设计之初是没有 NAT(网络地址转换)这种东西的, 但 Linux 内核从 3.7 版本开始实现了 IPv6 的 NAT。因此这种方案实际上是「歪门邪道」,更要命的是路由器下的设备将会无法获得公网端口,BT/PT 的上传速度受到了很大影响。

Padavan 的 Linux 内核原生不支持 NAT6,不到万不得已,尽量选用其它两种方案

具体操作如下

  1. 进入软件(soft)配置界面安装 ip6tables 和 kmod-ipt-nat6 模块
  2. 打开网络(Network)菜单下的接口(Interfaces),把最下面的 IPv6 ULA-Prefix 改为 2fff::/64
  3. 点击 LAN 接口的 edit 按钮进入设置,在 IPv6 Settings 选项卡中勾上 Always announce default router.
  4. 进入启动项管理 ,把以下命令添加入启动配置(在 exit 0 前),实现开机启动,最后重启即可。
res=`ip -6 route | grep "default from"`
gateway=`echo $res | awk '{print $5}'`
interface=`echo $res | awk '{print $7}'`

if [ "$ACTION" = ifup ]; then
    ip -6 r add default via $gateway dev $interface
    if !(ip6tables-save -t nat | grep -q "v6NAT"); then
        ip6tables -t nat -A POSTROUTING -o $interface -m comment --comment "v6NAT" -j MASQUERADE
    fi
else
    ip6tables -t nat -D POSTROUTING -o $interface -m comment --comment "v6NAT" -j MASQUERADE
    ip -6 r del default via $gateway dev $interface
fi

端口映射

以上方案除了 NAT 方案外,可以开启 UPnP 进行高位端口映射,优化 BT/PT 体验。

方案如下

  1. 安装 miniupnpd 和 luci-app-upnp 两个软件包
  2. 在 services 下的 upnp 面板中开启即可
uTorrent
uTorrent

测试机型

方案测试通过机型,不保证其它版本可用,欢迎反馈。

ModelVersion
NETGEAR WNDR4300OpenWrt 18.06.2
NETGEAR WNDR4300LEDE 17.01.4
Phicomm k3OpenWrt snapshots
psg1218(K2)OpenWrt 18.06.2
psg1218(K2)LEDE 17.01.3
Hiwifi HC5661ALEDE snapshots
Newifi mini Y1LEDE 17.01.3

参考资料

上一篇
下一篇