我正在寻找一些可以通过 TTY 样式链接远程转发套接字连接的软件。我有两台机器,A 和 B。我在 A 上有管理员权限,但没有 B 的管理员权限,但在机器 B 上,我可以运行不需要管理员权限的任意服务器软件。机器 A 没有公共 IP 地址,但机器 B 有。我能够建立从机器 A 到机器 B 的传出连接并通过它传输任意数据,但我需要的是一些可以在机器 B 上运行的软件,它将接受传入连接,将该连接中的数据发送到机器 A 上运行的进程,然后该进程将启动与机器 A 上运行的服务器的新连接。
不幸的是,我无法使用 ssh 来实现此目的,因为计算机 B 的管理员已将其配置为不允许转发。否则,ssh -R 4567:localhost:1234 machineb
从计算机 A 运行就可以实现我想要的效果。
有人知道其他方法吗?作为参考,机器 A 运行 Ubuntu Linux,机器 B 运行 OpenBSD,但我更喜欢一种可跨所有 unix 变体移植的解决方案。
答案1
您可以使用索卡特完成这项工作。您需要socat
在机器 A 上安装nc
(netcat
)并在机器 B 上安装(socat
也可以)。以下是如何处理的示例一个 TCP 连接(你可以阅读索卡特的文档来了解如何处理更多内容和定制行为)。
你应该在机器 A 上运行:
- 您想要公开给机器 B 的服务,假设是端口 8000 上的 Web 服务器(您可以通过运行
python3 -m http.server
或python2 -m SimpleHTTPServer
在任何您想要公开文件的目录中进行测试); - 索卡特在 STDIO 和到 B 的 SSH 连接之间重定向。到 B 的这个 SSH 连接将运行并
nc
监听特定端口。
因此,在机器 A 上的一个终端会话中运行:
python3 -m http.server
在机器 A 上的另一个终端会话中:
socat EXEC:'ssh user@machineb "nc -l -p 8888"' TCP4:localhost:8000
如果socat
在机器B上也有,则可以用nc
它替换:
socat EXEC:'ssh user@machineb "socat STDIO TCP-LISTEN:8888,reuseaddr"' TCP4:localhost:8000
解释概念:socat
将把命令的任何 stdin/stdout 重定向到( )ssh user@machineb "socat STDIO TCP-LISTEN:8888,reuseaddr"
上的 TCP 客户端连接。该命令将运行与计算机 B 的 SSH 连接并在那里运行,这会将连接到计算机 B 上本地端口 8888 的所有内容 ( ) 重定向到 stdin/stdout ( )。localhost:8000
TCP4:localhost:8000
socat
TCP-LISTEN:8888,reuseaddr
STDIO
是的,索卡特太棒了!