Linux 机器有多个网络接口。IPv4 和 IPv6 均启用了 IP 转发。
我想通过状态防火墙保护路由器本身上运行的服务。为此,需要启用连接跟踪。同时,我想将从一个接口转发到另一个接口的所有流量排除在连接跟踪之外。
对于状态防火墙,我通常会使用过滤表的 INPUT 和 OUTPUT 链。转发的流量将进入 FORWARD 链。但据我所知,在 FORWARD 链中没有办法将流量标记为未跟踪。这种逻辑必须进入原始表中的 PREROUTING 链。但我相信,在 PREROUTING 链中尚未决定是否转发流量。
连接跟踪有许多缺点,例如当跟踪的连接列表达到其最大大小时会丢弃数据包。
从连接跟踪中排除转发流量(并且仅排除转发流量)的最简单方法是什么?
答案1
对于通用规则集,可以问nftables使用fib
表达式,而不是等待路由堆栈执行。这允许涉及(未来)输出接口,尽管尚不存在(路由决策未发生),但需要额外查找。然后,如果结果显示数据包将被路由,则使用notrack
陈述。
FIB 表达式
fib {saddr | daddr | mark | iif | oif} [. ...] {oif | oifname | type}
A谎言表达式查询谎言(转发信息库)获取特定地址将使用的输出接口索引等信息。输入是用作谎言查找功能。
NOTRACK 声明
notrack 语句允许禁用某些数据包的连接跟踪。
notrack
请注意,要使此语句有效,它必须在数据包之前应用到连接跟踪查找发生。因此,它需要位于具有以下任一链中:预路由或者输出钩子并且钩子优先级为 -300 或更低。
因此,应该进行“简单”的路线检查预路由,仅使用目标地址作为选择器并检查是否存在输出接口(不可路由的数据包或发往主机的数据包将无法解析任何数据包)。以下情况例外:洛(环回)接口来跟踪它:虽然它代表本地流量,但发送的数据包(通过输出路径)从主机到其自身通过预路由路径,并且确实有一个输出接口洛也是。由于传出的数据包已经创建了一个连接跟踪条目,最好保持一致。
nft add table ip stateless
nft add chain ip stateless prerouting '{ type filter hook prerouting priority -310; policy accept; }'
nft add rule ip stateless prerouting iif != lo fib daddr oif exists notrack
ip
用组合系列替换该系列inet
应该将相同的通用行为扩展到 IPv4+IPv6。
更具体地说,可以指定未来的输出接口,fib daddr oif eth1
例如,它或多或少相当于oif eth1
,但也可用于预路由。
当然,如果事先知道拓扑结构,则可以使用基于地址测试的一条或几条规则来避免 FIB 查找,因为管理员事先知道路由。可能需要对结果进行基准测试,以了解这是否比保留通用方法更有趣。
例如,根据 OP 提供的信息,将之前的规则替换为:
nft add rule ip stateless prerouting 'ip daddr != { 192.168.1.1, 192.168.2.1, 127.0.0.0/8 } notrack'
应该具有近乎相同的效果。127.0.0.0/8 的存在原因与上述相同,洛界面。
处理广播(例如 192.168.1.255 在eth0) 和多播 (如在接口上收到的本地链路 224.0.0.1) 在这两种方法中可能工作方式不同,也可能不像预期的那样,并且可能需要额外的规则来满足特定需求,尤其是使用第二种方法。由于跟踪广播和多播很少有用,因为回复源不会 (也不能) 是原始广播或多播地址目的地,因此 conntrack 条目永远不会“看到”双向流量,因此它通常对有状态规则没有太大影响。
笔记
这通常与状态 NAT 不兼容。
我的理解是,对远程主机的 DNAT 将使其回复流量不被解除 NAT 并失败,并且转发的 SNAT 不会触发,因为没有连接跟踪条目已创建。输入路径中很少使用的 SNAT 应该没问题,DNAT+SNAT 的组合(使用本地地址源)也可能有效,因为在原始方向和回复方向都涉及本地目的地,因此连接跟踪那么条目就应该始终能够被正确地创建或查找。
标准规则集
实际使用规则iptables或者nftables(在其自己的不同表中)然后可以像往常一样完成,包括主机本身的状态规则。由于路由流量不会创建连接跟踪如果涉及此类流量的任何条目、规则都应坚持无状态,并且不使用任何
ct
表达式,因为它永远不会匹配。验证行为
即使没有适当的防火墙规则,也可以通过以下方式检查整体行为:
使用虚拟
ct
规则来确保连接跟踪设施在当前网络命名空间中注册。nft add table ip mytable nft add chain ip mytable mychain '{ type filter hook prerouting priority -150; policy accept; }' nft add rule ip mytable mychain ct state new
使用
conntrack
跟踪事件的工具:conntrack -E
从远程生成流量
新的连接跟踪然后将为路由器接收的流量创建条目,但不会为路由的流量创建条目。