SSH 不只是远程登录:它还能当隧道。-L 把本地端口变成远处的服务,-R 把近处的服务暴露到远处。这篇在本机实现一个会转发的 SSH 服务器,验证两个方向的转发、多个连接怎么共用一条 SSH 连接,以及隧道的代价。
客户端连本地 19172,发 b"hello through the tunnel",收到 b'ECHO:hello through the tunnel'——服务器端的目标回显服务器加了 "ECHO:" 前缀,说明数据真的到了目标并回来了 同时抓 SSH 服务器端口 19116 上的流量(lo0):共 432 字节;其中能找到明文 "hello through the tunnel" 吗?找不到;能找到目标端口号 19639 的十进制文字吗?找不到(目标地址和端口在加密的通道请求里) 从线路上看只是一条 SSH 连接;目标 127.0.0.1:19639 是 SSH 服务器“看到”的,不是在你的机器上直接可达的路径(本实验里恰好都在本机)
客户端监听本地端口,每个连接变成一个 direct-tcpip 通道,由服务器去连目标。目标地址只出现在加密的通道请求里。
请求服务器在 19518 上监听(tcpip-forward 全局请求);之后外部连 19518 发 b"knock knock",收到 b'CLIENT-SIDE:knock knock'——连接经 SSH 回到了客户端这一侧的目标 19585
客户端发 tcpip-forward 请求,服务器监听并把每个进来的连接通过 forwarded-tcpip 通道送回客户端。
20 个并发连接各自收到自己的回显:20 / 20 正确;它们全部复用同一条到 SSH 服务器的 TCP 连接(从 SSH 客户端 Transport 看:通道数是 SSH 的概念,TCP 连接数 1)
所有转发连接是同一条 SSH 连接里的不同通道。
直连 2 MB:[2, 1, 1] ms,中位 1 ms(≈ 1415 MB/s) 经隧道 2 MB:[11, 12, 12] ms,中位 12 ms(≈ 173.3 MB/s;paramiko 在纯 Python 里加密 + 解密,比直连慢很多,不代表 OpenSSH 的速度) netlab 每方向 25 ms、丢包 0%:直连(目标端口在受损范围里)2 MB [252, 305] ms;经隧道(只有 SSH 那条 TCP 受损,内层连接不受损)2 MB [211, 157] ms netlab 每方向 25 ms、丢包 2%:直连(目标端口在受损范围里)2 MB [615, 803] ms;经隧道(只有 SSH 那条 TCP 受损,内层连接不受损)2 MB [1015, 1163] ms
多一层加解密和窗口控制;受损的链路上隧道约慢 1.5 倍;0% 丢包的延迟链路上没有更慢。