创建从一个本地端口到另一个本地端口的隧道的简单方法?

wai*_*ain 110 networking tcp port-forwarding tunneling

我有一个开发服务器,只能从 127.0.0.1:8000 访问,不能从 192.168.1.x:8000 访问。作为一个快速的黑客,有没有办法设置一些东西来监听另一个端口(比如 8001),这样我就可以从本地网络连接 192.168.1.x:8001 并且它会在客户端和 127.0 之间建立流量隧道.0.1:8000?

Sté*_*las 138

随着socat在服务器上:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000
Run Code Online (Sandbox Code Playgroud)

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

与您要代理的连接套接字相同,您可以使用任何地址代替localhost,并替换tcptcp4或者tcp6如果您想将地址解析限制为 IPv4 或 IPv6 地址。

请注意,对于侦听端口 8000 的服务器,连接将显示为来自代理(在 的情况下localhost,将是localhost),而不是原始客户端。您需要使用DNAT 方法(但需要超级用户权限)才能让服务器知道谁是客户端。

  • 谢谢,这很棒,因为您不必运行本地 ssh 服务器。 (4认同)
  • @Phate,请参阅[告诉 socat 侦听来自单个 IP 地址的连接](//unix.stackexchange.com/q/210741)(以及“socat”手册页中的“range”和“tcpwrap”选项)。 (2认同)
  • 这个解决方案比下面的`nc.traditional`解决方案更好,这个解决方案在几次连接后没有断开 (2认同)

pen*_*359 67

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

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

这会将您工作站上的本地端口 8001 转发到 remote-server.com 端口 8000 上的本地主机地址。这
-g意味着允许我网络上的其他客户端连接到我工作站上的端口 8001。否则,只有工作站上的本地客户端才能连接到转发端口。
-N意味着我所做的只是转发端口,不要启动 shell。
-f意味着在成功的 SSH 连接和登录后分叉到后台。
端口 8001 将为许多连接保持打开状态,直到 ssh 终止或被终止。如果您碰巧在 Windows 上,优秀的 SSH 客户端 PuTTY 也可以做到这一点。使用 8001 作为本地端口和 localhost:8000 和目的地,并在设置中添加本地端口转发。成功连接 PuTTY 后即可添加。

  • @AlexanderTaylor `-N` 并不意味着没有 SSH 连接。它只是意味着“不执行远程命令”(参见 [手册页](https://linux.die.net/man/1/ssh))。`<user>@<host>` 参数是必要的,因为这 _does_ 打开到 `<host>` 的 SSH 连接(对于 OP 的情况是 `localhost`),并转发所需的端口 _through_ SSH 隧道。这是 OP 问题的一种解决方案,但不是最简单的。要在不使用 ssh 的情况下转发到 localhost,您可以使用 `socat` 或 `netcat`,如 StephaneChazelas 和 not-a-user 的答案 (5认同)
  • `user@remote-server.com` 有什么作用?端口转发绝对不需要它,但是 ssh 要求有这个参数,更重要的是,它试图连接到那里。将这个讨厌的选项设置为主机名后,它会输出`...端口 22:连接被拒绝` *(不,我没有使用 22 端口)*。除非我遗漏了什么,否则该命令显然不起作用。 (4认同)

not*_*ser 61

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

nc -l -p 8001 -c "nc 127.0.0.1 8000"
Run Code Online (Sandbox Code Playgroud)

此版本在 Ubuntu 上ncnetcat-traditional软件包中。(你必须update-alternatives或调用它nc.traditional。)

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

  • `busybox` 中包含的 `netcat` 版本的模拟:`nc -v -lk -p 8001 -e /usr/bin/nc 127.0.0.1 8000`。([参数说明](https://www.busybox.net/downloads/BusyBox.html#nc)) (4认同)
  • 我收到此错误:`nc: 无法在 CentOS 6.4 上使用 -p 和 -l`。有解决办法吗? (4认同)
  • 有人知道`netcat-openbsd` 上的等价物吗? (3认同)
  • 工作,但 `nc` 命令在第一次远程连接后结束。如果需要保持运行,请添加 `-k`。 (2认同)

小智 34

OpenBSD netcat 默认在 Linux 和 OS X 上可用。

操作系统:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
Run Code Online (Sandbox Code Playgroud)

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe
Run Code Online (Sandbox Code Playgroud)

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

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0
Run Code Online (Sandbox Code Playgroud)


小智 5

在 ServerFault 上引用David Spillett回答

rinetd 应该可以完成这项工作,并且可以从http://www.boutell.com/rinetd/获得它的 Windows 二进制文件(对于在 Linux 下寻找相同内容的任何人,rinetd 位于几乎每个发行版的标准存储库中因此可以使用“apt-get install rinetd”或“yum install rinetd”或类似工具进行安装)

它是一个简单的二进制文件,采用以下格式的配置文件

bindaddress bindport connectaddress connectport

例如:

192.168.1.1 8001 127.0.0.1 8000

或者

0.0.0.0 8001 127.0.0.1 8000

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