RouterOS IPv6 防火墙规则解读


当前这套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 IPv6
  • Allow 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 —— 6bone
  • 2001:10::/28 —— ORCHID
  • 2001:db8::/32 —— 文档示例地址
  • 100::/64 —— discard only
  • ::/96 —— IPv4 compat
  • ::ffff:0.0.0.0/96 —— IPv4-mapped
  • fec0::/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 修正这类实用项

对于家庭网络来说,防火墙配置很多时候不是越复杂越好,而是越贴近自己的实际环境越好。后续更多是根据自己的服务需求做微调,而不是推倒重来。

, ,

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注