Linux

iptables——好的,現在我做對了嗎?

  • September 29, 2012

這是對上一個問題的跟進,我在該問題中詢問我的 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 之前無論如何都可以訪問。

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