1. 为什么你的IPv6网络总感觉“裸奔”从理解RouterOS防火墙开始如果你刚从IPv4网络切换到IPv6可能会发现一个“惊喜”家里的智能电视、NAS甚至智能灯泡好像一夜之间都拥有了一个全球可路由的公网地址。这可不是错觉IPv6的设计目标之一就是让每个设备都能直接与互联网对话彻底告别NAT的“保护壳”。听起来很美好对吧但这也意味着如果你的路由器防火墙没配置好这些设备就等于直接暴露在公网上任何知道地址的人都可以尝试连接它们。我刚开始用MikroTik RouterOS V7.6配置IPv6时就踩过这个坑。当时我以为像IPv4那样简单放行几个端口就行结果内网一台测试机的日志里突然多了很多莫名其妙的连接尝试吓出一身冷汗。后来才明白IPv6的防火墙逻辑和IPv4有本质不同。在IPv4时代我们习惯了躲在路由器NAT后面防火墙的主要任务是管理“出去”的流量。而到了IPv6每个设备都是“前锋”防火墙必须同时扮演好“守门员”和“后卫”的双重角色。MikroTik RouterOS V7.6在IPv6支持上做了很多改进尤其是防火墙部分功能更强大但配置逻辑也需要我们重新理解。简单来说你需要保护两个对象路由器本身和路由器后面的局域网设备。对应的防火墙规则主要作用于两个“链”input链处理目标是路由器自身的数据包和forward链处理需要路由器转发、目标是内网其他设备的数据包。如果你没搞清这两个链的区别配置起来就会一头雾水要么是设备上不了网要么就是门户大开。所以在动手敲命令之前我们先得把心态调整好IPv6防火墙不是IPv4规则的简单复制粘贴它需要一套更精细、更主动的策略。别担心下面我会带你从最基础的规则开始一步步构建一个既安全又高效的IPv6防护体系。2. 基础入门构建你的第一道IPv6防火墙防线刚开始配置时我建议你直接在Winbox的终端里操作或者通过SSH连接。复制粘贴命令虽然快但亲手敲一遍能帮你更好地理解每条规则的作用。我们先从保护路由器自身开始这是整个网络安全的基石。2.1 保护路由器自身守好大门路由器是网络的指挥中心如果它被攻破整个网络就沦陷了。保护路由器的规则都放在input链里。我们一条条来看我会解释为什么需要它。首先必须放行已经建立的连接和相关的连接。这是防火墙的通用最佳实践确保正常的通信回包不会被阻断。/ipv6 firewall filter add actionaccept chaininput commentallow established and related connection-stateestablished,related这条规则应该放在最前面。connection-stateestablished,related这个参数非常关键它利用了RouterOS的连接跟踪功能只放行那些属于已存在会话的数据包能有效阻止许多伪装攻击。接下来要处理ICMPv6。IPv6网络严重依赖ICMPv6协议像地址发现、邻居探测、路径MTU发现都靠它。如果完全屏蔽网络会出现各种奇怪问题。/ipv6 firewall filter add chaininput actionaccept protocolicmpv6 commentaccept ICMPv6但注意这里我们只是简单放行了所有ICMPv6。在更严格的环境中你可能需要细化只放行必要的ICMPv6类型这个我们后面高级部分会讲。然后是一些必要的服务端口。比如UDP traceroute和DHCPv6客户端前缀委派。/ipv6 firewall filter add chaininput actionaccept protocoludp port33434-33534 commentdefconf: accept UDP traceroute add chaininput actionaccept protocoludp dst-port546 src-addressfe80::/16 commentaccept DHCPv6-Client prefix delegation.第二条规则里的src-addressfe80::/16限定了源地址必须是链路本地地址fe80::/16这是DHCPv6客户端通信的典型地址范围增加了安全性。现在我们要开始“关门”了。一个常见的威胁是公网接口上收到来自链路本地地址fe80::/16的数据包。在公网上这类地址本不该出现如果出现很可能是扫描或攻击行为。假设你的公网接口叫ether1可以这样丢弃它们add actiondrop chaininput in-interfaceether1 logyes log-prefixdropLL_from_public src-addressfe80::/16我强烈建议加上logyes这样当有此类可疑包被丢弃时你可以在日志里看到记录方便后期排查。最后我们定义一个“白名单”。先创建一个地址列表把允许访问路由器管理界面的IPv6地址比如你的管理电脑加进去。/ipv6 firewall address-list add address2001:db8:1111::1 listallowed commentAdmin PC然后在input链的靠前位置但在established规则之后添加一条规则放行这个白名单add actionaccept chaininput commentallow allowed addresses src-address-listallowed并在input链的最后添加一条兜底的拒绝规则add actiondrop chaininput这条规则会拒绝所有之前未被其他规则匹配的数据包。这个顺序很重要先放行特例最后拒绝所有。2.2 保护局域网设备当好交通警察保护完路由器我们来看如何保护内网设备。规则主要加在forward链。这里的核心思想是默认允许内网设备主动访问外网但严格限制从外网主动发起的入站连接。首先依然是放行已建立的连接确保内网设备上网的回应流量能回来。/ipv6 firewall filter add actionaccept chainforward commentestablished,related connection-stateestablished,related紧接着立刻丢弃无效状态的数据包。这是阻断许多扫描和攻击的有效手段。add actiondrop chainforward commentinvalid connection-stateinvalid logyes log-prefixipv6,invalid同样记录日志logyes能帮你了解网络是否正在被探测。然后处理ICMPv6。对于转发链我们通常只允许从内网发起的ICMPv6或者从外网回来的相关ICMPv6比如ping回应。一个常见的做法是允许所有非来自公网接口的ICMPv6转发。假设你的公网接口是ether1add actionaccept chainforward commenticmpv6 in-interface!ether1 protocolicmpv6这里的in-interface!ether1表示“入站接口不是ether1”即允许从内网如LAN口进入的ICMPv6流量被转发。接下来是核心策略允许内网设备访问外网但阻止外网主动访问内网。我们利用之前创建的allowed地址列表但这次用在forward链上允许源地址在白名单内的数据包被转发这通常用于你从外网访问家里的特定服务需要提前把外网地址加入白名单不常用。更常见的是允许所有从内网接口非公网接口进来、且源地址是内网合法地址的流量出去。add actionaccept chainforward commentlocal network outbound in-interface!ether1 src-address-listallowed注意这里的src-address-listallowed可以替换成你的内网IPv6前缀比如src-address2001:db8:1111::/64这样更精确。最后在forward链的末尾同样需要一条兜底的拒绝规则add actiondrop chainforward log-prefixIPV6_DROP这里有一个非常重要的坑也是很多新手会遇到的问题原始文章里提到如果这条drop规则不指定连接状态可能会导致设备IPv6网络使用有问题。这是因为有些IPv6协议如某些DHCPv6过程的连接状态可能不会被正确跟踪。更稳妥的做法是在这条全局drop规则之前确保所有必要的流量如DHCPv6、ICMPv6中的路由器请求/通告都已经被前面的规则明确放行。或者你可以将这条规则修改为只丢弃new状态且非法的连接尝试但这需要更精细的规划。一个简单的起步方案是先使用上面的规则如果发现某个内网服务不正常再通过分析日志在前面添加特定的放行规则。3. 核心进阶玩转地址列表与连接状态实现精细管控基础规则搭建好了网络的安全骨架但要让防火墙真正智能、好用还得靠地址列表和连接状态这两个核心武器。它们能让你从“一刀切”的粗放管理升级到“指哪打哪”的精准控制。3.1 善用地址列表给你的设备贴标签地址列表就像给你的IP地址打标签。你可以基于设备、基于角色、基于风险等级来分组管理规则直接引用组名管理起来清晰又方便。比如我想把家里的物联网设备智能灯泡、插座隔离起来只让它们上网但不能访问我的主力电脑和NAS。怎么做呢首先给物联网网络分配一个独立的IPv6前缀比如2001:db8:1111:100::/64。然后在RouterOS里创建地址列表/ipv6 firewall address-list add address2001:db8:1111:100::/64 listIoT_Devices commentIoT Segment add address2001:db8:1111:101::/64 listTrusted_Devices commentPC and NAS现在我就可以写一条forward规则阻止物联网设备访问受信任设备/ipv6 firewall filter add chainforward actiondrop commentBlock IoT to Trusted src-address-listIoT_Devices dst-address-listTrusted_Devices logyes同时确保受信任设备可以访问物联网设备的规则放在更前面或者默认允许同子网访问。你看不需要记住复杂的IP只需要操作“IoT_Devices”和“Trusted_Devices”这两个标签就行了。地址列表还非常适合做动态管理。比如我想临时允许一个朋友家的IP访问我的家庭服务器我不用去翻长长的防火墙规则列表只需在他的IP变化时更新一下地址列表里的条目即可。所有引用这个列表的规则会自动生效。3.2 深入理解连接状态让防火墙拥有“记忆”连接状态是防火墙的“大脑”。它记得哪些连接是内部发起的、哪些是外部的、哪些已经结束。RouterOS主要识别几种状态new: 第一个包试图发起一个新连接。established: 属于一个已确认的双向连接。related: 属于一个与现有“已建立”连接相关的连接比如FTP的数据通道。invalid: 无法识别或异常的数据包直接丢弃。基于状态的规则是高效和安全的关键。我们之前用的connection-stateestablished,related就是经典例子只要是我们自己发起的连接其回包一律放行。这省去了为每一个可能的回包端口单独写规则的麻烦。对于forward链一个更精细的策略是默认丢弃所有从公网接口进入的new状态连接只放行你想暴露的服务。假设我想在IPv6上暴露家里的Web服务器地址是2001:db8:1111::100的80和443端口。 首先在forward链靠前的位置但在established,related和invalid规则之后添加针对公网接口new连接的默认拒绝规则并记录日志add chainforward actiondrop in-interfaceether1 connection-statenew logyes log-prefixIPv6_New_Drop然后在它之前插入允许访问Web服务器的规则add chainforward actionaccept in-interfaceether1 dst-address2001:db8:1111::100 protocoltcp dst-port80,443 connection-statenew commentAllow Web Server这样从公网来的、访问我Web服务器80/443端口的新连接会被放行而访问其他任何端口的新连接都会被记录并丢弃。这种“默认拒绝显式允许”的策略是构建安全防火墙的黄金准则。4. 高级防护策略应对真实世界中的威胁有了前面的基础我们可以针对一些特定场景和高级威胁打造更坚固的防线。这些策略是我在多次实际部署和问题排查中总结出来的能帮你避开很多坑。4.1 防御NDP欺骗与路由器欺骗攻击IPv6没有ARP取而代之的是邻居发现协议。攻击者可以伪造路由器通告或邻居通告进行中间人攻击或导致网络瘫痪。RouterOS提供了ND邻居发现规则来防御它独立于filter表在更底层工作。首先启用并配置ND规则。我们可以在公网接口上只允许路由器发送必要的RA路由器通告并验证邻居消息的合法性。/ipv6 nd set [ find defaultyes ] advertise-dnsyes advertise-mac-addressyes disabledno然后在ipv6 firewall中我们可以添加规则来限制ICMPv6中的ND消息。但更有效的方法是使用RA Guard如果硬件支持或在交换机层面进行防护。对于RouterOS一个实用的方法是在连接内网的接口上设置nd参数限制哪些MAC地址可以发送RA消息如果网络拓扑简单。不过更通用的还是在forward链上精细控制ICMPv6类型。4.2 精细化ICMPv6过滤不是所有ICMP都是朋友前面我们简单放行了所有ICMPv6这在实际生产环境中可能过于宽松。ICMPv6类型很多有些是网络运行必需的有些则可能被用于探测。我们可以有选择地放行。 在forward链中可以这样细化# 放行回显请求和回复ping add chainforward actionaccept protocolicmpv6 icmpv6-options128:0-255 commentEcho Request add chainforward actionaccept protocolicmpv6 icmpv6-options129:0-255 commentEcho Reply # 放行“数据包过大”消息对PMTUD至关重要 add chainforward actionaccept protocolicmpv6 icmpv6-options2:0-255 commentPacket Too Big # 放行超时消息 add chainforward actionaccept protocolicmpv6 icmpv6-options3:0-255 commentTime Exceeded # 放行参数问题消息 add chainforward actionaccept protocolicmpv6 icmpv6-options4:0-255 commentParameter Problem # 最后可以丢弃其他所有ICMPv6根据网络需求调整 add chainforward actiondrop protocolicmpv6 commentDrop other ICMPv6 logyes注意这些规则需要放在forward链中处理ICMPv6流量的位置并且要考虑到方向从内到外还是从外到内。通常对于从内网出去的ICMPv6我们可以放宽对于从公网进来的则需要严格限制。4.3 利用Mangle表进行连接标记与策略路由Mangle表是RouterOS防火墙里功能最强大的部分之一它用于修改数据包。在IPv6环境中一个典型应用是修改TCP MSS最大分段大小以兼容某些PPPoE或隧道链路。/ipv6 firewall mangle add actionchange-mss chainforward new-mss1420 passthroughyes protocoltcp tcp-flagssyn commentFix TCP MSS for PPPoE这条规则会在TCP握手时将SYN包中的MSS值修改为1420有助于解决某些路径MTU发现问题。更高级的用法是进行连接标记然后结合路由表实现策略路由。比如我想让来自某个特定内网IPv6地址段比如视频监控网段的所有流量走一个特定的IPv6出口比如另一个ISP线路。 首先在prerouting链用mangle标记连接/ipv6 firewall mangle add chainprerouting src-address2001:db8:1111:200::/64 actionmark-connection new-connection-markSurveillance_Cam passthroughyes commentMark cam traffic然后基于这个连接标记在路由规则中指定下一跳/ip routing rule add src-address2001:db8:1111:200::/64 actionlookup tableisp2这里假设你已经创建了一个名为isp2的路由表并配置了相应的路由。这样就实现了基于源IPv6地址的流量分流。5. 实战排错与性能优化让你的防火墙既安全又流畅配置了一大堆规则最怕的就是网络出问题不知道从何查起或者规则太多拖慢了路由器性能。这部分分享一些我常用的排错工具和优化技巧。5.1 日志是你的最佳战友之前我们在很多drop规则里都加了logyes。当网络出现问题时第一件事就是看日志。/log print或者更精确地查看IPv6相关的丢弃日志/log print where message~IPV6日志会告诉你时间、规则、源目地址、端口等信息。比如你看到一条日志显示从某个公网IP试图连接你内网设备的某个高端口被丢弃了这很可能是正常的扫描行为。但如果发现大量针对同一内网地址的invalid状态包被丢弃那可能意味着该设备正在被攻击或者它自身发出了异常流量。我习惯给重要的drop规则加上独特的log-prefix比如log-prefixIPv6_BLOCK_INPUT这样在日志里搜索起来更快。但要注意频繁记录日志本身会消耗CPU资源在稳定运行的网络中可以关闭非关键规则的日志记录。5.2 规则顺序是生命线防火墙规则是从上到下逐条匹配的第一条匹配的规则生效后后续规则不再检查。所以顺序至关重要。一个推荐的forward链规则顺序模板如下放行已建立/相关的连接(connection-stateestablished,related) —— 最高优先级保证已有通信不中断。丢弃无效连接(connection-stateinvalid) —— 尽早丢掉垃圾包。放行必要的ICMPv6类型—— 保证网络基础功能。放行从内网到外网的流量(例如in-interfaceLAN src-address内网前缀) —— 允许内网设备上网。放行从外网到特定内网服务的流量(例如in-interfaceWAN dst-address服务器IP dst-port服务端口) —— 暴露你想暴露的服务。记录并丢弃从外网进入的所有其他新连接(in-interfaceWAN connection-statenew logyes actiondrop) —— 安全基线。丢弃所有其他流量(actiondrop) —— 最终安全兜底。你可以使用ipv6 firewall filter print查看当前规则顺序并用move命令调整。例如将序号为10的规则移动到序号5的位置move numbers10 destination5。5.3 拥抱V7.6的硬件卸载与性能提升如果你使用的是较新的MikroTik硬件如CCR系列、部分hEX型号RouterOS V7.6带来了一个好消息IPv6防火墙硬件卸载支持。这意味着符合特定条件的IPv6防火墙规则可以被卸载到交换芯片上处理大幅降低CPU负载提升转发性能。要利用这个特性首先确保你的设备支持IPv6硬件加速。可以通过查看/system resource下的IPv6 HW是否显示yes来确认。然后在配置规则时尽量使用硬件友好的匹配条件。简单来说基于接口、IP地址、协议和端口的规则更容易被卸载。而过于复杂的匹配如connection-state连接跟踪或content匹配通常无法硬件加速。一个优化思路是将最常用、匹配频率最高的规则比如established,related放在前面并且尽量使用硬件友好的条件。将复杂的、需要深度包检测的规则放在靠后的位置。你可以在添加规则后通过ipv6 firewall filter print stats查看每条规则的匹配计数了解流量模式从而优化顺序。最后别忘了定期审查你的防火墙规则。随着网络服务的变化有些规则可能不再需要有些则需要新增。一个干净、简洁、有序的规则集是网络安全和性能的最佳保障。每次调整前最好在非业务时段进行并准备好快速回滚的方案。防火墙配置是一门实践的艺术多观察、多测试、多调整你就能打造出一个既坚固又灵活的IPv6安全边界。