Networking

conntrack--protocol 等混合,試圖重寫我的 rules.v4

  • February 20, 2022

我剛剛閱讀了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 手冊頁,因為參數和子命令的連結(如conntrackmatch)經常出現。

關於問題:

  • --protocol``iptables是不需要額外匹配模組的內置功能(將在 中描述iptables-extensions(8))。它不是將其依賴關係更改為多個模組的匹配模組參數。

  • 在沒有載入模組的情況下使用模組特定參數是行不通的

    • --syn是其中的一部分,-m tcp如果不載入此模組就無法使用

    第 7 行因此失敗

    • --icmp-type是其中的一部分,-m icmp如果不載入此模組就無法使用

    第 9 行因此失敗

  • 協議特定模組需要說明協議

聲明一個協議(例如:)-p tcp會自動嘗試載入同名的模組(例如:)-m tcp。反過來是不正確的。這就是為什麼tcporicmp模組很少被顯式編寫,但實際上總是存在的,就像一個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當有更具體的方法可用時,可能不值得為此使用該模組。

還會conntrackconntrack表中進行查找,這可能比特定方法更昂貴(但實際上,一旦完成查找(在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

引用自:https://unix.stackexchange.com/questions/691411