《联通宽带开启IPv6》中曾想用tplink硬路由负责ipv4拨号,ipv6设为桥模式,然后用软路由进行ipv6拨号负责ipv6路由。然而那里用的软路由是虚拟机中的,在物理上它们处于tplink之后且无法改变,这或许是它们无法拨号成功的原因,因为ipv6不能单独拨号必须与v4同时,或者说v4先拨通然后借用v4的通道再获取ipv6连接。然而虚拟机的ipv4在tplink之下已经联网,无法再拨通。
之前用下载宝刷了 openwrt 做单臂软路由,那时是把软路由当做主路由,负责 ipv4/v6 同时拨号,tplink 在软路由之后做二级路由。这个方案上网没有任何问题,问题出在稳定性上。软路由修改配置或做各种尝试时,很有可能被整断网或重启,那么此时家里就会临时断网,需等软路由重启之后才会恢复。究其原因就在于软路由是网络的唯一入口,它断了网就断了。于是回想起之前ipv4和ipv6分开拨号的方案,如果能实现,即使软路由断掉或重启并不会影响 tplink 的 Ipv4 网络,至少不会断网,增加了可靠性;此时,即使软路由坏掉了,也只是 ipv6 不能用了,但 ipv4 一切正常。问题就在于这个方案可行吗?
答案是可行的!因为软路由、tplink、光猫(桥接)接到同一交换机上,软路由直接与运营商网络相连,这是与之前虚拟机方案的最本质的区别。此时把 tplink 改成拨号模式上网,但只对 ipv4 拨号, ipv6 要设为桥模式。然后再在软路由上拨号,注意依然是 ipv4/v6 同时拨号而不是只拨 ipv6。有人问了,这不是多拨吗?是的没错,这就是多拨,所以需要运行商支持多拨才行!不过,也不要指望着用多拨提高带宽,我试了虽然可以多拨成功,但是下行带宽不会叠加,两路总带宽还是你买的的那个数。不过无所谓,本来我多拨为的也不是提高带宽,为的仅是把 ipv4 和 ipv6 分开。
既然软路由只负责 ipv6 部分,那么它拨到的 ipv4 IP 对我也就没什么用,其下面也不接局域网,所以最好把 lan 的 DHCP(v4)服务器关掉,但 DHCPv6 必须要开启。原则上之前的配置基本不怎么用动就可以用。但是,由于网络拓扑变了,tplink下的ipv4局域内的设备无法再通过 ipv4 连接软路由了,我就突发奇想给软路由再增加一个虚拟网卡,设成tplink局域的192.168.0.x网段,然后用一根网线把tplink的lan口连到交换机上,心想这样软路由不就也加入了192.168.0.x网段了吗?可事实确实,加了这个线后网络就不稳定了,各种掉线,看来是形成了回路网络抽风了,因为这相当于我把tplink的lan口和wan口连了起来!看来这么干是不行的。那在局域网内如何访问软路由呢?答案是,ipv4不行那就用ipv6!ipv4不行是因为不在一个子网,但ipv6却是在一个子网,而且这是必须的,因为我们就是用这个软路由负责局域网的ipv6上网,所以ipv6必然得是通的才行。保留自定义的全局前缀 fd00::/64
则软路由的局域网ipv6地址就是 fd00::1
,那么便可在浏览器中输入 [fd00::1]
来访问!此时光猫lan口ipv6本地地址也可访问,可以通过 [fe80::1]
来访问光猫控制页面。总之,这么整以后,软路由和局域网内设备互相访问只能通过ipv6了。唯一能通过ipv4访问的办法就是那跟网线一头接交换机上,另一头接电脑,自动获取ip,这时光猫的DHCP服务器会分配一个192.168.1.x的IP,然后尝试 192.168.1.y 来访问软路由, y 可能是 2、3、4 等,试个几次就出来了。
弃用 nat6 改用直连模式
1、性能问题
经测试,发现 nat6 性能不行,严重影响带宽。当然也可以说是我的设备(下载宝)硬件性能不行,以致 nat6 模式影响了带宽。用 iperf3 测速,单位=>经wrt(nat6)=> nas 最高带宽也就 150Mbps左右,而如果去掉 nat6 改为直连,则带宽能达到 500+Mbps,几乎是跑慢了我的下行带宽!看来不用 nat6 的情况下,下载宝做软路由还是可以的。如果 iperf3 -s 直接运行在软路由上,前后测速结果没什么区别,都在200Mbps左右,很显然即使之前nat6模式时对于软路由本身也是直连并没有做nat。这说明是软路由的cpu以及软件本身的性能不行导致速度上不去。鉴于此,当然要取消 nat6 模式换回直连模式。
设成直连模式以后,发现只要不是到软路由本身的流量都是根本不进入软路由的。比如外网到 nas 的流量,假设有 500Mbps,软路由上的【状态=>实时信息=>流量】中除了 eth0 处能看到进出都是 500Mbps 以外, 其他接口都没有这 500Mbps 的流量。这说明网络数据根本没进 wrt 没用 cpu 处理,完全在网卡处就被网卡处理转发走了,所以这样速度很快,cpu 的性能根本无法影响速度。但如果是外网直接到软路由的流量,则可以看出除了 eth0v1 和 eth0v2 没有流量外,其他设备都有流量,数据切切实实的进入了 wrt,被 cpu 处理,自然受 cpu 性能影响而降低了速度。
2、相关设置
最主要的几点如下:
之前 nat6 模式时各个接口设置中都取消了【委托IPv6前缀】,此时 lan 和 wan_6 中的要选上(wan的可以保持不变),而且把前缀过滤取消(之前设置只允许fd00::/64的本地前缀),否则局域网设备就无法获取公网ip。IPv6分配长度还是都是选的64没改也能用,虽然分配下来的长度是60。
wan 中的【获取IPv6地址】方式最初是手动,发现重启 wan_6 接口总是无法获取到 ip,但重启软路由后会获取到。于是尝试改成自动,改成自动后确实不论是修改配置还是重启 wan_6 接口或 wan 接口都能很快获取到 ipv6 地址,一开始以为这样挺完美的,谁知道重启软路由后 wan_6 反而不会自动获取到地址,还得手动启动一下才行。权衡之后,最终还是决定设成手动,这样至少重启软路由不会有问题。
lan 的 DHCPv6 设置没怎么变,RA 和 DHCPv6 选的服务器模式,RA中默认路由器选强制的,启用 SLAAC。不过不知为何 lan 中的 ipv6 地址中出现了两次 fd00::1。
上面的设置也有不完美的地方,那就是如果软路由重启,局域网设备的 ipv6 好像不会自动更新,至少不会很快,比如电脑上就得重新禁用再打开网卡才能连上 ipv6,否则 ipv6 不通。不知是哪里没设好。还有一处不明白,就是记得之前 DHCPv6 会给电脑分配 ipv6 地址,后缀除了 eui64 的还有一个很短的,此时那个短的没有了,只剩下 eui64 的了。
取消 nat6 除了上面的设置之外,一个很关键的地方就是防火墙中 wan 区域的设置要【取消】IPv6 的动态伪装,这才是 nat6 最直接的控制地方。否则即使能上网但性能并没有提升。
既然都选择直连了,那之前防火墙中的端口映射的设置都要取消。原则上虽然不取消也行,但是会导致一些问题。加上软路由 IPv6 地址是 xx, 而 nas 的是 yy。比如 6666 端口,之前 nat6 模式时是把 xx 的 6666 端口映射到 yy,也就是通过访问 xx:6666 达到访问 yy:6666 的效果。但是现在 yy 可以直连了,所以可以直接访问 yy:6666 (前提是防火墙放行6666端口)。那么,此时如果相关端口映射设置还在,那么访问 xx:6666 是否依然通呢?经测试发现,如果6666的端口映射设置中的目标IP是正确且可以连通的,那么不论是直连的 yy:6666 还是端口映射的 xx:6666 都通;但如果端口映射设置中的 IP 不对不通,那么不论是 xx:6666 还是 yy:6666 都是不通的,现象是卡着没反应。所以,最好不取消所有端口映射。
端口映射取消了,取而代之的是端口放行,需在【防火墙=>通信规则】中设置,不手动放行的端口,即使在外面能 ping 通 ip 也是无法访问的。设置中源区域选择 wan,目标区域选择 lan,目标端口选择要放行的端口,可以空格隔开写多个。最关键的来了,目标地址可以使用掩码,而且还是掩后面!因为 ecui64 格式的后缀是不变的,变的只是前缀,比如目标设备之前的 ip 是 2408:xxx::1234:5678:9abc:def0, 而重启软路由后前缀会变但后缀不变,比如 ip 变成了 2408:yyy::1234:5678:9abc:def0,那么这时便可(通过手动输入)如下设目标 IP
::1234:5678:9abc:def0/::ffff:ffff:ffff:ffff
这样不论前缀怎么变,只要后缀不变就总能匹配到目标设备。/etc/config/firewall 中相应配置部分如下:
config rule
option name '名字自取'
option family 'ipv6'
option src 'wan'
option dest 'lan'
list dest_ip '::1234:5678:9abc:def0/::ffff:ffff:ffff:ffff'
option dest_port '6666 7777' # 放行 6666 和 7777 两个端口
option target 'ACCEPT'
- 在只能通过 ipv6 访问软路由管理界面后,随之出现了其他问题,一是 ssh root@fd00::1 尝试登录软路由被拒绝,二是基于 ttyd 的控制页面上的终端也无法打开。进不了终端,这可怎么进行命令行操作?网上搜索,有网友指出,只需要将【系统=>管理权=>ssh访问】和【服务=>终端=>配置】中的默认接口 lan 去掉,都改成【未指定】并保存应用,之后 ssh 和 ttyd 就都可以用了。