我正在尝试实现诸如混沌工程之类的东西,因此手动实现功能。其中一项功能是在不使用 IPTables 或 firewalld 的情况下阻止出站 DNS 流量。
我在这里完全没有想法,我的需求如下
- 没有 IPTables 或防火墙
- 我应该能够提及协议类型( TCP/UDP )
- 和端口号
任何帮助,非常感谢。
谢谢。
答案1
以下是“不使用IPTables或firewalld”的三种方法。如果可能的话,我也会处理 IPv6。
交通管制:
tc
:可能是 CentOS 的任何版本,甚至是 EOL 版本需要知道出站接口名称(以及如何提前完成路由)。假设将用于传出流量的接口名为
eth0
。您可以使用该tc
命令添加筛选在一个界面上。过滤器只能添加到有类规则上,因此为此目的添加了一个“虚拟”有类 qdisc,其自己的属性不会在这里真正使用:普里奥。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 '
笔记:
- u8 9层网络对于 IPv4 是协议字段IPv4 标头:将其值与 6 进行比较TCP协议或 17 为UDP协议。
- u8 6层网络对于 IPv6 来说,是几乎但不等效的 Next 标头字段IPv6固定标头。这并不能涵盖所有情况:如果有扩展头固定头和有效负载头之间,那么上面使用的 IPv6 固定头的 Next 头将与有效负载协议不匹配(6 表示TCP协议或 17 为UDP协议)。由于可能有多个链接的扩展标头,TC除非它在某些模块中获得内置支持,否则不太适合于此。
- u16 2 层传输上面是目的港,对于两个都 协议。
这不会被本地应用程序捕获。
nftables:
nft
。 CentOS 7 或 8甚至 CentOS 7 的 3.10 内核也有一个向后移植的版本nftables。只需添加相当于iptables和nftables。一个内网family 表同时处理 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)。