你好,我是防火墙配置的新手,但我想要做的是允许主机 a(10.1.0.2)向主机 b(10.12.0.10)发送数据包,但 b 不能向 a 发送数据包。两台机器都连接到路由器。这是 a 运行的命令,它阻止从 b 到 a 的流量,但也阻止我不想要的从 a 到 b 的流量。
nft add chain inet filter forward { type filter hook forward priority 0 \; }
nft add rule inet filter forward ip saddr 10.12.0.10 ip daddr 10.1.0.2 drop
nft add rule inet filter forward ip saddr 10.1.0.2 ip daddr 10.12.0.10 accept
答案1
阻止从 B 到 A 的数据包也意味着阻止回复从 B 到 A 的数据包。您的ping
命令能够顺利地将 Echo Request 数据包从 A 发送到 B;它只是无法接收回复,因为这些回复已被故意阻止。
如果您想允许建立双向连接,仍然必须允许 B 发送数据包来回复收到的数据包(例如,它需要能够向 A 发送 ICMP“Echo Reply”数据包或 TCP“ACK”数据包)。
最常见的方法是让防火墙保存所有活动连接的状态,这由 iptables 和 nftables 中的“conntrack”系统完成。
在 nftables 中,使用ct state
允许属于现有连接的数据包(即回复)的规则;确保将其放置在前现有的“删除”规则。(如果您编辑 nftables.conf 并重新加载它,而不是尝试逐个插入规则,这会容易得多。)
表 inet 过滤器 { 链向前{ 类型过滤器钩子前向优先级过滤器;政策接受; ct 状态 {已建立,相关} 接受 ip saddr 10.12.0.10 ip daddr 10.1.0.2 丢弃 ip saddr 10.1.0.2 ip daddr 10.12.0.10 接受 } }
这相当于 iptables--state ESTABLISHED
规则。