iptables——好的,現在我做對了嗎?
這是對上一個問題的跟進,我在該問題中詢問我的 iptables 配置是否正確。
CentOS 5.3 系統。
預期結果:阻止除 ping、ssh、Apache 和 SSL 之外的所有內容。
根據xenoterracide 的建議和對問題的其他回答(謝謝大家),我創建了這個腳本:
# 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
現在,當我列出我得到的規則時…
# iptables -L -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DROP all -- any any anywhere anywhere state INVALID 9 612 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 0 0 ACCEPT all -- lo any anywhere anywhere 0 0 ACCEPT icmp -- any any anywhere anywhere 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https 0 0 DROP all -- any any anywhere anywhere Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 5 packets, 644 bytes) pkts bytes target prot opt in out source destination
我執行了它,我仍然可以登錄,這很好。有沒有人注意到任何重大異常?
大部分看起來都不錯。最重要的是您可能應該使用 iptables-save 和 iptables-restore 而不是重複執行 iptables。iptables-save/restore 方法為您提供原子批量更新(如數據庫事務),因此您知道沒有任何東西可以進入(或不能進入),因為當網路數據包到達時,您的 iptables 更改已完成一半。進行此更改還可以讓您轉儲初始 ACCEPT 策略,因此它只設置首選策略(最好設置為 DENY),然後設置單個規則(接受的例外)。
除此之外,您可能希望更多地考慮鎖定 ICMP(而不僅僅是允許一切)。我聽說現在 ICMP 的某些方面非常狡猾。就我個人而言,我認為這不值得,因為很多診斷和流量管理的東西都依賴於 ICMP。
關於 womble 的“不要使用 iptables”評論:我不會說您不應該直接使用 iptables(或 iptables-save/restore),但我建議您改用 FERM。它本質上只是 iptables,具有更具表現力和更少重複的語言,以及對變數的支持。例如,您的 iptables 命令:
iptables -P INPUT 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
在 ferm 中看起來更像這樣:
# allow some incoming TCP chain INPUT { policy ACCEPT; proto tcp dport (ssh httpd https) ACCEPT; }
好多了,嗯?;)
最後,不要在預設埠 22 上執行 SSH。將其移動到另一個地址(編輯配置文件,然後重新載入 sshd)。即使通過 ssh 連接,您也可以執行此操作,但最好在弄亂 ssh 或防火牆規則時使用另一種訪問方法(基於控制台,由虛擬專用主機提供)。另外,最終考慮設置類似fail2ban的東西。但是我不會在沒有固定 IP(在我這邊)和特定的防火牆規則的情況下使用它,以允許我在任何阻止 fail2ban 之前無論如何都可以訪問。