实战:在公网IPv6环境下搞定端口转发的那些事儿
大家好,我是33blog的老王。最近在折腾家庭服务器时发现个有趣的现象——现在很多运营商都开始默认分配IPv6地址了,但相关的网络配置教程却少得可怜。今天我就把自己踩坑总结的IPv6端口转发经验分享给大家,特别是那些像我一样还在用老旧路由器的朋友们。
为什么IPv6端口转发这么特殊?
记得第一次尝试IPv6端口转发时,我习惯性地在路由器里找NAT设置,结果…压根没这选项!后来才明白,IPv6的设计理念就是”每个设备都有公网IP”,理论上不需要NAT。但现实情况是:
- 防火墙默认会拦截入站连接
- 很多服务仍然监听在IPv4
- 部分老旧设备不支持IPv6
我的实际解决方案
经过多次测试,我总结出三种可行的方案(按推荐程度排序):
方案一:防火墙直接放行(最优雅)
如果你的路由器是OpenWRT这类开源系统,SSH登录后添加这样一条规则:
ip6tables -A INPUT -p tcp --dport 8080 -j ACCEPT
注意要把8080换成你的实际端口。这个方案最符合IPv6的设计哲学,但需要客户端也支持IPv6。
方案二:使用socat做协议转换(兼容性强)
在内网服务器上安装socat后,运行:
socat TCP6-LISTEN:8080,reuseaddr,fork TCP4:192.168.1.100:80
这个命令会把IPv6的8080端口流量转发到内网IPv4的80端口。我在树莓派上实测延迟仅增加2-3ms。
方案三:老路由器的曲线救国(最折腾)
我家的老TP-Link路由器没有IPv6防火墙设置,最后不得不用DDNS+端口触发这种奇葩组合。具体步骤:
- 在路由器开启IPv6 DDNS
- 设置端口触发规则(比如外网访问8080触发内网80端口)
- 在客户端用脚本定期访问保持触发状态
几个血泪教训
1. 防火墙规则顺序很重要:有次我把ACCEPT规则放在REJECT后面,debug了整整一晚上…
2. 测试时别用本地回环:IPv6的::1和IPv4的127.0.0.1行为有差异,建议直接用手机流量测试。
3. 注意前缀变化:有些运营商的IPv6前缀会定期变更,这时候DDNS就派上用场了。
写在最后
说实话,IPv6的普及速度比我想象的慢多了。但最近帮朋友配置智能家居时发现,很多新设备已经默认优先使用IPv6了。如果你也遇到了IPv6相关的网络问题,欢迎在评论区交流,说不定你的经验正好能帮到别人呢!
下次我准备写写《如何让老旧设备在IPv6-only网络下正常工作》,感兴趣的话记得关注33blog的更新~
终于看到有人详细讲IPv6端口转发了,之前找了好多资料都不全。
感谢分享!用socat那个方法试了,果然好使,就是命令打错了两次😂
老路由器那段太真实了,我家那个古董TP-Link也是啥v6设置都没有…
所以现在到底该不该上v6啊?感觉很多网站都还没适配好
终于看到个靠谱的ipv6教程了!求问下那个iptables规则重启会失效吗?
配过v6的朋友都知道基础教程其实都没用,这种实战经验才是真干货
v6前缀会变这个太坑了,上次配置完用得好好的突然就断连
现在运营商给的v6都是/64前缀,家里设备多了地址都不够分…
期待下一篇!我家那台老旧NAS至今只支持v4
测试端口死活连不上,后来发现是光猫防火墙的事😅