当前这套RouterOS路由器里的防火墙是按照自己在用的 IPv6 防火墙规则来解读。因为家庭宽带和机房、公网服务器环境不一样,在家庭宽带场景下,不能按照机房和公网服务来写防火墙规则,这种写法往往并不贴合实际,甚至会把文章带偏。
家庭网络环境,本身就有明显限制:家庭宽带通常并不适合按公网服务器思路去设计对外服务,很多端口本身就受运营商策略影响,所以这篇文章只围绕自己在用的 IPv6 防火墙规则进行说明,不额外引申成“网站服务器防火墙模板”。
文章最后我也会把这几组规则对应的 RouterOS 命令完整附上,方便后续直接整理、备份或者重建。
一、这套规则适合什么环境
先把定位说清楚。这套 IPv6 Firewall 规则,更适合下面这种家庭宽带场景:
- RouterOS 作为主路由
- 家庭宽带提供原生 IPv6
- 局域网内部有 NAS、群晖、WireGuard、日常终端设备
- 目标是稳定、安全、够用,而不是把家宽当公网生产服务器来跑
它的核心思想也很明确:
- 先保证 IPv6 正常运行
- 再保护路由器本机
- 再限制公网进入内网的访问
- 只放行已经明确需要的服务
这套规则整体上是很典型、也很稳的一套家庭宽带 IPv6 防护思路,既没有乱开口子,也没有把 IPv6 关键协议误伤掉。
二、先看 Filter Rules:这才是核心
IPv6 Firewall 里面最关键的,就是 Filter Rules。
- Input 链:保护路由器自己
- Forward 链:保护内网设备以及经过路由器转发的流量
这个区分非常重要。很多人做防火墙的时候,最容易犯的错就是把发往“路由器本机”的流量,和“转发到内网设备”的流量混在一起。实际上这两者不是一回事,处理逻辑也完全不同。
三、Input 链逐条解读:保护路由器本机
chain=input 的规则。
1. defconf: accept established,related,untracked
这条规则的作用,是允许已经建立、相关联、以及未跟踪的连接继续访问路由器。
这可以理解为一种“正常返回流量放行”。比如你在路由器上发起了某些通信,或者前面已经有合法连接建立完成,那么它们后续的数据包不需要每次都重新判断是否危险,而是直接放行。
这条规则是基础中的基础,正常情况下都应该放在前面,而且从你的计数器来看,这条规则命中非常高,说明它承担了大量正常流量的放行工作。
2. defconf: drop invalid
这条规则专门用来丢弃无效连接。
所谓 invalid,可以简单理解为状态异常、无法被连接跟踪正确识别的数据包。它们未必一定都是攻击流量,但保留它们没有意义,反而可能带来额外风险,所以直接丢弃是标准做法。
从你的计数器来看,这条规则当前是 0 命中,这很正常,说明当前环境相对平稳。
3. defconf: accept ICMPv6
这条规则非常关键。IPv6 环境下,ICMPv6 不是“可有可无”,而是 IPv6 正常工作的一部分。
像下面这些能力,几乎都离不开 ICMPv6:
- 邻居发现
- 路径 MTU 发现
- 部分错误反馈与诊断
- 基本网络连通性维护
所以在 IPv6 防火墙里,不能像有些人做 IPv4 一样,简单粗暴把 ICMP 一刀切掉。你这里保留了 accept ICMPv6,这是正确的。
4. defconf: accept UDP traceroute
这条规则允许 UDP traceroute 相关流量进入路由器。
它主要是为了配合链路诊断工具,方便你或者上游设备做路由追踪时能够得到正常响应。对于家庭环境来说,这条规则不是绝对核心,但保留它也没什么问题,属于默认配置里比较常见的一条辅助性规则。
5. defconf: accept DHCPv6-Client prefix delegation
这条规则是 IPv6 家庭宽带场景里的重点规则之一。
家庭宽带拿 IPv6 前缀,通常要依赖 DHCPv6-PD,也就是前缀委派。这里你允许了来自 fe80::/10、目标端口 546 的 UDP 流量进入路由器,本质上就是为了让路由器能够正常从运营商获取 IPv6 前缀。
如果把这条规则删了,最常见的问题就是:
- 路由器拿不到 IPv6 前缀
- 局域网设备无法正常获得 IPv6 地址
- IPv6 访问时通时不通
所以这条规则必须保留。
6. Allow WireGuard IPv6 input
这条规则是手动增加的自定义规则,用来允许 WireGuard 的 IPv6 入站访问。
从上面的规则可以看到:
- 协议:UDP
- 目标端口:12580
- 进入接口:WAN
也就是说,来自公网 IPv6 的 WireGuard 流量,只要打到这个 UDP 端口,就允许进入路由器本机。这个设计非常合理,因为 WireGuard 本身就是一个典型需要接收公网入站的服务。
而且和直接暴露路由器管理口比起来,开放一个 WireGuard 入口要安全、克制得多。
7. defconf: drop everything else not coming from LAN
这条规则是 Input 链最后的收口规则,也是整套配置里非常重要的一条。
它的含义很直白:
凡是不来自 LAN 的、前面又没有明确允许的访问,一律丢弃。
这就意味着,公网不能随便访问你的 RouterOS 本机服务。也就是说:
- 没有被前面规则明确放行的访问,全部挡住
- 路由器本机不会对公网“裸奔”
- 管理面默认只留在局域网内部
这条规则命中数也不低,说明它确实在帮你挡掉不少来自非 LAN 的访问请求。
四、Forward 链逐条解读:保护内网设备
接下来再看后半部分,也就是 chain=forward 的规则。
Forward 链处理的是“经过路由器转发”的流量。简单说,公网访问你内网设备,或者内网设备访问外网,都会经过这里。
1. special dummy rule to show fasttrack6 counters
这条带 D 标记的规则是 RouterOS 自动生成的统计用占位规则,用来显示 FastTrack 计数器。
它本身不是你手工真正拿来放行或阻断流量的策略规则,主要作用是给系统展示统计信息。看到它不用紧张,它不是异常项。
2. defconf: fasttrack6
这条规则开启了 IPv6 的 FastTrack 连接加速。
FastTrack 的作用,是让已经建立并确认安全的连接走更高效的处理路径,减少 CPU 压力,提升转发效率。对于家庭宽带环境来说,如果路由器性能一般、流量又不少,这条规则很有价值。
从你的命中统计来看,这条规则已经处理了大量流量,说明当前网络里它确实在发挥作用。
3. defconf: accept established,related,untracked
这条和 Input 链里的同名规则逻辑类似,只不过这里是针对转发流量。
也就是说,已经建立、相关联、未跟踪的转发连接,直接放行。这是 Forward 链的核心放行基础规则。
4. defconf: drop invalid
这条也是标准配置,专门丢弃状态异常的转发流量。
从你的命中统计来看,这条规则已经挡掉了一部分无效流量,这说明它不是摆设,而是在实实在在工作。
5. defconf: drop packets with bad src ipv6
这条规则会丢弃源地址属于 bad_ipv6 地址列表的数据包。
也就是说,如果一个包的源 IPv6 地址本身就属于无效、保留、文档测试、兼容映射之类不应该正常出现在公网转发场景里的地址段,那么直接丢弃。
这样做的意义在于:
- 过滤掉明显异常的地址来源
- 减少伪造源地址流量的干扰
- 让转发链更干净
6. defconf: drop packets with bad dst ipv6
这条规则和上一条类似,不过这里检查的是目标地址。
如果一个 IPv6 包的目标地址落在不应正常转发的特殊地址段里,那么也直接丢弃。这属于很典型的“协议卫生规则”,平时你可能感觉不到它的存在,但保留它可以减少很多无意义甚至异常的流量。
7. defconf: rfc4890 drop hop-limit=1
这条规则用于丢弃某些 hop-limit=1 的 ICMPv6 包。
它来自 RFC4890 的防护思路,主要是为了避免某些不应该被转发、或者可能被利用做异常探测的 ICMPv6 流量继续通过。
这条规则一般命中数不高,但确实有命中,说明它在实际环境中也不是完全闲置。
这类规则的特点就是:平时存在感不强,但该挡的时候能起作用,所以保留是有意义的。
8. defconf: accept ICMPv6
前面已经说过,IPv6 不能乱砍 ICMPv6。这里在 Forward 链中继续允许 ICMPv6,通过的就是那些对 IPv6 正常通信有必要的转发类 ICMPv6 流量。
如果你把这条去掉,很多时候不是“看起来完全断网”,而是会出现更难排查的问题,比如:
- 某些站点能打开,某些站点打不开
- 大包访问不稳定
- 某些应用偶发异常
所以这条规则必须保留。
9. defconf: accept HIP
这条规则允许 HIP 协议(协议号 139)。
在绝大多数家庭网络里,这条规则平时几乎不会有明显存在感,很多设备和日常应用也用不到它。你这里的计数器目前是 0,说明当前环境里基本没有相关流量。
不过它属于 RouterOS 默认 IPv6 规则里常见的一部分,保留也不会有什么负担。
10. defconf: drop everything else not coming from LAN
这条是 Forward 链的最后一道总闸门。
它的含义同样很直白:
凡是不来自 LAN、前面又没有被明确允许的转发流量,一律丢弃。
这条规则是保护内网设备的关键。它确保了公网不能因为你家里设备拿到了 IPv6,就直接无条件访问进来。
也就是说,内网设备虽然有 IPv6,但并不等于全都直接暴露在公网前面。只有你手工加进去并明确允许的规则,才会开口子。
五、两条自定义 Forward 放行规则是什么意思
除了默认规则,还额外加了两条群晖NAS自定义放行:
Allow DSM HTTPS IPv6Allow Synology Drive IPv6
这两条规则都在 forward 链中,协议是 TCP,分别对应端口:
- 5055
- 6690
设计思路是:
- 路由器本机不对公网开放管理口
- 但对某些明确需要的内网服务,允许 IPv6 转发访问
这就是典型的“按需开口子”思路,而不是一上来把整片内网都暴露出去。
从命中数看,这两条规则都已经有实际访问,尤其是 5055 那条命中更明显,说明这些放行规则是正在使用中的,而不是仅仅摆在那儿。
对于家庭宽带场景来说,只给真正需要的服务单独开规则,而不是泛泛地写一堆公网服务模板。
六、Mangle 规则解读:这里只有一个重点,就是 MSS
IPv6 Firewall 里的 Mangle。
前面那三条带 D 标记的 special dummy rule to show fasttrack6 counters,本质上仍然是 RouterOS 自动生成的统计辅助项,可以理解为系统层面的占位显示,不是你自己真正需要维护的核心规则。
真正值得关注的是最后一条:
Fix IPv6 MSS
它的作用是对 TCP 流量进行 MSS 调整,也就是常说的“修正最大报文段”。
这条规则在家庭宽带环境里其实很实用,尤其是下面这些场景:
- PPPoE
- 隧道环境
- 某些链路 MTU 不一致
- 个别站点访问慢、卡、断流
很多人网络表面看起来“能通”,但某些应用总是不稳定,最后查下来其实就是 MTU / MSS 问题。你这里加了 IPv6 的 MSS 修正规则,而且命中很多,说明这条规则确实正在发挥作用。
换句话说,这不是多余规则,而是一条很典型、很实用的“稳定性优化项”。
七、Address Lists 解读:bad_ipv6 到底装了什么
Address Lists。这里的列表名是 bad_ipv6,里面装的是一组不适合正常公网转发通信的特殊地址段。
这些条目包括:
3ffe::/16—— 6bone2001:10::/28—— ORCHID2001:db8::/32—— 文档示例地址100::/64—— discard only::/96—— IPv4 compat::ffff:0.0.0.0/96—— IPv4-mappedfec0::/10—— site-local::1—— loopback::/128—— unspecified address
这些地址段有的已经废弃,有的是保留用途,有的是文档示例,有的是本地用途,总之都不应该作为正常公网转发流量的源地址或目标地址来出现。
所以你在 Forward 链中配合这份地址表,去丢弃 bad src 和 bad dst,是很合理的设计。
它的意义就在于:先把一批明显“不对劲”的 IPv6 地址在入口阶段过滤掉,避免它们参与后续正常通信处理。
八、整体评价:这是一套很标准的家庭宽带 IPv6 防火墙思路
- 保留了 IPv6 正常运行必须的 ICMPv6 和 DHCPv6
- 路由器本机的 Input 面收得比较紧
- Forward 链遵循“按需放行、默认拒绝”的思路
- 保留了 bad_ipv6 这类协议卫生规则
- 加入了 MSS 修正,兼顾了实际稳定性
- 只开放了明确需要的 WireGuard 和群晖相关服务
如果说还有什么最值得保留的思想,那就是这套配置并没有脱离家庭宽带场景去乱发挥。它不是那种“复制一堆公网服务器规则进来”的写法,而是真正围绕自己家里网络需求来设计的。
这一点反而很重要。
九、防火墙规则对应的 RouterOS 命令
下面把这些关键规则整理成命令版本,方便后续手工添加、导出备份或者重建。
注意:接口名如 WAN、接口列表如 LAN、以及具体端口号,请按你自己的路由器实际命名和配置情况确认后再执行。
1. Filter Rules
/ipv6 firewall filter
add chain=input action=accept connection-state=established,related,untracked comment="defconf: accept established,related,untracked"
add chain=input action=drop connection-state=invalid comment="defconf: drop invalid"
add chain=input action=accept protocol=icmpv6 comment="defconf: accept ICMPv6"
add chain=input action=accept protocol=udp dst-port=33434-33534 comment="defconf: accept UDP traceroute"
add chain=input action=accept protocol=udp src-address=fe80::/10 dst-port=546 comment="defconf: accept DHCPv6-Client prefix delegation"
add chain=input action=accept protocol=udp in-interface=WAN dst-port=12580 comment="Allow WireGuard IPv6 input"
add chain=input action=drop in-interface-list=!LAN comment="defconf: drop everything else not coming from LAN"
add chain=forward action=fasttrack-connection connection-state=established,related comment="defconf: fasttrack6"
add chain=forward action=accept connection-state=established,related,untracked comment="defconf: accept established,related,untracked"
add chain=forward action=drop connection-state=invalid comment="defconf: drop invalid"
add chain=forward action=drop src-address-list=bad_ipv6 comment="defconf: drop packets with bad src ipv6"
add chain=forward action=drop dst-address-list=bad_ipv6 comment="defconf: drop packets with bad dst ipv6"
add chain=forward action=drop protocol=icmpv6 hop-limit=equal:1 comment="defconf: rfc4890 drop hop-limit=1"
add chain=forward action=accept protocol=icmpv6 comment="defconf: accept ICMPv6"
add chain=forward action=accept protocol=139 comment="defconf: accept HIP"
add chain=forward action=accept protocol=tcp dst-port=5055 comment="Allow DSM HTTPS IPv6"
add chain=forward action=accept protocol=tcp dst-port=6690 comment="Allow Synology Drive IPv6"
add chain=forward action=drop in-interface-list=!LAN comment="defconf: drop everything else not coming from LAN"
2. Mangle Rules
真正需要手工关注的是 MSS 修正规则,统计用的 dummy rule 不需要自己手动添加。
/ipv6 firewall mangle
add chain=forward action=change-mss protocol=tcp tcp-flags=syn new-mss=clamp-to-pmtu comment="Fix IPv6 MSS"
3. Address Lists
/ipv6 firewall address-list
add list=bad_ipv6 address=3ffe::/16 comment="defconf: 6bone"
add list=bad_ipv6 address=2001:10::/28 comment="defconf: ORCHID"
add list=bad_ipv6 address=2001:db8::/32 comment="defconf: documentation"
add list=bad_ipv6 address=100::/64 comment="defconf: discard only"
add list=bad_ipv6 address=::/96 comment="defconf: ipv4 compat"
add list=bad_ipv6 address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped"
add list=bad_ipv6 address=fec0::/10 comment="defconf: site-local"
add list=bad_ipv6 address=::1 comment="defconf: lo"
add list=bad_ipv6 address=::/128 comment="defconf: unspecified address"
十、最后总结
如果把这套 IPv6 Firewall 配置浓缩成一句话,那就是:
该保留的 IPv6 基础协议要保留,该收紧的公网访问要收紧,该单独放行的服务再单独开口。
它不是“为了看起来高级”而堆规则,也不是照着服务器公网模板去乱写,而是一套很符合家庭宽带现实环境的配置思路。
尤其是下面这几个点,我认为是这套规则最有价值的地方:
- 没有误伤 IPv6 必需功能
- 没有把路由器本机暴露给公网
- 内网服务只按需放行
- 保留了 bad_ipv6 和 MSS 修正这类实用项
对于家庭网络来说,防火墙配置很多时候不是越复杂越好,而是越贴近自己的实际环境越好。后续更多是根据自己的服务需求做微调,而不是推倒重来。