nftables 从 wlan0 转发到 eth0,但什么也没发生

nftables 从 wlan0 转发到 eth0,但什么也没发生

我有一台 Raspberry Pi,它通过 wlan0 连接到无线路由器,还有一台服务器连接到 eth0。这两个连接都正常工作。

Pi 和服务器之间的 eth0 是静态配置的,因此 Pi 的 eth0 的 IP 为 192.168.3.23/24,服务器的 IP 为 192.168.3.200/24。Pi 的 wlan0 的 IP 为 192.168.1.131/24。

现在,我正在尝试进行转发,以便在连接 Pi 的端口 88 时,它会转发到其后面的服务器。我已按照以下方式启用转发sysctl -a | grep forward

net.ipv4.conf.all.bc_forwarding = 0
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.default.bc_forwarding = 0
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.eth0.bc_forwarding = 0
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.eth0.mc_forwarding = 0
net.ipv4.conf.lo.bc_forwarding = 0
net.ipv4.conf.lo.forwarding = 1
net.ipv4.conf.lo.mc_forwarding = 0
net.ipv4.conf.wlan0.bc_forwarding = 0
net.ipv4.conf.wlan0.forwarding = 1
net.ipv4.conf.wlan0.mc_forwarding = 0
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

我也是nftables这么配置的:

table ip nat {
        chain prerouting {
                type nat hook prerouting priority dstnat; policy accept;
                tcp dport { 88, 443 } dnat to 192.168.3.200
        }

        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
        }
}

据我所知,这应该将 TCP 端口 88 和 443 转发到 192.168.3.200 的服务器,但什么也没发生。如果我这样做curl http://192.168.1.131:88,请求就会无限期挂起。但是,nftables 规则正在做一些事情,因为如果我刷新规则集,请求会立即被拒绝。

我这里遗漏了什么吗?

答案1

您的 NAT 规则未能指定数据包进入的接口(对于 DNAT )或传出的接口(对于 SNAT),因此它们适用于两个方向的所有路由流量,这不是您想要的。

您至少需要指定传入接口以使 DNAT 正常工作。例如:

                iif wlan0 tcp dport { 88, 443 } dnat to 192.168.3.200

您的链中完全缺少出站伪装规则postrouting。例如:

                oif wlan0 masquerade

答案2

使用目标 NAT 时,只会重写目标。源保持不变,因此到达服务器的任何数据包的源都在 192.168.1.0/24 中。

您的服务器可能没有到达 192.168.1.0/24 的路由;它只有到达 192.168.3.0/24 的路由。因此它放弃并丢弃该包。

有两种方法可以解决这个问题:

  1. 将 192.168.3.23 设备设置为服务器上的默认网关,并应用适当的防火墙设置。
  2. 也使用源 NAT,并重写转发的包的源和目标。

相关内容