即使規則匹配,iptables 也使用預設策略

即使規則匹配,iptables 也使用預設策略

我目前正在嘗試了解如何iptables運作。我已閱讀以下內容:

當封包到達(或離開,取決於鏈)時,iptables 會將其與這些鏈中的規則一一匹配。當它找到匹配項時,它會跳到目標上並執行與其相關的操作。如果它沒有找到與任何規則相符的內容,它只會執行鏈的預設策略告訴它的操作。預設策略也是一個目標。1

我現在已經在過濾器表上設定了 INPUT 鏈,如下所示:

$ iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -i wg0 -j ACCEPT

現在可以使用 wg0 介面從另一台電腦 (10.0.0.2) 對電腦 (10.0.0.1) 執行 ping 操作。

使用iptables -S INPUT -v,我還可以看到規則匹配,因為資料包和位元組計數器正在增加。

新增日誌目標iptables -I INPUT -i wg0 -j LOG --log-prefix "INPUT-wg0: "進一步證實了這一點。我現在可以使用 來查看資料包dmesg -w

但是,當我現在將預設策略設為 DROP 時,不再記錄任何資料包,並且不再可能進行 ping 操作:

$ iptables -S INPUT
-P INPUT DROP
-A INPUT -i wg0 -j LOG --log-prefix "INPUT-wg0: "
-A INPUT -i wg0 -j ACCEPT

我不明白這一點。我以為會使用第一個符合規則的目標? (LOG目標似乎是個例外)

規則之前匹配過,因此即使預設策略更改後也應該仍然匹配,對吧?

如果有人能解釋這一點,我會很高興連結對我的行為。

iptables-saveping 工作時的輸出:

# Generated by iptables-save v1.8.8 on Fri Dec 23 06:18:42 2022
*mangle
:PREROUTING ACCEPT [31842:2917695]
:INPUT ACCEPT [28740:2664375]
:FORWARD ACCEPT [3102:253320]
:OUTPUT ACCEPT [23607:5802958]
:POSTROUTING ACCEPT [26366:6035482]
COMMIT
# Completed on Fri Dec 23 06:18:42 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:18:42 2022
*raw
:PREROUTING ACCEPT [217327:66651913]
:OUTPUT ACCEPT [102949:46884985]
COMMIT
# Completed on Fri Dec 23 06:18:42 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:18:42 2022
*nat
:PREROUTING ACCEPT [115:6688]
:INPUT ACCEPT [49:2632]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [62:3720]
-A POSTROUTING -s 10.0.0.0/24 -o wg0 -j MASQUERADE
COMMIT
# Completed on Fri Dec 23 06:18:42 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:18:42 2022
*filter
:INPUT ACCEPT [974:119665]
:FORWARD ACCEPT [474:28440]
:OUTPUT ACCEPT [558:81105]
-A INPUT -i wg0 -j ACCEPT
-A FORWARD -i wg0 -o wg0 -j ACCEPT
COMMIT
# Completed on Fri Dec 23 06:18:42 2022

iptables-save將 INPUT 鏈的預設策略變更為 DROP 且 ping 不再有效後的輸出:

# Generated by iptables-save v1.8.8 on Fri Dec 23 06:22:19 2022
*mangle
:PREROUTING ACCEPT [32468:2982249]
:INPUT ACCEPT [29284:2723905]
:FORWARD ACCEPT [3184:258344]
:OUTPUT ACCEPT [23854:5839963]
:POSTROUTING ACCEPT [26695:6077511]
COMMIT
# Completed on Fri Dec 23 06:22:19 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:22:19 2022
*raw
:PREROUTING ACCEPT [217953:66716467]
:OUTPUT ACCEPT [103193:46921614]
COMMIT
# Completed on Fri Dec 23 06:22:19 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:22:19 2022
*nat
:PREROUTING ACCEPT [165:9268]
:INPUT ACCEPT [73:3868]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [71:4260]
-A POSTROUTING -s 10.0.0.0/24 -o wg0 -j MASQUERADE
COMMIT
# Completed on Fri Dec 23 06:22:19 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:22:19 2022
*filter
:INPUT DROP [205:26532]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [26:9060]
-A INPUT -i wg0 -j ACCEPT
-A FORWARD -i wg0 -o wg0 -j ACCEPT
COMMIT
# Completed on Fri Dec 23 06:22:19 2022

(這裡有一些與我的 Wireguard VPN 設定相關的附加規則,我沒有提及,但它們似乎與我的預設策略問題無關)

答案1

正如評論中所提到的這個答案,解決方案是也允許 eth0 介面上的資料包。這是有道理的,因為 wg0 介面只是虛擬的,並且需要 eth0 介面來建立隧道。

答案2

規則按行順序處理。因此,如果規則匹配,則不會對該 IP 封包處理其他規則。如果規則為匹配封包指定了 ACCEPT 目標,則封包將跳過其餘規則檢查並被允許繼續到達其目的地。如果規則指定 DROP 目標,則該封包將被拒絕存取系統,並且不會將任何內容傳回傳送該封包的主機。

正如您所說,在以下規則集中,首先匹配丟棄,並且沒有進一步的過程進入下一行來記錄您的資料包。

iptables -S INPUT
-P INPUT DROP   ***Matched Line***
-A INPUT -i wg0 -j LOG --log-prefix "INPUT-wg0: "
-A INPUT -i wg0 -j ACCEPT

現在,如果您想要新增日誌記錄,同時丟棄資料包,這樣的事情可能會對您有所幫助。

iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP

欲了解更多詳情,請參閱下面的連結。 如何將 Linux IPTables 防火牆丟棄的封包記錄到日誌檔案中

相關內容