为什么这个执行端口转发的 iptables 规则不起作用?

为什么这个执行端口转发的 iptables 规则不起作用?

我有一个绑定到的服务器localhost:7060。它使用 ipv6 套接字而不是 ipv4。以下是 netstat 输出。

# netstat -an
Proto Recv-Q Send-Q Local Address          Foreign Address        State
 tcp       0      0 10.200.32.98:1720      0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:4122           0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:4123           0.0.0.0:*              LISTEN
 tcp       0      0 127.0.0.1:4123         127.0.0.1:43051        ESTABLISHED
 tcp       0      0 10.200.32.98:5555      10.200.32.44:53162     ESTABLISHED
tcp6       0      0 :::5060                :::*                   LISTEN
tcp6       0      0 ::ffff:127.0.0.1:7060  :::*                   LISTEN
tcp6       0      0 :::23                  :::*                   LISTEN
tcp6       0      0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.142:43505 ESTABLISHED
tcp6       0      0 ::ffff:127.0.0.1:43051 ::ffff:127.0.0.1:4123  ESTABLISHED
tcp6       0      0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.44:53195 ESTABLISHED
udp6       0      0 :::5060                :::*                   CLOSE
# 

我想设置一个端口转发规则,接受端口 24 上的连接(在所有接口环回以及 eth0 上)并将数据转发到localhost:7060

这是我设置 iptables 规则的方式:

iptables -t nat -A PREROUTING -p tcp --dport 24 -j DNAT --to 127.0.0.1:7060**

它不起作用。当我从不同的框进行 telnet 时,我看到以下内容

$telnet 10.200.32.98 24
尝试 10.200.32.98...

如果我更改要绑定的服务器*:7060并设置以下规则,它似乎工作正常。

iptables -t nat -A PREROUTING -p tcp --dport 24 -j REDIRECT --to-port 7060

但这会使得我的服务器在 WAN 接口上可用,这是我不喜欢的。

我觉得这与 ipv6 套接字有关(netstat 输出中的 tcp6 行)。整个过程是在具有自定义 Android 平台映像的 Android 设备上完成的。

我怎样才能让它工作?

答案1

当响应数据包从端口7060返回并发送到路由器时,这些数据包也需要对其进行发送方掩码操作,将这些数据包的源地址屏蔽为路由器的地址(127.0.0.1),端口为24。因此需要添加SNAT iptables规则才能使其正常工作。

iptables -t nat -A POSTROUTING -p tcp --sport 7060 -j MASQUERADE --to-ports 24

即使数据包是由 localhost 生成的,它也会进入 POSTROUTER 链。REDIRECT 操作会自动为您完成这两件事,但如果您的服务位于本地网络中的另一台服务器上,则必须使用 SNAT 和 DNAT。

答案2

我认为你必须使用--sport 24而不是--dport 24,因为交通传入,不外向。尽管,作为加勒特说,可能你必须使用ip6tables...

相关内容