校园网里的IPv6只能设成自动获取ip,且分配到的就是一个单独的IP(前缀长度128),只能给一个设备用,无法经路由器再次下发。华硕路由器(TUF AX5400v2,刷了官改固件)的IPv6设置里只有几个选项:native,静态地址,passthrough,……(后面几个不相关)。首先排除静态地址。经测试发现 passthrough 下只有路由器本身能获得ipv6地址,但下面的局域网设备没有ipv6地址;而如果用 native,若开启 DHCP-PD,则结果和 passthrough 类似,但如果关闭 DHCP-PD,手动指定局域网网段,比如 fd00::1/64,则路由器可以获取到 ipv6 地址,局域网内设备也能活的到 fd00 开头的本地地址,但是局域网设备无法通过 ipv6 连上外网。此时,内网外网本身都已经有 ipv6 支持了,问题出在路进行转发时没有进行nat!此时只需执行如下命令后内网就可以通过 ipv6 上网了!其中 eth4
是 WAN 口。
ip6tables -t nat -A POSTROUTING -o eth4 -j MASQUERADE
一、安装 opkg
先说个不直接相关的事。一开始想通过 tcpdump 查看下流量,但系统上没有,于是想到通过 opkg 安装。最初参考 https://blog.csdn.net/u010051887/article/details/103888902 进行安装,结果遇到问题,opkg 需要 /opt/var 目录,然而 /opt 是只读系统无法创建 var。最后如下解决的,首先 mkdir /jffs/opt
,然后 cp -ra /opt/scripts /jffs/opt
把 /opt 下原有的一个目录考过去以免被屏蔽,最后通过 mount --bind /jffs/opt /opt
绑定一下,这回 /opt 就可以写了。在 /opt 下创建 bin, etc, lib, var 等目录。然后下载安装脚本 http://qnapware.zyxmon.org/binaries-armv7/installer/entware_install_arm.sh 进行安装即可。然后就可以通过 opkg install tcpdump 安装 tcpdump 了。
二、开机启动
前面对 ip6tables 的设置重启系统或重启防火墙后就会消失,为此需让它开机后自动运行。通过查看路由器界面中【系统记录=>一般记录文件】里的日志发现重启防火墙后有一条执行自定义脚本 /jffs/scripts/nat-start
的记录。于是想到把命令加入改脚本即可。通过尝试,上述 ip6tables -t nat ...
命令加进来确实有效,ipv6 可以正常工作了。但是我发现同时为打开 ipv6 的 ping 而加入的 ip6tables -I ICMP_V6 -j ACCEPT
命令却没有生效!原来是因为执行这个脚本时对 ICMP_V6
链的设置操作还没有执行,我的命令被后来的命令覆盖了从而无效。于是想到延迟几秒再执行我的命令,果然有效!最终,在 /jffs/scripts/nat-start
中加了一句
/jffs/scripts/myjob &
而 myjob 脚本内容为
#!/bin/sh
ip6tables -t nat -A POSTROUTING -o eth4 -j MASQUERADE
mount --bind /jffs/opt /opt
sleep 5
ip6tables -I ICMP_V6 -j ACCEPT # allow ping
三、端口映射
路由器界面上的端口映射只对 ipv4 有效。而防火墙里的 ipv6 设置中添加的条目则只是更改 FORWARD 链,即转发设置,但并不会做 nat 设置,所以还是无法访问。转发和 nat 必须同时正确设置才行。这里假设没有用界面上的防火墙添加条目,直接用命令如果要设置到比如 fd00::1234:abcd
的 22 端口的映射,外网端口 3333,那么可以执行如下命令
# 访问端口 3333 的链接做地址转换
ip6tables -t nat -A PREROUTING -p tcp -m tcp --dport 3333 -j DNAT --to-destination [fd00::1234:abcd]:22
# 允许到 fd00::1234:abcd 的转发
ip6tables -I FORWARD -d fd00::1234:abcd -p tcp -m tcp --dport 22 -j ACCEPT