可以在 Web 服务器上安全地阻止这些 ICMPv6 消息类型吗?

可以在 Web 服务器上安全地阻止这些 ICMPv6 消息类型吗?

我在云提供商上有一个 Debian 11 VPS,启用了 IPv4 和 IPv6,并且 eth0 接口具有全局范围的 ipv6 地址(公共)和链路范围的 ipv6 地址(fe80::/10)。

该服务器的唯一目的是托管公共网站。

我正在使用 iptables/ip6tables 在服务器上实现防火墙。我读过 RFC4890,但仍然不确定如何处理某些 ICMPv6 消息类型,以及它们是否真的适合我的用例。虽然我允许链接范围内的任何流量,我不确定是否可以安全地阻止以下 ICMPv6 消息类型全局范围

  • 路由器请求(类型 133)

  • 路由器通告(类型 134)

  • 邻居恳求(类型 135)

  • 邻居广告(类型 136)

  • 反向邻居发现请求(类型 141)

  • 反向邻居发现广告(类型 142)

  • 监听器查询 (类型 130)

  • 听众报告(类型 131)

  • 听众完成(类型 132)

  • 听众报告 v2(类型 143)

  • 证书路径征求(类型 148)

  • 证书路径通告(类型 149)

  • 多播路由器通告(类型 151)

  • 多播路由器请求(类型 152)

  • 多播路由器终端(类型 153)

非常感谢您的帮助。

答案1

允许所有 ICMPv6 类型。尽可能限制每秒 ICMPv6 数据包的速率,以限制 IP 设备上的资源使用。这是简单的方法,而且并不像听起来那么不安全。


或者,你的研究方法是阅读RFC 4890 关于在防火墙中过滤 ICMPv6 消息的建议.请注意缺乏必须首先要放弃一些建议。

“链路全局”不是一个标准术语。我认为您的意思是(全局)单播。与链路本地或多播相反,它们在定义的范围内。此外,您需要一个具有区域概念的防火墙。因为您可能希望在前缀和互联网上采用不同的策略,但两者都是全局单播范围。

RFC 解释称,许多本地范围的消息不需要特殊过滤。符合要求的路由器不会转发本地来源的链接。接收邻居发现消息的符合要求的主机将确认它们没有经过路由器。而且许多防火墙都是路由器,因此您需要邻居发现(包括 RA)才能工作。


作为一个实际的例子,让我们快速看一下自由路由器 OpenWrt 的默认 ICMPv6 处理。这个问题或多或少包含默认的 ICMPv6 防火墙规则。

区域“lan”默认为全部接受。区域“wan”默认为仅传出。典型的简单防火墙。允许规则来自 wan:

config rule
        option name 'Allow-ICMPv6-Input'
        option src 'wan'
        option proto 'icmp'
        list icmp_type 'echo-request'
        list icmp_type 'echo-reply'
        list icmp_type 'destination-unreachable'
        list icmp_type 'packet-too-big'
        list icmp_type 'time-exceeded'
        list icmp_type 'bad-header'
        list icmp_type 'unknown-header-type'
        list icmp_type 'router-solicitation'
        list icmp_type 'neighbour-solicitation'
        list icmp_type 'router-advertisement'
        list icmp_type 'neighbour-advertisement'
        option limit '1000/sec'
        option family 'ipv6'
        option target 'ACCEPT'

config rule
        option name 'Allow-ICMPv6-Forward'
        option src 'wan'
        option dest '*'
        option proto 'icmp'
        list icmp_type 'echo-request'
        list icmp_type 'echo-reply'
        list icmp_type 'destination-unreachable'
        list icmp_type 'packet-too-big'
        list icmp_type 'time-exceeded'
        list icmp_type 'bad-header'
        list icmp_type 'unknown-header-type'
        option limit '1000/sec'
        option family 'ipv6'
        option target 'ACCEPT'

大多数类型都不能被丢弃,请参阅第 4.4.1 节。请注意,在“Allow-ICMPv6-Forward”中,错误类型和回显始终是允许的,无论是入站还是出站。

config rule
        option name 'Allow-MLD'
        option src 'wan'
        option proto 'icmp'
        option src_ip 'fe80::/10'
        list icmp_type '130/0'
        list icmp_type '131/0'
        list icmp_type '132/0'
        list icmp_type '143/0'
        option family 'ipv6'
        option target 'ACCEPT'

链路本地多播接收器通知消息。

总体而言,允许内部区域中的所有内容,并允许错误、回显、邻居发现和多播相关 ICMP 来自互联网。不允许其他内容(如 SEND)穿越互联网。这不是过滤这些内容的唯一方法,但至少不会破坏 IPv6。

答案2

根据我的研究,我最终得出以下规则。对于注释规则中的 ICMPv6 类型(即禁用类型),LOG REJECT 规则的数据包计数为 0。

#
# INBOUND ICMPv6
# Commented types are not needed;
# those types that would be allowed for link-local only are commented as well 
# because link-local is allowed all traffic.
#

ip6tables -N ICMP6

ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 1 -j ACCEPT                      # Destination Unreachable
ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 2 -j ACCEPT                      # Packet Too Big
ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 3 -j ACCEPT                      # Time Exceeded
ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 4 -j ACCEPT                      # Parameter Problem
ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 128 -j ACCEPT                    # Echo Request
#ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 133 -j ACCEPT                    # Router Solicitation
#ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 134 -j ACCEPT                    # Router Advertisement
ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 135 -j ACCEPT                    # Neighbor Solicitation
ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 136 -j ACCEPT                    # Neighbor Advertisement
#ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 141 -j ACCEPT                    # Inverse Neighbor Discovery Solicitation
#ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 142 -j ACCEPT                    # Inverse Neighbor Discovery Advertisement
#ip6tables -A ICMP6 -s fe80::/10 -p icmpv6 --icmpv6-type 130 -j ACCEPT      # Listener Query
#ip6tables -A ICMP6 -s fe80::/10 -p icmpv6 --icmpv6-type 131 -j ACCEPT      # Listener Report
#ip6tables -A ICMP6 -s fe80::/10 -p icmpv6 --icmpv6-type 132 -j ACCEPT      # Listener Done
#ip6tables -A ICMP6 -s fe80::/10 -p icmpv6 --icmpv6-type 143 -j ACCEPT      # Listener Report v2
#ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 148 -j ACCEPT                    # Certificate Path Solicitation
#ip6tables -A ICMP6 -p icmpv6 --icmpv6-type 149 -j ACCEPT                    # Certificate Path Advertisement
#ip6tables -A ICMP6 -s fe80::/10 -p icmpv6 --icmpv6-type 151 -j ACCEPT      # Multicast Router Advertisement
#ip6tables -A ICMP6 -s fe80::/10 -p icmpv6 --icmpv6-type 152 -j ACCEPT      # Multicast Router Solicitation
#ip6tables -A ICMP6 -s fe80::/10 -p icmpv6 --icmpv6-type 153 -j ACCEPT      # Multicast Router Termination

# DROP everything else on chain ICMP6
ip6tables -A ICMP6 -p icmpv6 -j LOG --log-level 7 --log-prefix "[FW.IN drop ICMP6] "
ip6tables -A ICMP6 -p icmpv6 -j DROP

ip6tables -A INPUT -p icmpv6 -j ICMP6

所以我的结论是,Web 服务器只需要类型 1,2,3,4,128,135,136

相关内容