Debian

為什麼在清除 conntrack 表的情況下“echo f”在 debian 上不起作用?

  • May 21, 2020

許多人在想要重新載入防火牆規則時並沒有清除 conntrack 表。當您有一些 ESTABLISHED 連接時,當您添加阻止某些相關連接的規則(處於 NEW 狀態)時,所有會話都不會受到影響。確保不會發生這種情況的唯一方法是通過清除 conntrack 表來終止所有會話。在這種情況下,所有數據包都會遇到 INVALID 規則,您必須建立一個新連接,該連接現在通過iptables.

在 OpenWRT 中,您可以簡單地執行以下操作:

# echo f > /proc/net/nf_conntrack

但不幸的是,這個解決方案不適用於 debian。

# echo f > /proc/net/nf_conntrack
echo: write error: Input/output error

原因如下:

# ls -al /proc/net/nf_conntrack
-r--r----- 1 root root 0 2016-06-05 10:45:52 /proc/net/nf_conntrack

在 debian 上,您必須安裝該conntrack軟體包,然後鍵入以下命令:

# conntrack -F
conntrack v1.4.3 (conntrack-tools): connection tracking table has been emptied.

為什麼echo f不能在 debian 上執行?有沒有辦法讓它以某種方式工作,還是我被迫使用該conntrack工具?

OpenWRT 維護了幾個特定的核心更新檔。其中,有一個特定的更新檔提供了您抱怨的 Debian 缺少的功能。它實際上在 OpenWRT 中可用。

為核心 4.4 選擇所問問題時間線附近的 git 歷史記錄。

600-netfilter_conntrack_flush.patch:

static const struct file_operations ct_file_ops = {
       .owner   = THIS_MODULE,
       .open    = ct_open,       .read    = seq_read,
 +     .write   = ct_file_write,
       .llseek  = seq_lseek,
       .release = seq_release_net,
 };
@@ -393,7 +450,7 @@ static int nf_conntrack_standalone_init_
 {
        struct proc_dir_entry *pde;

-       pde = proc_create("nf_conntrack", 0440, net->proc_net, &ct_file_ops);
+       pde = proc_create("nf_conntrack", 0660, net->proc_net, &ct_file_ops);
        if (!pde)
                goto out_nf_conntrack;

雖然我無法弄清楚特定f語法的處理位置(在上面的程式碼片段之外),但上面的片段清楚地顯示了 OpenWRT 添加了一個更新檔來允許寫入 /proc/net/nf_conntrack在普通核心上是只讀的。

它今天仍然可用於核心 5.4,但它的內容更不明顯。

可以想像這是為了應對嵌入式環境和有限的大小:如果核心更新檔允許避免發布 conntrack 工具,則可以為其他功能節省空間。

這是一個黑客。與conntrack子系統的預期現代互動是通過該conntrack工具和不斷發展的netlink核心 API。(只讀)/proc/net/nf_conntrack只是為了與更簡單的工具兼容而保留。

您可能可以使用此附加更新檔(可能需要其他相關更新檔)編譯 Debian 原始碼樹來獲得此功能,但我不確定這在普通系統上是否真的有用。

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