如何在 Linux 桥上使用 nft 来阻止对特定 IP 地址的访问?

如何在 Linux 桥上使用 nft 来阻止对特定 IP 地址的访问?

我有一台br0定义了网桥的 Ubuntu 机器。网桥已eth0连接到互联网服务并eth1连接到 PC 的网络端口。网桥按预期运行,并传递eth0和之间的所有流量eth1

我想制定一条规则,阻止 PC 访问某些外部 IP 地址(例如 1.1.1.1)。我猜这nft是实现此目的的方法。我该如何编写一条规则,使任何br0来往于 1.1.1.1 的事物都无法通过。

这里的目的是能够模拟某些故障进行测试。

答案1

这是使用nftables桥梁家庭

nftables提供桥梁系列作为替代品ebtables

在中创建一个表家庭:

# nft add table bridge t

创建一个链来过滤转发的帧:

# nft add chain bridge t c '{ type filter hook forward priority 0; policy accept; }'

创建规则以防止 IP 数据包eth1要达到 1.1.1.1:

# nft add rule bridge t c iif eth1 ether type ip ip daddr 1.1.1.1 drop

这就是无状态防火墙。


自从Linux 内核 5.3 nftables还支持直接状态防火墙小路:

为桥接器添加本机连接跟踪支持。在此补丁集之前,人们进行状态过滤的唯一机会是使用br_netfilter模拟层,这是弃用它的一步 [...]

这样可以轻松地在单一方向上隔离系统。例如允许:

  • 使用 SSH 访问 PC
  • PC 的传出访问:要使用的 PC和 DNS(th以下代表两者传输控制协议UDP协议
  • ARP(没有它就没有 IPv4 连接)
  • 全部需要回复流量(出于性能原因,这是第一条规则)
  • 仅此而已

可以使用:

# nft add rule bridge t c ct state related,established accept
# nft add rule bridge t c oif eth1 ether type ip tcp dport 22 accept
# nft add rule bridge t c iif eth1 ether type ip meta l4proto {tcp, udp} th dport 53 accept
# nft add rule bridge t c iif eth1 ether type ip icmp type echo-request accept
# nft add rule bridge t c ether type arp accept
# nft add rule bridge t c drop

某些分解当然是可能的,应该考虑(例如:通过使用集合和连接)。


上述所有示例都不会影响 Ubuntu 盒子本身,它仍然可以到达并被双方到达。要影响从 PC 到 Ubuntu 盒子(或从 Ubuntu 盒子到 PC)的流量,可以在链上执行相同类型的规则输入(分别输出) 代替向前


笔记:

br_netfilter不应加载模块(默认启用 sysctl 属性net.bridge.bridge-nf-call-iptables = 1),以避免本机之间的意外交互规则和知识产权家庭规则也会影响nftables就像iptables. 这意味着br_netfilter应避免在同一系统上运行 Docker 或 Kubernetes( 的两个常见用户)在进行网络实验时(但只要小心谨慎,仍然是可能的,例如:通过调整此 UL SE 问答)。

加载br_netfilter(和net.bridge.bridge-nf-call-iptables = 1)会误导您认为正常的操作方式是过滤知识产权家庭中的筛选/向前钩。这不是正常情况,而且nftables缺乏其他功能,例如iptablesphysdev匹配模块:相反,目标一直是在本地执行此操作家庭 而不 依赖br_netfilter.

答案2

如果您的 Linux 主机作为路由器运行,您也需要配置 ip_forwarding。

要回答您的问题,您可以像这样使用 nftables:

#!/usr/bin/nft 

flush ruleset

table inet my_table {
   chain INPUT {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   }

chain FORWARD {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   } 

}

并使用 nft -f /path/to/your/nft.file 执行此操作

不过这有点没用(我知道你正在学习 nftables,不要太在意)。最佳做法是丢弃所有内容,只允许需要的内容,因此不是丢弃特定流量,而是允许特定流量。

我发现 Red Hat 8 文档对于 nftables 非常有用,也许你可以像我一样从中学到很多东西:

rhel 8 nftables 文档

相关内容