假设有一个安装了 Debian 11 和 nftables 的自定义路由器(Raspberry Pi 盒),具有单个物理以太网接口和配置的以下 VLAN:
- eth0.501 192.168.41.0/24 CCTV 摄像机
- eth0.502 192.168.42.0/24 家庭自动化
- eth0.503 192.168.43.0/24 访客网络(连接单独的 WiFi AP)
- eth0.504 192.168.44.0/24 个人可信网络,可在 Samba 共享上免费获取敏感数据
- eth0.505 192.168.45.0/24 光纤 ONT 网络(可由 ISP 远程访问)
期望的政策是:
- CCTV 无法访问任何其他网络,但可以通过家庭自动化和个人信任网络访问,而不能通过其他网络访问。
- 家庭自动化只能访问闭路电视和互联网,只能通过个人信任网络访问。
- 访客只能访问互联网,只能通过个人信任网络访问。
- 个人信任网络根本无法从外部访问,但可以访问所有其他网络。
- 光纤 ONT 网络只能被部分其他网络访问(如上所述),但其本身无法访问任何一个。
我说的“无访问权限”是指完全无法看到,甚至无法 ping。这是此处 VLAN 的要点,但 Pi 路由器会让任何人看到所有人,除非受到 nftables(或 iptables,我不想处理)的限制。
相反,当授予网络访问权限时,为简单起见,我们假设允许所有 IP、端口和协议。
有人能举一些例子说明如何从头开始配置 nftables 以实现上述目标吗?需要设置哪些表、链和过滤器?
答案1
你确实不需要任何特殊的表或链:
从您的操作系统通常在分布式 /etc/nftables.conf 示例中填写的默认“inet filter”表中的默认链开始
forward
- 换句话说,相当于 iptables 的内置“FORWARD 链”。ct state {established, related} accept
如果尚未添加常用的 conntrack 规则,请添加。这将处理反向返回的回复。ip saddr ... ip daddr ... accept
完全按照您的描述添加一系列规则。(不过,也许首先将“X 可以被 Y 访问”改写为“Y 可以访问 X”以使事情更加一致。)“可以访问互联网,但不能访问局域网”可以写成
ip daddr != 192.168.0.0/16
。ip6 saddr
IPv6 需要第二条带有/ 的规则ip6 daddr
。define guest = 192.168.43.0/24
在 nftables.conf 的顶部定义 $macros 使用来更清楚地说明地址或接口的含义。您可以在可以使用值的任何地方使用内联集
{x, y, z}
,以便单个规则可以允许来自多个源和/或到多个目的地。
如果这是唯一的网关,基于接口的规则
iifname "..." oifname "..." accept
可能比基于 IP 的规则更简单。最后在末尾添加
drop
或规则。(我更喜欢“使用 icmpx admin-prohibited 拒绝”。)reject
希望您的 Pi 是最新型号,并且以太网端口不再通过 USB 连接。