我正在测试 NFtables,并尝试在具有 ens37 和 ens38 2 个接口的 Linux 计算机上设置基本路由防火墙。这是这 2 个接口的 ifconfig 输出。
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.3 netmask 255.255.255.0 broadcast 192.168.0.255
ether 00:0c:29:74:33:e7 txqueuelen 1000 (Ethernet)
RX packets 20 bytes 2524 (2.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 156 bytes 9952 (9.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens38: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.4 netmask 255.255.255.0 broadcast 192.168.0.255
ether 00:0c:29:74:33:f1 txqueuelen 1000 (Ethernet)
RX packets 147 bytes 9340 (9.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 18 bytes 1672 (1.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我想将 ens38 模拟为 WAN 端口,并阻止所有非 LAN 发起的入站流量,但允许 LAN 流量出站。
我在以下位置设置了这些规则/etc/nftables.conf
:
#!/usr/sbin/nft -f
flush ruleset
table ip filter {
# allow all packets sent by the firewall machine itself
chain output {
type filter hook output priority 100; policy accept;
}
# allow LAN to firewall, disallow WAN to firewall
chain input {
type filter hook input priority 0; policy accept;
iifname "ens37" accept
iifname "ens38" drop
}
# allow packets from LAN to WAN, and WAN to LAN if LAN initiated the connection
chain forward {
type filter hook forward priority 0; policy drop;
iifname "ens37" oifname "ens38" accept
iifname "ens38" oifname "ens37" ct state related,established accept
}
}
为了测试规则是否成功,我使用 netcat 设置一个侦听器:
nc -lp 80 -s 192.168.0.3
然后我使用 netcat 从另一个接口进行连接:
nc 192.168.0.3 80 -s 192.168.0.4
我的问题是这些 nftables 规则不会阻止来自模拟 WAN 端口的流量。 netcat 连接双向工作得非常好,这不是我想要的。
如果我运行nft list table filter
,我会得到我期望看到的输出规则。
我是 nftables 的新手,如何才能让这些规则针对这两个接口正确运行?我目前的方法有什么问题?
答案1
首先,我会从另一台主机而不是同一台机器进行测试,您通常需要进行特殊配置才能将“同一主机”流量正确分类为“输入”。
另外,您的 WAN 和 LAN 位于同一网络范围内似乎很奇怪,当然 IP 网络中没有正常的定义,但您使用的是“相关”和“已建立”,它们通常是 NAT 的一部分。