將 conntrack
與 --protocol
等混合,試圖重寫我的 rules.v4
我剛剛閱讀了
iptables
手冊頁。看來,對於conntrack
模組,我應該使用/更--ctproto
喜歡--protocol
?我會更好地向您展示我到目前為止使用的東西,我在某個時候遷移到**
ct*
**. 無論如何,這裡是:$ cat /etc/iptables/rules.v4 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] --append INPUT --in-interface lo --match comment --comment "Allow loopback" --jump ACCEPT --append INPUT --match conntrack --ctstate INVALID --match comment --comment "Drop invalid packets" --jump DROP --append INPUT --match conntrack --ctstate NEW --protocol tcp ! --syn --match comment --comment "Reject new non-syn TCP" --jump REJECT --reject-with tcp-reset --append INPUT --match conntrack --ctstate NEW,ESTABLISHED --protocol tcp --match tcp --destination-port 22 --source 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT --append INPUT --protocol icmp --icmp-type echo-request --match limit --limit 2/second --limit-burst 5 --match comment --comment "Allow only ping and within limits" --jump ACCEPT --append INPUT --match conntrack --ctstate RELATED,ESTABLISHED --match comment --comment "Normal traffic" --jump ACCEPT COMMIT
因此,我嘗試將其重寫如下:
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] --append INPUT --in-interface lo --match comment --comment "Allow loopback" --jump ACCEPT --append INPUT --match conntrack --ctstate INVALID --match comment --comment "Drop invalid packets" --jump DROP --append INPUT --match conntrack --ctstate NEW --ctproto tcp ! --syn --match comment --comment "Reject new non-syn TCP" --jump REJECT --reject-with tcp-reset --append INPUT --match conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --match tcp --destination-port 22 --source 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT --append INPUT --match conntrack --ctproto icmp --icmp-type echo-request --match limit --limit 2/second --limit-burst 5 --match comment --comment "Allow only ping and within limits" --jump ACCEPT --append INPUT --match conntrack --ctstate RELATED,ESTABLISHED --match comment --comment "Normal traffic" --jump ACCEPT COMMIT
如果我嘗試不同,則會出現這些以及可能的其他錯誤:
# iptables-restore < rules.v4-ct iptables-restore v1.8.4 (legacy): unknown option "--syn" Error occurred at line: 7 Try `iptables-restore -h' or 'iptables-restore --help' for more information. # iptables-restore < rules.v4-ct iptables-restore v1.8.4 (legacy): unknown option "--icmp-type" Error occurred at line: 9 Try `iptables-restore -h' or 'iptables-restore --help' for more information. # iptables-restore < rules.v4-ct iptables-restore: line 11 failed # iptables-restore < rules.v4-ct Bad argument `COMMIT' Error occurred at line: 11 Try `iptables-restore -h' or 'iptables-restore --help' for more information.
謝謝,如果你能闡明這一點。
一些備註:
- 我很想知道有人建議在哪裡使用
--ctproto tcp
. 有沒有參考?- 手冊頁的 OP 中的精確URL 連結已過時 10 年以上:例如,它不包括在此答案末尾的備註中使用的
conntrack
匹配模組。--ctreplsrcport
它還沒有分成兩個手冊頁:(iptables
基礎)和iptables-extensions
今天大多數有趣的文件(匹配和目標)存在的地方。雖然我喜歡 Debian 手冊頁,因為參數和子命令的連結(如conntrack
match)經常出現。關於問題:
--protocol``iptables
是不需要額外匹配模組的內置功能(將在 中描述iptables-extensions(8)
)。它不是將其依賴關係更改為多個模組的匹配模組參數。在沒有載入模組的情況下使用模組特定參數是行不通的
--syn
是其中的一部分,-m tcp
如果不載入此模組就無法使用第 7 行因此失敗
--icmp-type
是其中的一部分,-m icmp
如果不載入此模組就無法使用第 9 行因此失敗
協議特定模組需要說明協議
聲明一個協議(例如:)
-p tcp
會自動嘗試載入同名的模組(例如:)-m tcp
。反過來是不正確的。這就是為什麼tcp
oricmp
模組很少被顯式編寫,但實際上總是存在的,就像一個iptables-save
展示一樣。這沒有明確記錄,但如果這樣做並且要嚴格遵循文件,則始終必須編寫-p tcp
並-m tcp
尊重目前文件。
- TCP
> >
tcp
> > >--protocol tcp
如果指定,可以使用這些擴展。 > 它提供以下選項: > > >一旦
-m tcp
添加了第 7 行,第 7 行和第 8 行仍然失敗(顯然在核心驗證級別),因此
- ICMP
> >
icmp
(特定於 IPv4) > > >--protocol icmp
如果指定,則可以使用此副檔名。 > 它提供以下選項: > > >由於這個原因,第 9 行失敗(顯然在核心驗證級別)
因此,最終即使可以使用
--ctproto tcp
,只要需要不屬於其中的功能,-p tcp -m tcp
仍然需要。ICMP 同上。conntrack
當有更具體的方法可用時,可能不值得為此使用該模組。還會
conntrack
在conntrack表中進行查找,這可能比特定方法更昂貴(但實際上,一旦完成查找(在conntrack工具的 prio -200 時),對條目的引用就會記憶體在數據包的 skbuff 中,並且狀態也可以直接使用)。一些備註:
在系統(網路命名空間)級別,此過濾器:
-A INPUT -p tcp -m conntrack --ctstate NEW --ctproto tcp -m tcp ! --syn -m comment --comment "Reject new non-syn TCP" -j REJECT --reject-with tcp-reset
除了最終
REJECT
目標可以替換為:sysctl -w net.netfilter.nf_conntrack_tcp_loose=0
它現在會將此類數據包分類為無效並被 INVALID 規則檢查丟棄(而不是在 OP 的規則中拒絕)。預設情況下啟用鬆散模式以允許暫時中斷的流量(例如:重新啟動狀態路由防火牆)恢復。
- 第 8 行實際上可以在沒有的情況下完成
-p tcp -m tcp
因為對於這種情況
-m conntrack
,它具有替換它的功能。由於 nat/PREROUTING 規則可能改變了可能不同於 22 的原始目標埠,因此在
--ctreplsrcport 22
下面選擇了更自然的--ctorigdstport 22
.-A INPUT -s 192.168.0.0/24 -m conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --ctreplsrcport 22 --match comment --comment "Allow local SSH on default port" --jump ACCEPT
甚至(儘管一些文件另有說明,但很少使用的 nat/INPUT 在 filter/INPUT 之後發生,源沒有發生任何變化,並且
--ctorigsrc
可以使用自然):-A INPUT -m conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --ctreplsrcport 22 --ctorigsrc 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT