通过 nftables 防火墙的静态路由

通过 nftables 防火墙的静态路由

我有一个带有 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 rulesetshould分别改为:

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 ...)。

相关内容