Linux-Kernel

了解 netfilter/iptables 中的鍊和表

  • May 8, 2016

據我了解,Linux 核心在netfilter_ipv4.h文件中定義了 IPv4 數據包流的五個掛鉤點:

/* IP Hooks */
/* After promisc drops, checksum checks. */
#define NF_IP_PRE_ROUTING   0
/* If the packet is destined for this box. */
#define NF_IP_LOCAL_IN      1
/* If the packet is destined for another interface. */
#define NF_IP_FORWARD       2
/* Packets coming from a local process. */
#define NF_IP_LOCAL_OUT     3
/* Packets about to hit the wire. */
#define NF_IP_POST_ROUTING  4

..根據netfilter_ipv6.h同樣的情況,IPv6 似乎也是如此:

/* IP6 Hooks */
/* After promisc drops, checksum checks. */
#define NF_IP6_PRE_ROUTING  0
/* If the packet is destined for this box. */
#define NF_IP6_LOCAL_IN     1
/* If the packet is destined for another interface. */
#define NF_IP6_FORWARD      2
/* Packets coming from a local process. */
#define NF_IP6_LOCAL_OUT        3
/* Packets about to hit the wire. */
#define NF_IP6_POST_ROUTING 4

這讓我想知道以定義操作發生的位置並確定可以執行哪些操作的方式來思考netfilter/iptables架構是否正確?此外,核心是否也很重要,或者它們只是為了讓使用者對可能發生的處理類型進行分組?chains``tables``tables``iptables

關鍵是表格按設計意圖對事物進行分組。你所有的過濾規則都在這個地方,你所有的 NAT 規則都在那兒。鍊是規則序列,預設鏈在數據包路徑中的特定點遍歷。

理論上,您可以添加一個過濾規則,例如 NAT 表。但是前端會阻止您這樣做,並顯示如下消息

“nat”表不用於過濾,因此禁止使用 DROP。

我的想法是它實際上是關於鏈條的,而表格是事後才想到的,可以幫助您組織它們。這是令人困惑的,因為它是臨時的、歷史發展的使用者界面設計。

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