![通过 nftables 防火墙的静态路由](https://linux22.com/image/782378/%E9%80%9A%E8%BF%87%20nftables%20%E9%98%B2%E7%81%AB%E5%A2%99%E7%9A%84%E9%9D%99%E6%80%81%E8%B7%AF%E7%94%B1.png)
我有一个带有 2 个 NIC 的网关“X”
enp0s3(192.168.0.100)连接到 192.168.0.0/24(假设这是一个 WAN 网络)
enp0s8(172.16.0.1)连接到 172.16.0.0/24(可能是 LAN 网络)
我已经使用 nftables 创建了 NAT 连接,以允许 LAN(172.16.0.0/24)中的主机通过网关“X”浏览互联网。
/etc/nftables/nftables_firewall
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state {established, related} accept
ct state invalid drop
iifname lo accept
iifname enp0s8 accept
ip protocol icmp accept
reject
}
chain forward {
type filter hook forward priority 0;
oifname enp0s3 accept
iifname enp0s3 ct state related, established accept
iifname enp0s3 drop
}
chain output {
type filter hook output priority 0;
}
}
/etc/nftables/nftables_nat
flush ruleset
table ip nat {
chain prerouting {
type nat hook prerouting priority 0;
}
chain postrouting {
type nat hook postrouting priority 0;
oifname enp0s3 masquerade
}
}
现在我需要一台主机(192.168.0.101),也就是一台笔记本电脑,从 WAN(192.168.0.0/24 网络)通过网关“X”访问 LAN(172.16.0.0/24 网络)中的主机。即我需要配置一条从 WAN 中的这台主机(192.168.0.101)到 LAN(172.16.0.0/24 网络)的静态路由。
这是我尝试通过其 wlo1 接口在 192.168.0.0/24 网络上的笔记本电脑上添加的静态路由
ip route add 172.16.0.0/24 via 192.168.0.100 dev wlo1
网关防火墙中的规则阻止这些数据包进入 172.16.0.0/24 网络。
我该如何在我的网关上允许这一点?
我知道防火墙规则丢弃了数据包,因为
测试
ping 172.16.0.2
运行时来自 192.168.0.101
tcpdump -lnni any src 192.168.0.101
来自网关“X”的回复
11:41:53.240815 IP 192.168.0.101 > 172.16.0.2: ICMP echo request, id 8, seq 1, length 64
11:41:54.243947 IP 192.168.0.101 > 172.16.0.2: ICMP echo request, id 8, seq 2, length 64
11:41:58.247687 ARP, Request who-has 192.168.0.100 tell 192.168.0.101, length 46
答案1
你的二规则集有一个缺陷:
flush ruleset
如果两者按顺序执行,则只flush ruleset
保留最后一个。
每个flush ruleset
should分别改为:
table inet filter
delete table inet filter
和:
table ip nat
delete table ip nat
每次获取一个幂等表定义,该定义不会在第一次使用时失败,也不会自我重复,也不会影响其他桌子。
现在关于这个问题,它很简单,只需在正确的位置插入一个前向规则以允许这样做:在删除规则之前,因此可以执行以下操作之一:
# nft insert rule inet filter forward index 2 ip saddr 192.168.0.101 ip daddr 172.16.0.0/24 accept
要不然:
# nft add rule inet filter forward index 1 ip saddr 192.168.0.101 ip daddr 172.16.0.0/24 accept
去测试,
或者直接在正确的位置编辑规则集以保留它:
...
iifname enp0s3 ct state related, established accept
ip saddr 192.168.0.101 ip daddr 172.16.0.0/24 accept
iifname enp0s3 drop
...
可以选择在规则中添加iifname enp0s3
(=> iifname enp0s3 ip saddr 192.168.0.101 ip daddr 172.16.0.0/24 accept
) 以提高安全性。
返回流量已由状态规则处理(... ct state related, established ...
)。