我有一个绑定到的服务器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
...