Blog icon indicating copy to clipboard operation
Blog copied to clipboard

ssh 隧道

Open codcodog opened this issue 3 years ago • 0 comments

ssh 隧道

ssh 隧道,或者叫 ssh 端口转发,主要有三种类型:

  • 本地端口转发
  • 远程端口转发
  • 动态端口转发

本地端口转发

本地端口转发可以将本地(ssh 客户端)计算机上的端口请求转发到服务器端(ssh 服务端),
再由服务器端转发到目标机器的端口上.

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

远程端口转发

远程端口转发与本地端口转发相反,是将 ssh 服务器端侦听的端口请求转发到本地(ssh 客户端)计算机,
再由本地计算机转发到目标机器的端口上.

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

动态端口转发

动态端口转发可以充当一个简单的 socks 代理服务器.
当客户端连接到该端口时,连接将转发到服务器端(ssh 服务端),再由服务器端转发到目标计算机上的端口.

ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER

例如,在端口 1080 创建 socks 隧道,再配置好 SwitchyOmega,就可以愉快地爬梯子了.

$ ssh -D 1080 -N -f user@server

-N 不要执行远程命令
-f ssh 命令后台运行

应用场景

有 A, B, C 三台服务器,其中 A, C 网络不通,而 A, B 可以连接,B, C 网络也可以连接.

在 A 服务器上有个程序 a

$ curl localhost:8080/a
Hello World.

若要 C 服务器也能访问 A 服务上的程序 a,则需要通过 B 服务器进行中转.

在 A 服务器上进行远程端口转发

$ ssh -R 8080:127.0.0.1:8080 -N -f root@B

这个命令就是将 B 服务器上 8080 端口的请求转发到 A 服务器上,然后 A 再转发到 127.0.0.1:8080.

这样 C 通过 B 服务器就可以访问到 A 上的程序 a 了

$ curl http://B:8080/a
Hello World.

注意
若端口转发失败,则 ssh 服务器端 /etc/ssh/sshd_config 需要配置 GatewayPortsyes,再重启 ssh

$ systemctl restart sshd.service

参考

如何设置SSH隧道

codcodog avatar May 08 '21 15:05 codcodog