Linux
如何在不使用 IPTables 或 Firewalld 的情況下阻止 CentOS 中的出站流量?
我正在嘗試實現諸如混沌工程之類的東西,因此手動實現這些功能。其中一項功能是在不使用 IPTables 或 firewalld 的情況下阻止出站 DNS 流量。
我在這裡完全沒有想法,我的需求如下
- 沒有 IPTables 或防火牆
- 我應該能夠提到協議的類型( TCP/ UDP )
- 和埠號
任何幫助,非常感謝。
謝謝你。
以下是“不使用 IPTables 或 firewalld”的三種方法。我還盡可能輕鬆地處理 IPv6。
- Traffic Control :
tc
: 可能是任何版本的 CentOS 甚至 EOL 版本需要知道出站介面名稱(以及如何提前完成路由)。假設將用於傳出流量的介面名為
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是兩個 協議的目標埠。這不會被本地應用程序擷取。
- nftables:。
nft
_ CentOS 7 或 8甚至 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
目前還不清楚本地應用程序是否會因為這些規則而擷取錯誤。
除非添加異常,否則也會影響從本地系統到自身的本地連接。
- 策略路由:
ip rule
. CentOS 8 只是因為這需要核心 >= 4.17較新的核心也可以使用埠來匹配路由規則。所以只要有規則將任何東西丟棄到 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)。