Iptables

可以在 Web 伺服器上安全地阻止這些 ICMPv6 消息類型嗎?

  • December 12, 2021

我在雲提供商上有一個 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。

引用自:https://serverfault.com/questions/1084154