為什麼在清除 conntrack 表的情況下“echo f”在 debian 上不起作用?
許多人在想要重新載入防火牆規則時並沒有清除 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 原始碼樹來獲得此功能,但我不確定這在普通系統上是否真的有用。