Linux

如何將多個埠上的標記數據包重定向到一個 IP 地址

  • January 7, 2018

我已經設置了這個規則:

-A PREROUTING -i vboxnet0 -p tcp -m tcp --dport 80 -j internet
-A internet -j MARK --set-xmark 0x63/0xffffffff

擷取埠 80 上的傳入流量並將其發送以進行標記。它可以工作,但現在我想編輯它以擷取除 53(DNS)、DHCP 服務埠和其他埠之外的所有埠。在我的 iptables 下方,我有

-A PREROUTING -i vboxnet0 -p tcp -m mark --mark 0x63 -m tcp --dport 80 -j DNAT --to-destination 192.168.56.1

這會擷取所有帶有標記的 tcp 流量,並以埠 80 為目的地,並將其 DNAT 到本地 IP。我想編輯它以包括除 3(DNS)、DHCP 服務埠和其他一些埠之外的所有埠。

一些好的指針代替對兩個規則集中第一個 -m 和第二個 -m 之間差異的小解釋也可以讓我走上正確的軌道。

了解您的規則

與大多數事情一樣,了解防火牆規則如何工作的第一步是檢查man頁面 ( man iptables)。在man頁面中,您會發現:

-m, –match 匹配

指定要使用的匹配項,即測試特定屬性的擴展模組。這組匹配構成了呼叫目標的條件。匹配項按照命令行中的指定從頭到尾進行評估,並以短路方式工作,即如果一個擴展產生錯誤,評估將停止。

在頁面底部附近,man您還會發現:

匹配和目標擴展

iptables 可以使用擴展的數據包匹配和目標模組。iptables-extensions(8) 聯機幫助頁中提供了這些列表。

因此,該iptables-extensions man頁面將為您提供有關您的-m選擇真正在做什麼的詳細資訊。那裡的一些小片段:

標記

$$ ! $$–標記值$$ /mask $$ …

tcp

$$ ! $$–destination-port,–dport 埠$$ :port $$ …

脫氧核糖核酸

此目標僅在 nat 表、PREROUTING 和 OUTPUT 鏈以及僅從這些鏈呼叫的使用者定義鏈中有效。它指定應該修改數據包的目標地址(並且此連接中的所有未來數據包也將被破壞),並且應該停止檢查規則。它採用以下選項:

–to-destination

$$ ipaddr[-ipaddr $$]$$ :port[-port $$] …

標記

此目標用於設置與數據包關聯的 Netfilter 標記值。例如,它可以與基於 fwmark 的路由結合使用(需要 iproute2)。如果您打算這樣做,請注意需要在 mangle 表的 PREROUTING 鏈中設置標記以影響路由。標記欄位為 32 位寬。

–set-xmark 值

$$ /mask $$

簡單來說,-moptions 將匹配選項添加到iptables. 但是該man頁面還列出了一些非標準目標(包括DNAT您正在使用的目標。


該怎麼辦

現在,將所有這些放在一起,我假設您正在使用的表是nat唯一可以與DNAT目標一起使用的表。

似乎也不需要標記流量。它只是被標記,以便您可以nat使用數據包,但您可以只nat使用數據包而不是標記它開始。

例如:

-A PREROUTING -i vboxnet0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.56.1

您可以指定多個規則來覆蓋多個埠,還可以使用 指定埠範圍[port]:[port],或使用 負匹配!

例如,要將規則應用於除53(domain) 和22(ssh) 之外的所有埠,您可以執行以下操作:

-A PREROUTING -i vboxnet0 -p tcp -m tcp ! --dport 53 -j DNAT --to-destination 192.168.56.1
-A PREROUTING -i vboxnet0 -p tcp -m tcp ! --dport 22 -j DNAT --to-destination 192.168.56.1

如果您要過濾掉很多埠,這可能會變得很麻煩,但這就是iptables. 我建議檢查/etc/services以獲取埠映射列表,這樣您就可以避免影響某些服務/協議。

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