Iptables

強制 iptables 立即使 drop 規則生效

  • July 2, 2019

我有以下設置:在/etc/iptables/rules.v4

# Generated by iptables-save v1.4.21 on Mon Jul  1 11:32:00 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3:620]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.35.107/32 -p icmp -m icmp --icmp-type 8 -j DROP
-A INPUT -s 192.168.35.0/24 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -s 192.168.35.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
COMMIT
# Completed on Mon Jul  1 11:32:00 2019

從上面我們看到我想阻止來自特定 IP 的 ping。在我用 保存規則並用iptables-restore < /etc/iptables/rules.v4列出規則後iptables -L,我可以斷定 ip 為 192.168.35.107 的電腦無法 ping 伺服器。

但是,具有該 IP 的電腦能夠無限期地ping ,直到我中斷會話。即使在我中斷 ping 之後,我仍然需要暫停大約 60 秒,直到我無法再次 ping。如果我在 ping 命令之間暫停 5-10 秒,防火牆會讓我通過。

有趣的是,當我通過 iptables 啟用 ping 時,它會立即工作。我也嘗試過使用 Samba 埠 445。相同的。

有沒有辦法讓 iptables 丟棄的埠立即生效?

您遇到這種行為是因為您的系統nf_conntrack*啟用了 netfilter 的連接跟踪系統(模組系列),並且您的--state RELATED,ESTABLISHED規則(顯然設置為ACCEPT)位於 ping 的特定DROP規則之前。

這些-m state規則以及更細粒度的-m conntrack規則依賴於連接跟踪系統,該系統還跟踪諸如 UDP 和 ICMP 之類的協議,即使這些協議在技術上不是面向連接的。它通過在其列表中建立一個具有預設到期超時的“連接”條目來跟踪這些協議。這些預設值可以通過下面的特定文件進行查詢和設置/proc/sys/net/netfilter/,通常是那些名為nf_conntrack_*_timeout.

作為 ICMP 無連接協議,連接跟踪系統無法檢測到任何此類“連接”何時真正完成,因此只能依賴超時驅動的啟發式。因此,只要連接跟踪列表中有一個條目與您的源 IP/目標 IP icmp“對話”匹配,任何-m state --state ESTABLISHED規則都將匹配該流量,在您的情況下,根據您的特定規則接受它。

您注意到的“~60 秒”超時實際上應該是 30 秒,因為這通常是/proc/sys/net/netfilter/nf_conntrack_icmp_timeout. 但是,它可能已echo通過將不同的值添加到該文件中而被更改。

另請注意,這些文件中的值適用於從那時起的新“連接”。要查看連接跟踪系統已知的目前條目,以及它們目前的過期超時,您可以使用conntrack可能需要安裝的命令。使用該命令,您還可以修改或刪除條目。

有沒有辦法讓 iptables 丟棄的埠立即生效?

最簡單的方法是始終將DROP規則放在-m state ACCEPT 規則之前。

一種替代方法可能是:每次添加DROP規則時,還要執行相應的conntrack命令來刪除目前活動的條目。

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