最近修改了家里网络的连接方式,电脑直接通过光猫拨号了。这样电脑等于是直接暴露在公网状态下,因此部署防火墙是十分必要的。本来是想用新的 nftables,但是之前的使用经历让我觉得它还不是很成熟(主要是看大家都不怎么愿意用,现在还是强制依赖 iptables),于是还是选择使用 iptables/ip6tables 来配置防火墙。其中拨号上网时,ipv6 的防火墙配置需要一点额外设置,否则无法正常拨号到 ipv6 地址。
获取不到 ipv6 地址
本来按照Archlinux上的教程部署好了防火墙后,感觉一切都没什么问题,后来突然发现一直没获取到ipv6的地址。起初我以为是电信局端的问题,或者光猫设置的问题,后来把各种设置修改一通后,又突然发现手机通过路由器是一直获取到了公网ipv6地址的。这就说明肯定是电脑上的问题,但是查了pppd、NetworkManager的各个文档、日志,也没有发现问题。最后灵感一现才想到试试防火墙,果然是被这玩意坑了。
其实Archlinux的wiki上说的那个配置对于拨号上网的来说并不适用,它屏蔽了一些必要的消息数据包,所以无法正确的获取到拨号的ipv6地址。参考了ip6tables的文档和我的路由器自己使用的路由规则,终于可以在电脑上正常拨号到ipv6地址了!完整修改如下:
核心就是要允许多种icmpv6消息,为了安全,为这些消息加了些限制,具体的可以查看ip6tables的文档。路由器由于除了要拨号外,也要提供路由或者被连接的功能,所以路由器上的规则集要更多一些,个人电脑用这些规则足够,剩下的就看自己有什么需要再加一些规则了。