我在云提供商上有一个 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