Skip to content

ipv6

Problems

不少校园网采用DHCPv6分配IPv6地址,并且只分配一个/128的地址,所以我们需要解决的问题有两个:

  • 让路由器下的(包含Unraid服务器在内的)多个设备都获得IPv6。
  • 让Unraid服务器内的多个Docker容器都获得IPv6。

Solutions

实际上,第二个问题可以通过使用容器Custom: br0的网络类型来转换成第一个问题,即允许容器直接向路由器请求IPv6地址。但第一个问题似乎只有NAT66能够比较简单地解决。

这里使用OpenWRT路由器为例。

  • 通过opkg安装nat6插件:kmod-ipt-nat6 kmod-nf-nat6
  • 在路由器终端执行:

    echo "net.ipv6.conf.default.accept_ra=2" >> /etc/sysctl.conf
    echo "net.ipv6.conf.all.accept_ra=2" >> /etc/sysctl.conf
    
    uci set network.globals.ula_prefix="$(uci get network.globals.ula_prefix | sed 's/^./d/')"
    uci commit network
    uci set dhcp.lan.ra_default='1'
    uci commit dhcp
    
    touch /etc/hotplug.d/iface/99-ipv6
    
    cat > /etc/hotplug.d/iface/99-ipv6 << EOF
    #!/bin/sh
    [ "\$ACTION" = ifup ] || exit 0
    
    iface_dhcp=wan # modify based on your own internet face name!
    iface_route=wan # modify based on your own internet face name!
    
    [ -z "\$iface_dhcp" -o "\$INTERFACE" = "\$iface_dhcp" ] || exit 0
    
    ip6tables -t nat -I POSTROUTING -s \`uci get network.globals.ula_prefix\` -j MASQUERADE
    gw=\$(ip -6 route show default | grep \$iface_route | sed 's/from [^ ]* //' | head -n1)
    status=\$(ip -6 route add \$gw 2>&1)
    logger -t IPv6 "Done: \$status"
    EOF
    
    /etc/init.d/network restart
    
  • 等待网络重启完成。

Unraid方面需要在设置中更改网络类型为IPv4+IPv6,重启Unraid服务器即可看到分配到的ipv6地址,此时设置中的路由表下应有ipv4和ipv6各三条设置,或者通过终端检查:

# should have a line like `inet6 xxx scope global xxx`
ip -6 addr

对于需要ipv6的Docker应用,需要更改其网络类型为Custom: br0,重启后打开对应容器的终端可以用同上的方法检测是否获得了ipv6地址。

References

  • https://kjzjj.com/index.php/2021/09/22/openwrt-ipv6-nat/
  • https://blog.191110.xyz/article/000002/.html
  • https://post.smzdm.com/p/alpz5z98/
  • https://post.smzdm.com/p/awk588rm/
Back to top