我有一台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缺乏其他功能,例如iptables‘physdev
匹配模块:相反,目标一直是在本地执行此操作桥家庭 而不 依赖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 非常有用,也许你可以像我一样从中学到很多东西: