本地端口转发实战

本地端口转发实战

本文编写时间:2023-07-22

需求概况

想直接 ssh 连接位于防火墙后面的服务器。其实也是现实中很常见的一种情况。

具体需求

总共四台机器,
(1)我的笔记本 A,
(2)我自己的服务器 B。
(3)公司的服务器 C,可以用外网的 22 端口直接请求,但是上面没有代码。
(4)公司的服务器 D,屏蔽外网的 22 端口,但是允许内网包括服务器C的 22 端口,代码都在上面。
希望电脑 A 能 ssh 直连服务器 D。

分析

1、使用 ssh 的本地端口转发很容易实现。
2、隧道入口是B,隧道出口是C。
3、隧道方向和隧道完成后请求的方向是同方向的,所以是本地端口转发。

实现

1、把 B 的公钥放到 C 。
2、把 A 的公钥放到 D 。
3、在 B 上执行如下命令,执行后可以关闭 shell 。

ssh -f -N -g -L 6800:机器 DIP:22 root@机器 CIP

3-1,这里其实假设了机器 C 和机器 D 的 ssh 端口都是 22
3-2,-f 和 -N 参数联用,表示以后台方式开进程,这样可以关闭shell,效果一直保持。
3-3,-g 的作用是机器 A 可以请求机器B的6800,如果没有这个参数,只能机器 B 联通机器 D。
3-4,-L 的作用是执行本地端口转发。
3-5,本命令好像fNgL的参数有顺序,不能随便改。
3-6,ssh 隧道的作用是联通机器与机器,本文的描述的情况是,ssh 隧道实现的转发目的也是 ssh 连接,所以让人有点混淆,但也还好。
3-7,A 到 B 之间,C 到 D 之间的信息都是明文传递,未加密的。
3-8,6800 的端口可以改成 1000 以上的其他任意未使用接口
3-9,本命令的作用是机器 B 开放了 6800 端口,任何机器连到了这里,相当于直连机器 D 的 22 端口。
3-10,因为 B 是服务器,所以需要确保 B 对外开放了 6800 端口。如果想要更安全,就需要让 B 只对 A 的 ip 开放 6800。

4、在笔记本 A 上,执行如下命令,就直连 D 了

ssh -p 6800 root@机器 B 的ip

5、A 可以直接上传文件到 D 了。比如用如下命令。

rsync  -avz --delete -e "ssh -p 6800" /www/aaaa    root@机器 BIP:/www/

其他解决方案。

1、本地端口转发,去除 B

A执行命令

ssh -f -N  -L 6800:机器 DIP:22 root@机器 CIP

A 然后使用下面的命令直连 D

ssh -p 6800 root@127.0.0.1

2、远程端口转发,去除 B

D执行命令,(先登录 C ,C 上登录 D,执行命令后退出 shell )

ssh -f -N  -R 6800:127.0.0.1:22 root@机器 CIP

在 A 上执行如下命令,就直连 D 了。

ssh -p 6800 root@机器 C 的ip

不过这种方法要求你能控制C开放防火墙开6800端口。
万一上面的命令不管用(用netstat -ano|grep 6800检查)。说明 C 只对自己开放6800端口。
此时应该补充: C 执行命令

ssh -fgN -L 6801:127.0.0.1:6800 127.0.0.1

意思是本地6801收到的全转给本地的6800,而6801是对所有外网开放的。
最后 A 执行:直连 D

ssh -p 6801 root@机器 C 的ip

不过这种方法要求你能控制C开放防火墙开6801端口。我实测可行。

3、远程端口转发。保留 B

C 执行命令

ssh -f -N -g -R 6800:机器 DIP:22 root@机器 BIP

最后 A 执行:可以直连 D

ssh -p 6801 root@机器 B 的ip

总结

  • ssh 隧道很方便。
  • 上面的远程端口转发,我实测在隧道出口映射的端口都只能被自己请求,解决方案就是加上ssh -fgN -L 6801:127.0.0.1:6800 127.0.0.1 类似这样的命令。
  • ssh 的端口可以不是 22 ,请求时带 -p 参数即可。无论是是隧道还是目标的ssh端口都可以不是22
  • 本地端口转发容易理解,远程端口转发稍微绕一些,但多尝试就掌握了。
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
51
粉丝
7
喜欢
60
收藏
94
排名:588
访问:1.3 万
私信
所有博文
社区赞助商