使用 nftables 进行端口转发和 NAT

使用 nftables 进行端口转发和 NAT

我有一个 OpenWRT 网关(自建 19.07,内核 4.14.156),位于我的专用网络前面的公共 IP 地址上。我正在使用 nftables (不是iptables)。

我想在公共地址上公开一个非标准端口,并将其转发到网关后面的计算机上的标准端口。我认为这曾经被称为端口转发:看起来您的网关机器正在提供 http 服务,但它实际上是网关后面的私有地址上的机器。

这是我的 nftables 配置。出于这些目的,我的“标准服务”位于端口 1234 上,并且我希望允许公众通过网关:4321 访问它。

#!/usr/sbin/nft -ef
# 
# nftables configuration for my gateway
#

flush ruleset

table raw {
        chain prerouting {
                type filter hook prerouting priority -300;
                tcp dport 4321 tcp dport set 1234 log prefix "raw " notrack;
        }
}

table ip filter {
        chain output {
                type filter hook output priority 100; policy accept;
                tcp dport { 1234, 4321 } log prefix "output ";
        }

        chain input {
                type filter hook input priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "input " accept;
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "forward " accept;
        }
}

table ip nat {
        chain prerouting {
                type nat hook prerouting priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200;
        }

        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                tcp dport { 1234, 4321 } log prefix "nat-post ";
                oifname "eth0" masquerade;
        }
}

使用此设置,外部计算机可以访问位于 的私有计算机gateway:1234。日志记录显示nat-preSYN 数据包从外部到网关 IP,然后forward从外部到内部 IP,然后nat-post从外部到内部,“现有连接”负责处理其余数据包。

外部机器连接到gateway:4321日志为raw,其中 4321 更改为 1234。然后 SYN 数据包被转发到内部服务器,回复 SYN 数据包返回,然后......什么也没有!

我认为问题在于我没有进行 nftables 配置,该配置会将远程计算机所期望的更改internal:1234回。gateway:4321即使masquerade更改internal:1234gateway:1234,远程计算机也不会预料到这一点,并且可能会转储它。

对于这个配置有什么想法吗?

答案1

您没有翻译端口号。当外部连接到端口 1234 时,这不是问题。但是当到达 4321 时,dnat 会传递到内部服务器上的端口 4321,而不是端口 1234。尝试

tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200:1234;

您不需要翻译从内部服务器返回的回复数据包。这是使用在第一个 syn 数据包上创建的连接跟踪表中的条目自动完成的。

相关内容