這兩個 iptables 規則有什麼區別?
嘗試允許埠 22 上的傳入 ssh 流量。預設行為是丟棄所有傳入流量。
我遇到了 2 篇關於如何允許流量的文章。但是,它們是不同的。
## open port ssh tcp port 22 ## iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
VS
# Allow all incoming SSH iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
似乎第一個允許所有流量,然後指定一個特定的網路。好像這些是互斥的?
這兩個有什麼區別,我應該使用哪一個?
這兩套規則都有問題,我不會按原樣使用它們。
在第一組中,第一條規則允許從任何地方到目標埠 22 的新傳入流量。這不是問題。
第一個問題是第二個規則允許新的傳入流量從特定子網到達目標埠 22。這是完全多餘的,因為第一條規則允許來自任何地方的流量。
我的猜測是您閱讀了一些使用這些規則作為(互斥)範例的教程,建議您選擇其中一個,但不能同時選擇兩者。
第二個問題是在此規則之前需要另一個規則才能使防火牆完全有狀態,而這裡缺少該規則。如果沒有此規則,則只允許 SYN 數據包,並且連接永遠不會完成。
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
第二組規則也有類似的問題。我不知道最初是誰編寫了這個規則集,但它已在網際網路上被廣泛複製。它似乎是由不熟悉一般狀態防火牆或特別是 iptables 的人編寫的。
在此規則集中,輸入規則允許從任何地方到目標埠 22 的新的和已建立的傳入流量。然後,輸出規則允許從源埠 22 到任何地方的已建立流量。這本質上是第一條規則的鏡像,如果您對傳出流量的預設策略是丟棄或拒絕它,則需要類似的東西。
問題是這些出站規則很快就會變得多餘,這會導致性能問題以及以後必須閱讀規則的任何人的理解問題。如果您要丟棄傳出流量,則無論您允許多少傳入埠,任何埠上已建立的傳出流量(匹配允許的傳入流量)都只需要一個規則。
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
對於預設輸入策略是拒絕流量而預設輸出策略是允許流量的主機防火牆,您的大多數規則都將在 INPUT 表中。擁有狀態規則和規則來為您需要的任何傳入流量打開埠就足夠了。
例如,要允許 ssh 和 http 連接:
-P INPUT DROP -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
如果您還預設拒絕輸出流量,那麼您還需要允許這些允許的入站連接的返回流量。
-P OUTPUT DROP -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
這是一個與 iptables 一樣簡單和有效的防火牆。