SSH Tunnel
本地转发
本地主机通过 SSH Tunnel 访问远程主机的服务。(本地 -> 远程)
用例:远程服务器在 8888 端口启动了 JupyterLab 服务,本地主机访问本地 80 端口连接到远程服务器的 JupyterLab 服务。
ssh -CNf -L 80:127.0.0.1:8080 USER@HOST # 本地 80 -> 远程 8888
此时访问本地主机的 80 端口将会被转发到远程主机的 127.0.0.1:8888 端口。
-L: 本地转发-C: 此标志启用压缩,有助于减少资源消耗并加快速度。-N: 不发送任何命令,只用来建立连接。-f: 将 SSH 连接放到后台。避免长时间不用 SSH 连接时终端失去响应
可以通过 ps 命令找到 ssh 进程并通过 kill 命令来关闭隧道。
配置文件
可以通过配置文件来简化隧道的建立。编辑 ~/.ssh/config:
Host local-forward
HostName example.com
User my_user
IdentityFile ~/.ssh/my_private_key
LocalForward 80 127.0.0.1:8888
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 2
Host local-forward:这是这个连接配置的别名,用在ssh命令中作为目标主机的参数。HostName example.com:实际主机名或 IP 地址。User my_user:远程服务器的用户名。IdentityFile ~/.ssh/my_private_key:用于身份验证的私钥文件路径。LocalForward 80 127.0.0.1:8888:将本地机器的 80 端口转发到远程机器的 8888 端口。当你在本地机器上访问 127.0.0.1 的 80 端口时,实际上是通过 SSH 隧道访问远程机器上的 8888 端口。Compression yes: 启用数据压缩。ServerAliveInterval 60:每 60 秒向服务器发送一次保活消息。ServerAliveCountMax 2:在认定服务器不响应之前,允许发送保活消息的最大次数。
远程转发
远程主机通过 SSH Tunnel 访问本地主机的服务。(远程 -> 本地)
用例:内网服务器通过本地主机的 Clash 服务访问公网。
ssh -CNf -R 7000:127.0.0.1:7890 USER@HOST # 远程 7000 -> 本地 7890
此时远程主机访问 7000 端口会被转发到本地主机的 7890 端口,如果你在本地开启了 Clash 服务,那么远程主机就能通过这个 Clash 服务联网。
配置文件
Host reverse-forward
HostName example.com
User my_user
RemoteForward 7000 127.0.0.1:7890
RemoteForward 7000 127.0.0.1:7890:将远程服务器的7000端口转发到本机的127.0.0.1:7890端口。访问远程服务器的7000端口就像访问本地的127.0.0.1:7890端口一样。
动态转发
详见 socks5 代理
ssh -CNf -D 7890 USER@HOST
此时如果在本地配置代理服务器为 socks5://HOST:7890,则所有请求都将由远程主机代理发送。
配置文件
Host dynamic-forward
HostName example.com
User my_user
DynamicForward 7890
DynamicForward 7890: 启用动态端口转发,并绑定本地的 7890 端口。
参见:Port Forwarding | Termius Support
Troubleshooting
setsockopt TCP_NODELAY: Invalid argument
在 SSH 转发的过程中出现错误:
setsockopt TCP_NODELAY: Invalid argument
问题原因:与 localhost 被解析为 IPv6 地址有关
解决方法:设置 SSH 转发时使用 127.0.0.1 代替 localhost。
ssh -CNf -R 7000:127.0.0.1:7890 USER@HOST
参见:SSH Remote Port Forwarding Empty Response | Stack Overflow

浙公网安备 33010602011771号