我有一个开发服务器,只能从127.0.0.1:8000而不是192.168.1.x:8000访问。作为一个快速的技巧,是否可以设置某种方法来监听另一个端口(例如8001),以便从本地网络连接192.168.1.x:8001,它将在客户端和127.0之间建立隧道传输.0.1:8000?

评论

netcat可以做到这一点。

有什么可以在Android设备上运行的吗?还是Android的限制阻止了这种解决方案?

#1 楼

使用ssh是最简单的解决方案。


ssh -g -L 8001:localhost:8000 -f -N user@remote-server.com


这会将您工作站上的本地端口8001转发到remote-server.com端口8000上的本地主机地址。-g表示允许网络上的其他客户端连接到我工作站上的端口8001。否则,只有工作站上的本地客户端可以连接到转发的端口。 -N意味着我要做的只是转发端口,而不启动外壳。 -f表示成功建立SSH连接并登录后进入后台。
端口8001将为许多连接保持打开状态,直到ssh死掉或被杀死。如果您碰巧在Windows上,出色的SSH客户端PuTTY也可以做到这一点。使用8001作为本地端口,使用localhost:8000和目标,并在设置中添加本地端口转发。您可以在与PuTTY成功连接后添加它。

评论


user@remote-server.com是做什么的?绝对不需要端口转发,但是ssh要求使用此参数,而且还要尝试在此处进行连接。并将此讨厌的选项设置为主机名后,它输出…端口22:连接被拒绝(不,我没有使用22端口)。除非我丢失了某些内容,否则该命令显然是行不通的。

– Hi-Angel
16年1月1日于13:43

@ Hi-Angel user@remote-server.com只是一个示例,您不应从字面上理解它。您必须用要连接的计算机名称和此计算机上的用户名替换它。建立ssh连接需要此信息。只有在建立ssh连接后,才能通过此连接转发端口。

–彼得·多布罗格斯特(Piotr Dobrogost)
17年2月1日在23:45

如果您希望端口在引导时可用,请使用上述方法在systemd服务中查看“ autossh”-everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh

–理查德·霍利斯(Richard Hollis)
17-10-27在13:03

我也得到“连接被拒绝”。而且我仍然不明白为什么在不涉及SSH连接时(根据-N)为什么需要user@remote-server.com参数。应该只是转发数据包。

–亚历山大·泰勒(Alexander Taylor)
17年10月10日在7:42

@AlexanderTaylor -N并不意味着没有SSH连接。这仅表示不执行远程命令(请参见手册页)。 @ 参数是必需的,因为这确实会打开与的SSH连接(对于OP来说,它是localhost),并通过该SSH隧道转发所需的端口。这是解决OP问题的一种方法,但不是最简单的方法。要在不使用ssh的情况下转发到localhost,可以像在StephaneChazelas中那样使用socat或netcat,而不是一个用户的答案

–user143943
18年4月18日在11:35



#2 楼

在服务器上使用socat时:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000


默认情况下,socat将在计算机上任何IPv4或IPv6地址(如果支持)上的TCP端口8001上侦听。您可以通过将tcp-listen替换为tcp4-listentcp6-listen来将其限制为IPv4 / 6,或者通过添加,bind=that-address来将其限制为特定的本地地址。

与您代理的连接套接字相同,您可以使用任何地址代替localhost,如果要将地址解析限制为IPv4或IPv6地址,请用tcptcp4替换tcp6。请注意,对于侦听端口8000的服务器,连接显示为来自代理(对于localhost,将是localhost),而不是原始客户端。您需要使用DNAT方法(但是这需要超级用户特权),服务器才能知道谁是客户端。

评论


谢谢,这很好,因为您不必运行本地ssh服务器。

– jontro
2015年12月15日15:11

我可以使用相同的端口但使用不同的地址吗?

–阿莫斯
17年2月14日在4:35

@amos,请参阅编辑。

–StéphaneChazelas
17年2月14日在18:23

是否还可以仅转发来自特定IP的流量?

– Phate
18年8月23日在18:05

@Phate,请参见告诉socat监听来自单个IP地址的连接(以及socat手册页中的range和tcpwrap选项)。

–StéphaneChazelas
18年8月23日在18:38



#3 楼

使用传统的nc是最简单的解决方案:

nc -l -p 8001 -c "nc 127.0.0.1 8000"


此版本的nc在Ubuntu的netcat-traditional软件包中。 (您必须update-alternatives或将其命名为nc.traditional。)

请注意,与ssh相比,它未加密。如果您在一台主机之外使用它,请记住这一点。

评论


有人知道netcat-openbsd上的等效功能吗?

– Sridhar Sarnobat
17年7月23日在18:20

busybox中包含的netcat版本的模拟:nc -v -lk -p 8001 -e / usr / bin / nc 127.0.0.18000。(参数说明)

–伊凡·科尔米切克(Ivan Kolmychek)
18年3月16日在13:30



工作正常,但是nc命令在第一个远程连接后结束。如果需要保持运行,请添加-k。

– Sopalajo de Arrierez
18年6月20日在23:49



我收到此错误:nc:在CentOS 6.4上不能使用-p和-l。有没有解决的办法?

–尼克·普雷迪
18年7月16日在15:52

与ssh相比,我更喜欢这种解决方案,因为当需要本地转发特权端口时,它更易于用作root用户。

–基督徒
18年8月15日在0:58

#4 楼

默认情况下,OpenBSD netcat在Linux和OS X上都可用。

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &


Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe


在OS X bash上有效的另一种方法是使用双向管道。它可能适用于其他Unix:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0


评论


起初我没有注意到您正在使用openbsd netcat。这比必须从Ubuntu软件包中安装另一个netcat更好。

– RobertR
15年2月26日在15:24

OpenBSD示例在Ubuntu 15.04上失败。使用shell重定向,netcat无法打开端口进行监听,如ss -tan或netstat -tan所示。

–贾斯汀C
2015年9月3日,0:12

⁺¹。 FTR:另一种方法可在Ubuntu上使用

– Hi-Angel
16-11-30在10:41

我不明白您的解决方案。你能解释一下吗?

–三角龙
17年9月19日在8:21

@trismegistos在这些示例中,netcat侦听器和客户端将输入重定向到某些共享文件(mkfifo管道..先进先出),并将这些共享文件用作其输入/输出的源/目标,从而有效地创建了隧道。通常使用客户端/侦听器,但是某些使用客户端+客户端/侦听器+侦听器的技术-wiki.securityweekly.com/…,必须阅读slideshare.net/amiable_indian/secrets-of-top-pentesters。

– Info5ek
17-10-4在18:02

#5 楼

iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart


评论


在尝试连接到dport时,如nc -v localhost 2345一样,我得到了Connection拒绝。我在iptables中不是很好,但是我猜dport必须有一个监听应用程序。

– Hi-Angel
16年1月1日在12:49

如果origin-port与目标端口位于不同的接口上怎么办?

–三角龙
17年9月19日在8:19

#6 楼

在ServerFault上引用David Spillett的答案


这是一个简单的二进制文件,采用格式为

bindaddress bindport connectaddress connectport

的配置文件,例如:

192.168.1.1 8001 127.0.0.1 8000



0.0.0.0 8001 127.0.0.1 8000

如果要将输入端口绑定到所有接口。

#7 楼

根据Mark A.的回答,我必须进行一些小调整才能使其在Mac上运行(至少在macOS Mojave版本10.14.4上)。
/>那个printf语句似乎很关键。否则,连接到端口8000的netcat命令将永远不会真正尝试连接,而监听端口8001的netcat命令也将永远不会真正监听端口8001。如果没有printf,每次尝试连接端口8001时,我都会连接被拒绝。

我的假设是netcat必须在实际执行任何Socket操作之前以某种方式阻塞stdin(也许出于某种原因试图读取它)。因此,如果没有将printf语句写入fifo a,netcat命令将永远不会开始在端口8001上侦听。还没有。

#8 楼

这是在服务器上建立两个udp端口的新方法:
https://github.com/9crk/udpeer

udpeer 8001 8002

要测试:

nc -u xxxx.com 8001
nc -u xxxx.com 8002