我可以从一个接口端口转发到另一个接口端口吗?

Posted

技术标签:

【中文标题】我可以从一个接口端口转发到另一个接口端口吗?【英文标题】:Can I port forward from one interface port to another interface port? 【发布时间】:2019-08-31 10:26:30 【问题描述】:

我正在“编程 TCP 套接字”并且有一些基本问题。

当我为一个 TCP 客户端指定一个 IP 地址和端口时,我知道这个 IP 地址属于一个网络接口而不是整个实际的计算机,并且计算机有多个网络接口,包括向内的本地主机环回接口。

指定给 TCP 客户端的端口是否属于指定的接口?例如,是否可以有两个相同编号的端口但在两个不同的接口上?像接口A的5000端口和接口环回的5000端口?

我问这个,因为我正在尝试创建一个 TCP 客户端,它将通过套接字连接到在 android 虚拟设备上运行的 TCP 服务器。 TCP客户端运行在机器A上,android模拟器运行在机器B上。

我查看了 Android 模拟器的端口转发,并了解到模拟器在虚拟路由器后面运行,并且我必须配置端口转发,以便 TCP 套接字连接可以从一个端口路由到另一个端口,但这些文档仅有关于如何从环回接口(所谓的本地主机)进行端口转发的说明,所以很明显,如果我尝试创建一个到不是环回接口的接口的套接字,我不会得到我的 TCP套接字转发到模拟器,我的 TCP 连接失败。

所以我想知道环回接口上的端口 5000 在向外的网络接口上是否有表亲端口 5000?

我想知道在某个低级别我是否可以从面向外的接口端口 5000 转发到环回接口端口 5000,然后转发到模拟器所在的端口。

这可能吗?

【问题讨论】:

【参考方案1】:

你可以使用端口转发软件

例如: 在 Windows 上

stcppipe.exe localhost port port

在 Mac 上

ipfw add fwd localhost,port tcp from any to any port via en0

在 Linux 上

iptables -t nat -A PREROUTING -p tcp -m tcp --dport21521 -j DNAT --to-destination192.168.0.211:1521

iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 192.168.0.211 -p tcp -m tcp --dport 1521 -j SNAT --to-source 192.168.0.132

【讨论】:

【参考方案2】:
adb -s emulator-5554 forward tcp:5000 tcp:6000
echo "1" > /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.ipv4.conf.enp0s31f6.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp --dport 5001 -j DNAT --to 127.0.0.1:5000
sudo iptables -A FORWARD -p tcp -d 127.0.0.1 --dport 5000 -j ACCEPT

【讨论】:

以上是关于我可以从一个接口端口转发到另一个接口端口吗?的主要内容,如果未能解决你的问题,请参考以下文章

iptables做端口转发

Linux端口转发到Socks代理

charles 端口转发

Iptables 端口转发 port forward

来自 C# 的端口转发

aws 弹性负载均衡器可以将端口 443 转发到端口 443 以获取弹性 beantalk 实例吗?