可以在 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 型)
非常感謝您的幫助。
根據我的研究,我最終得出了以下規則。在註釋規則(即:禁用類型)中,對於 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
所以我的結論是網路伺服器只需要類型 1,2,3,4,128,135,136
允許所有 ICMPv6 類型。盡可能限制每秒 ICMPv6 數據包的速率,以限制 IP 設備上的資源使用。這是一種簡單的方法,並不像聽起來那麼不安全。
或者,您的研究方法是閱讀RFC 4890 Recommendations for Filtering ICMPv6 Messages in Firewalls。注意缺少必須放棄的建議作為開始。
“連結全域”不是標準術語。我認為您的意思是(全球)單播。與連結本地或多播相反,它們在定義的範圍內。此外,您將需要具有區域概念的防火牆。因為您可能希望在前綴與網際網路上採用不同的策略,但兩者都是全球單播範圍。
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 來自 Internet。不允許 SEND 等其他內容穿越網際網路。不是過濾這些東西的唯一方法,但至少不會破壞 IPv6。