為什麼不阻止 ICMP?
我想我幾乎在我的 CentOS 5.3 系統上完成了我的 iptables 設置。這是我的腳本…
# Establish a clean slate iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -F # Flush all rules iptables -X # Delete all chains # Disable routing. Drop packets if they reach the end of the chain. iptables -P FORWARD DROP # Drop all packets with a bad state iptables -A INPUT -m state --state INVALID -j DROP # Accept any packets that have something to do with ones we've sent on outbound iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Accept any packets coming or going on localhost (this can be very important) iptables -A INPUT -i lo -j ACCEPT # Accept ICMP iptables -A INPUT -p icmp -j ACCEPT # Allow ssh iptables -A INPUT -p tcp --dport 22 -j ACCEPT # Allow httpd iptables -A INPUT -p tcp --dport 80 -j ACCEPT # Allow SSL iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Block all other traffic iptables -A INPUT -j DROP
就上下文而言,這台機器是虛擬專用伺服器 Web 應用程序主機。
在之前的問題中,Lee B 說我應該“多鎖定 ICMP”。為什麼不完全阻止它?如果我這樣做會發生什麼(會發生什麼壞事)?
如果我不需要阻止 ICMP,我該如何進一步鎖定它?
ICMP 是一種方式,不僅僅是“traceroute”和“ping”。它用於在您執行 DNS 伺服器(埠不可訪問)時提供回饋,在現代 DNS 伺服器中,它實際上可能有助於選擇不同的機器進行更快的查詢。
如上所述,ICMP 也用於路徑 MTU 發現。您的作業系統可能會在它發送的 TCP 數據包上設置“DF”(不要分段)。如果路徑上的某些東西無法處理該大小的數據包,則期望返回 ICMP“需要分段”數據包。如果您阻止所有 ICMP,您的機器將不得不使用其他回退機制,這些機制基本上使用超時來檢測 PMTU“黑洞”,並且永遠不會正確優化。
此外,您應該問自己為什麼要阻止 ICMP。你想在這裡具體阻止什麼?很明顯,您不了解 ICMP 的用途,這很常見。在阻止您不完全理解的內容時,我會非常謹慎。
為了更難了解這一點,許多常見的防火牆書籍都說“阻止 ICMP”——很明顯,他們的作者從未閱讀過 RFC,也從未解決過圍繞此類建議的問題。阻止所有 ICMP 是個壞建議。
現在,速率限制它也會受到傷害。如果您的機器很忙,或者即使不是,您也可以獲得大量的 ICMP 流量。我的 Web 伺服器每分鐘可能會收到大約 10-100 個 ICMP 數據包,其中大部分是 PMTU 發現。即使有人選擇使用某種類型的 ICMP 數據包攻擊我的伺服器,這也沒什麼大不了的。如果您的機器甚至接受一個 TCP 連接(ssh、http、郵件等),那麼這可能是一個比被誤解的 ICMP 更大的攻擊向量。