Linux

如何在不使用 IPTables 或 Firewalld 的情況下阻止 CentOS 中的出站流量?

  • June 6, 2021

我正在嘗試實現諸如混沌工程之類的東西,因此手動實現這些功能。其中一項功能是在不使用 IPTables 或 firewalld 的情況下阻止出站 DNS 流量。

我在這裡完全沒有想法,我的需求如下

  • 沒有 IPTables 或防火牆
  • 我應該能夠提到協議的類型( TCP/ UDP )
  • 和埠號

任何幫助,非常感謝。

謝謝你。

以下是“不使用 IPTables 或 firewalld”的三種方法。我還盡可能輕鬆地處理 IPv6。

需要知道出站介面名稱(以及如何提前完成路由)。假設將用於傳出流量的介面名為eth0。您可以使用該tc命令在介面上添加過濾器。過濾器只能在有類學科上添加,因此為此目的添加了一個“虛擬”有類 qdisc,其自身的屬性不會在此處真正使用:prio

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 parent 1: pref 1 protocol ip basic match '
   (cmp (u8 at 9 layer network eq 6) or cmp (u8 at 9 layer network eq 17)) and
       cmp(u16 at 2 layer transport eq 53)' action drop
'
tc filter add dev eth0 parent 1: pref 2 protocol ipv6 basic match '
   (cmp (u8 at 6 layer network eq 6) or cmp (u8 at 6 layer network eq 17)) and
       cmp(u16 at 2 layer transport eq 53)' action drop
'

筆記:

  • IPv4的 9 層網路中的 u8是IPv4 標頭中的協議欄位:它的值與tcp的 6 或**udp的17 進行比較。
  • IPv6的 6 層網路中的 u8是IPv6 固定報頭中幾乎但不等價的 Next 報頭欄位。這並不適用於所有情況:如果在 Fixed 標頭和 Payload 標頭之間存在 Extension 標頭,則上面使用的 IPv6 的固定標頭的 Next 標頭將與有效負載協議不匹配(6 用於tcp或 17 用於udp)。由於可能有多個連結的擴展標頭,因此tc不太適合此操作,除非它在某些模組中獲得內置支持。
  • 上面2 層傳輸的 u16是兩個 協議的目標埠。這不會被本地應用程序擷取。

甚至 CentOS 7 的 3.10 核心也得到了nftables的反向移植版本。只需將等效的iptables添加到nftables 即可inet族表同時處理 IPv4 和 IPv6 。

nft add table inet t
nft add chain inet t output '{ type filter hook output priority 0; policy accept; }'
nft add rule inet t output udp dport 53 drop
nft add rule inet t output tcp dport 53 drop

目前還不清楚本地應用程序是否會因為這些規則而擷取錯誤。

除非添加異常,否則也會影響從本地系統到自身的本地連接。

較新的核心也可以使用埠來匹配路由規則。所以只要有規則將任何東西丟棄到 udp 埠​​ 53 和 tcp 埠 53 而不是路由它。

ip rule add ipproto udp dport 53 blackhole
ip rule add ipproto tcp dport 53 blackhole
ip -6 rule add ipproto udp dport 53 blackhole
ip -6 rule add ipproto udp dport 53 blackhole

這將被帶有 EINVAL 的本地應用程序擷取(如 … 中所述ip route(8))。改變網路“中斷”的類型可能會改變錯誤,從而改變行為(例如:從黑洞禁止)。

不會影響從系統到自身的本地連接(其本地路由評估發生在之前,優先級為 0)。

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