SSH 反向端口转发

今天是前天的后天。
我洗了手,晃了晃高脚杯里面的开口笑,若有所思地若有所思了一下,在洁白的键盘上敲下了这篇文章。

前文结尾说道,就算防火墙完全关死,依然能连接进去,用到的就是 ssh 的反向端口转发功能。

SSH 反向端口转发实验

首先,准备两台机器来做实验,ip 分别是 43.128.59.235 (本文简称235) 和 139.199.172.218 (本文简称218)

============================================

在235上,把所有的防火墙入站规则全删掉,连 ping 都不响应,这等于彻底焊死了大门。
然后我们在218上先做扫描测试:

▲ 扫描结果显示,235 上没有任何开放的端口,想ssh登录进去是不可能的。
➤ -sS TCP SYN 扫描(半开扫描),向扫描目标发送 SYN 数据包,若对方发回 SYN/ACK 响应包,则认为目标端口正在监听,并立即断开连接;通常情况下,该扫描动作不会被写入日志。
➤ -sF TCP FIN 扫描,开放的端口会忽略这种包,关闭的端口会回应 RST 包,你一回应,我就知道该端口在监听。
➤ -P0 就算 ICMP 请求被防火墙阻止,我也要继续扫描。
➤ -n 不做反向 DNS 解析,加速扫描。

▲ 然而,我依然在218上成功通过ssh成功登录了防火墙全关的235,这是怎么做到的呢?答案是 SSH 反向端口转发。
简单来说,防火墙全关,你进不去,但,里面可以出来啊。我先在235通过ssh连接上218,并把这个连接会话保持住,做成一个SSH隧道,就好像被关在密室的你好不容易打通了电话,死活都不肯挂断要保持通话一样。

▲ 235 上先打电话,保持通话
命令解释:
f参数,表示SSH连接成功后,转入后台运行;N参数,表示只连接远程主机,不打开远程shell;R参数,表示远程转发。双引号里面的*:8080:localhost:80,很多人都搞不清怎么写,特别是有的大牛只写三段,那就更让人看不懂了,这里建议大家都写全,写四段,IP、端口、IP、端口写全。


▲ 电话一通,218 这边显示通话中,隧道建立成功。
▼ 此时,我们用ssh连接本地的5522端口,就会连通隧道的另外一端。

SSH 做内网穿透

你在公司本地的机器上搭了一个 web 应用,想让远端的小伙伴测试一下,外网是无法直接访问内网的主机的,怎么办!
严刑拷打公司网管后,依然不给开通端口映射,怎么连接进公司内网自己的机器呢?
归根结底,这些问题都是内网穿透的问题。SSH能解决这些问题。

如图,内网B上有web服务,用户想直接访问是不可能的,通过SSH的反向端口转发能轻松搞定这事。
在内网B机器上执行如下命令:

ssh -f -NR  "*:8080:localhost:80" root@waiwangA

▲ 执行上面的命令后,通过访问外网机器8080端口,就能访问到内网web。

▲ 然而8080端口跑的却是ssh服务。

此时,数据是这么走的:

SSH 反向端口转发不稳定

实际使用过程中,发现隧道不稳定,有时候会突然断开连接。可以用 autossh 来解决不稳定的问题。

autossh -M 5678 -NR *:8080:localhost:80" root@waiwangA  -p22  

比之前的命令添加的一个-M 5678参数,负责通过5678端口监视连接状态,连接有问题时就会自动重连,去掉了一个-f参数,因为autossh本身就会在background运行。

原创文章,转载请注明: 转载自笛声

本文链接地址: SSH 反向端口转发

10 条评论

  • 哥斯拉 2022年1月3日 回复

    这样的话感觉直接弄个跳板机即可,服务器指定只能通过改跳板机连接。

    • dige 2022年1月3日 回复 作者

      这跟跳板机的情况还是不一样的,服务器只允许跳板机登录,服务器上还是得开放SSH 端口,本文中,服务器不需要开放任何端口,无缝钢蛋。

      • 哥斯拉 2022年1月4日 回复

        看你的方案也是得先登上218才能登235。
        那218的ssh不就是开放着的吗?

        另外其实也可以用发包控制ssh的开放,这样做也更简单,发什么包,发多少包过去,ssh才开放,由你自己控制,一般人肯定是不知道的了。

        还有限制 端口连接频次,也还不错,错误次数过多就封一段时间。

        • dige 2022年1月4日 回复 作者

          218的ssh确实开着,发包控制ssh的开放,这个没研究过;初看好像挺难;你后面说的就是 Fail2ban 了。

      • 哥斯拉 2022年1月4日 回复

        防火墙指定 ssh端口只针对跳板机开放。对其他所有机器来说等同于没开放。没问题的。

  • 西枫里博客 2022年1月3日 回复

    牛逼class,虽然文中的每个字我都认识,但我还是一句没看懂~

  • 萧瑟 2022年1月4日 回复

    原来ssh这么牛,有空我也试试,到时候内网穿透我就可以关了,感谢分享。

  • 老张博客 2022年1月4日 回复

    对,对,听说有跳板机,可以搞定

  • Enoch 2022年2月28日 回复

    这个是不是有可能实现穿nat家宽建站啊

    • dige 2022年3月3日 回复 作者

      不行,稳定性不够

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Copyright © 2015-2022 笛声博客 All Rights Reserved     浙ICP备15036123号-1