设置:Ubuntu 20.04,使用 brctl 创建网桥“br0”,并为其添加三个物理端口:enp10s0、enp7s0 和 enp5s0。
期望:enp5s0 和 enp7s0 应该能够在网桥上畅通无阻地相互通信(最终,将不止这两个,所以我试图让规则尽可能简单)。enp10s0 是“外部世界”链接,我想将允许进入网桥的内容列入白名单,但只能从该端口进入。我有一个工作正常的黑名单,但白名单却让我受阻。
flush ruleset
table bridge drawbridge {
chain input {
type filter hook input priority 0;
}
chain forward {
type filter hook forward priority 0;
iifname "enp10s0" tcp dport 3389 ct state new,established accept
iifname "enp10s0" drop
}
chain output {
type filter hook output priority 0;
}
}
这应该(我认为)允许插入 enp10s0 的 Windows 远程桌面 (tcp 3389) 与桥接器上的任何笔记本电脑通信,但放弃其他一切。如果我刷新规则集,它就会工作,因此桥接器可以工作,笔记本电脑已配置,但是一旦我应用上述规则,它就会停止工作。
A黑名单的:
iifname "enp10s0" tcp dport 3389 drop
...工作正常。我仍然可以 ping 它,但无法远程桌面。将 icmp 作为黑名单也可以正常工作。我可以远程桌面,但无法 ping。所以我的 nftables 似乎没问题,只是不能作为白名单。
(为了消除“windows 远程桌面”的问题,我还尝试了同样的方法,使用 ping:白名单iifname“enp10s0”icmp类型回显请求接受和iifname“enp10s0”icmp类型echo-reply接受和iifname“enp10s0”删除,但这也不起作用。但是,作为黑名单工作——策略接受,并且只丢弃这两个 icmp 东西。在那里按预期工作。)
我怎样才能将“enp10s0”列入白名单处理,但仅限于“enp10s0”?
答案1
该问题与 ARP 有关,而不是与 IPv4 有关。
如果有任何来自以下端口(TCP 目标端口 3389 除外)的enp10s0被丢弃,则任何 ARP 类型的帧都将被丢弃。因此,enp10s0一方将无法向其他端口上的系统发送 ARP 查询,并且永远无法发现与它需要向其发送流量的 IPv4 地址相关联的正确 MAC 地址。通常它会收到没有到主机的路由3秒内出错。
因此,应该在通用丢弃规则之前插入一条允许 ARP 流量的规则。
flush ruleset
table bridge drawbridge {
chain input {
type filter hook input priority 0;
}
chain forward {
type filter hook forward priority 0;
iifname "enp10s0" tcp dport 3389 ct state new,established accept
iifname "enp10s0" ether type arp accept
iifname "enp10s0" drop
}
chain output {
type filter hook output priority 0;
}
}
我还认为应该启用相关流量。但由于此相关流量不会在端口 3389 上(但如果发生,则可能是相关 ICMP 错误),因此应该稍微重写规则集。进行一些分解,例如像这样:
table bridge drawbridge
delete table bridge drawbridge
table bridge drawbridge {
chain from_enp10s0 {
ct state established,related accept
tcp dport 3389 accept
ether type arp accept
drop
}
chain forward {
type filter hook forward priority 0; policy accept;
iifname "enp10s0" jump from_enp10s0
}
}
注意:出于类似的原因,IPv6 将会失败,除非也允许使用 ICMPv6 meta l4proto ipv6-icmp accept
,或者至少允许使用所需的子集新民主党,IPv6 的 ARP 等效物。