我正在设置一个需要通过 SSH2 建立安全连接的服务器应用程序,例如客户端必须打开与服务器的 SSH2 连接才能到达特定的应用程序:
% ssh -s -p5000 my.server.com app
我想了解,此命令完成后究竟发生了什么?客户端/服务器如何知道它们必须通过 SSH 安全通道运行?这称为 ssh 隧道,还是有不同的名称?
谢谢。
答案1
% ssh -s -p5000 my.server.com app
连接到 my.server.com,然后在 my.server.com 中运行“app”子系统
客户端/服务器如何知道他们必须通过 SSH 安全通道运行?
SSH 安全通道有点令人困惑:SSH 已经很安全了。安全通道可以是 VPN。
请注意,SSH 隧道和 VPN 不是一回事:
- VPN 在传输层(连接网络)工作,而 SSH 隧道在应用程序层(连接主机)工作。
- VPN 可以是硬件实现的,也可以是软件实现的,而 ssh 隧道始终是软件实现的。
- 您可以在 VPN 内运行 ssh。
答案2
您正在连接到tcp my.server.com:5000
,它在那里运行 ssh 子系统“app”。正在执行的操作由该子系统定义(在 ssh 服务器配置文件中)。该子系统可以通过 stdin 和 stdout 来回传输数据。外部对手会看到 tcp 连接,看到这是 ssh 会话,仅此而已。这不称为“ssh 隧道”。
隧道是指您像这样转发某个 TCP 套接字:ssh firewall -L 12345:system-behind:54321
,然后在本地连接到localhost:12345
,它就像您坐在防火墙上并system-behind:54321
从那里连接到一样。您通过 ssh“隧道化”tcp 连接。通过添加 -g,您可以允许网络中的任何人连接到防火墙you:12345
,就像连接到system-behind:54321
防火墙一样。
例如,假设 Linux 防火墙执行 NAT 并带有 ssh 服务器,后面还有一些 Windows 服务器,该服务器有防火墙,只允许来自本地网络的连接。您可以像这样连接:ssh firewall -L 13389:windows-server-address:3389
然后xfreerdp /v:localhost:13389
;服务器将看到来自防火墙本地地址的连接,而不是来自您的互联网地址的连接。
您可以使用 反向执行此操作ssh remote -R 12345:system-near-you:54321
。然后打开远程套接字,远程用户就可以连接到localhost:12345
并最终像他们坐在您的机器上并连接到 一样连接system-near-you:54321
。这是反向隧道。同样,-g 不仅允许直接位于远程的用户执行此操作,还允许任何可以连接到 的用户执行此操作remote:12345
。
还有 ssh ip 隧道,当您在服务器和客户端上创建虚拟隧道接口时,分配它们的 ip 地址并使用 ssh 连接它们。这称为 VPN,但使用 ssh 机制执行时不太方便,而且我从未见过有人使用这种技术。