Loading

通过ssh隧道实现tcp端口转发

场景

假设我(主机A)无法直接访问外网主机C,而局域网内另一台主机B可以访问外网主机C。
如何通过从我的主机A透过主机B访问主机C的22端口?

解决

ssh via ssh

最简单的方法是主机A先ssh到主机B然后在主机B执行ssh到主机C

ssh user@123.45.67.8
# in pts of host-B
ssh user@10.0.1.3

方法可行,但缺点是无法使用sftp直接对C传输文件

端口转发

我可以通过ssh隧道进行转口转发,透过A到B的ssh隧道将C的22端口转发到A到2333端口
主机B的ip为123.45.67.8用户为user,主机C的ip为10.0.1.3,以下命令在在主机A执行:

ssh -L 2333:10.0.1.3:22 user@123.45.67.8
# keep session alive
ssh user@127.0.0.1 -p 2333

注意:

  • 此方法要求A到B到ssh隧道保持连接,断开后本地2333端口转发也将消失
  • 此方法不限于对22端口进行转发,支持转发其他tcp服务

解放终端

端口转发方便,但保持连接比较麻烦
还会在远程主机占用一个pts会话
使用进阶版命令可以后台无感知运行
比如,利用ssh隧道的加密从公网访问局域网http服务
有效避免http用户名密码明文传输的隐患

ssh -qTfnN -L 8888:10.0.1.3:80 user@123.45.67.8

参数详解

ssh -qTfnN -D port remotehost
参数详解:
-C 允许压缩数据
-q 安静模式
-T不占用 shell
-f 后台运行,并推荐加上 -n 参数
-N不执行远程命令
-g允许远端主机连接本地转发的端口
-n把 stdin 重定向到 /dev/null (防止从 stdin 读取数据)
-L port:host :hostport 正向代理
//将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-R port:host :hostport 反向代理
//将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-D port socks5代理
//指定一个本地机器 "动态" 应用程序端口转发。

参考

巧用SSH转发功能深入穿透内网 - FreeBuf网络安全行业门户

posted @ 2021-01-16 15:38  azureology  阅读(378)  评论(0编辑  收藏  举报