今天是前天的后天。
我洗了手,晃了晃高脚杯里面的开口笑,若有所思地若有所思了一下,在洁白的键盘上敲下了这篇文章。
前文结尾说道,就算防火墙完全关死,依然能连接进去,用到的就是 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 条评论
这样的话感觉直接弄个跳板机即可,服务器指定只能通过改跳板机连接。
这跟跳板机的情况还是不一样的,服务器只允许跳板机登录,服务器上还是得开放SSH 端口,本文中,服务器不需要开放任何端口,无缝钢蛋。
看你的方案也是得先登上218才能登235。
那218的ssh不就是开放着的吗?
另外其实也可以用发包控制ssh的开放,这样做也更简单,发什么包,发多少包过去,ssh才开放,由你自己控制,一般人肯定是不知道的了。
还有限制 端口连接频次,也还不错,错误次数过多就封一段时间。
218的ssh确实开着,发包控制ssh的开放,这个没研究过;初看好像挺难;你后面说的就是 Fail2ban 了。
防火墙指定 ssh端口只针对跳板机开放。对其他所有机器来说等同于没开放。没问题的。
牛逼class,虽然文中的每个字我都认识,但我还是一句没看懂~
原来ssh这么牛,有空我也试试,到时候内网穿透我就可以关了,感谢分享。
对,对,听说有跳板机,可以搞定
这个是不是有可能实现穿nat家宽建站啊
不行,稳定性不够