基于SSH隧道的简单内网穿透

内网穿透

很多时候我们需要在远程操作公司或者学校里的服务器,
但是出于没有专线(公网ip)
或者出于安全(其实也没有多安全,渗透哥总能进你的内网)
考虑,这些服务器的网络环境一般都是内网网络环境。
一但休假或者放学,我们就失去了有效操作这些服务器的能力,
他们并不像我们的云服务器一样有个公网ip,
ssh username@ip 就进去了。
当然,也并不是说我们就完全没得办法去操作他们了,
这里就需要做一个简单的内网穿透操作。

注意事项

1.目前仍然未失去连接内网的能力

我们不是渗透大佬,我们要稳定使用内网穿透的话,肯定得在没有 失去连接内网的能力(放假前,放学前)的时候在服务器上进行操作。
人已经在家了,那么爱慕骚瑞,出门左转去学渗透吧。

2.具有一台拥有root权限的公网ip的服务器

这一步也很难绕过,当然读者要是有什么更好的方法欢迎在楼下评论。

3.内网穿透有风险,需谨慎操作

一定要在确定不会产生巨大安全隐患以及为此负责的情况下进行内网穿透,特别是公司的服务器
虽说内网并不安全,但是总是多了一层保障(可有可无),很多攻击事件确确实实是在内网穿透后发生的,
这点大家需要注意。

本篇仅仅作为技术交流,任何个人行为与本人无关,本人不负任何法律责任。

原理

1.ssh服务
2.ssh端口转发
3.ssh隧道

具体的细节各位自行百度,本篇只交流实际操作,不阐述原理

操作

ssh -gCfNL [local_A_address:]local_A_port:target_C_address:target_C_port user@via_B_server
# f 后台认证用户/密码,通常和-N连用,不用登录到远程主机。
# C 压缩数据传输,可提高传输效率
# N 不执行脚本或命令,通常与-f连用。
# g 允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。需要进行配置才能正常生效
# L 本地端口转发 将本地(客户机)的port[listen_port]转发到指定机器[target_C_address]的指定端口[target_C_port]
# 将 B 作为代理机器,在将A的端口与C的端口连接
# 应用:
# A--->可以--->B
# A--->不可以--->C	
# B--->可以--->C
# local_A_address,默认值为127.0.0.1,这种情况,除了本机,其他人无法使用这个端口进行转发,当值为 0.0.0.0时,其他机器可以使用这个端口来进行转发
# 这种情况不符合我们内网穿透的需要,我们看下一种参数的ssh

# 此 shell 在 机器A的环境上执行
ssh -gCfNR [local_B_address:]local_B_port:DST_address:DST_port user@via_B_server
# 相同的参数不再介绍
# R 远程端口转发 此处的参数与本地端口转发有所区别,是A机(执行ssh的机器)与B机构建连接,并且在B机的指定端口监听,将数据从B机的端口转发到A机来
# DST:任何A可达的目标
# 应用:
# A--->可以--->B
# B--->不可以--->A
# A--->可以--->DST
# 这种情况符合我们的需求了,A即为我们在内网的机器,B即为我们的公网服务器。
# 讲解比较混乱,直接来看例子


# 所有ssh操作都需要输入目标主机的密码,建议做好免密登录

案例

结构如下
基于SSH隧道的简单内网穿透_第1张图片

内网机器A可以访问到公网机器B,
公网机器B是无法访问到内网机器A的。
如果需求是需要对C机器进行ssh登录,那么

在内网机器A上执行

ssh -gCfNR 0.0.0.0:33:10.10.10.11:22 [email protected]
# A与B构建连接,并且在B机上监听33端口,以A机作为跳板,将B的33端口的数据转发到10.10.10.11的22端口上去
# 0.0.0.0 表示B机的33端口不局限于被本地使用,任何可以访问123.123.123.123的机器都可以通过33端口转发,如果改为127.0.0.1,那么只有B本机可以使用33进行转发

执行后状态如下:

基于SSH隧道的简单内网穿透_第2张图片

实际上此时, -g 参数与 0.0.0.0的设置并不会生效,这是因为sshd默认的设置是阻止非本地的端口转发的,如果需要-g以及0.0.0.0的配置确实生效,需要去

sshd_config 中设置 GatewayPorts 的属性
不同的操作系统 sshd_config 的位置不同,本人使用的为 CentOS8.0,sshd_config 文件位置为 /etc/ssh/sshd_config

sshd_config 中 GatewayPorts 默认为no,并且已经被注释,可以找到注释去除注释符,或者直接在配置文件末尾添加GatewayPorts配置

GatewayPorts 有三种参数,no(拒绝一切非本地的转发),yes(允许一切非本地的转发), clientspecified(根据客户端需要进行判断)
设置为了yes则构建ssh隧道连接的时候无需指定 0.0.0.0,clientspecified则需要指定 0.0.0.0

修改完成后重新载入 sshd 服务,CentOS为

systemctl reload sshd

重新在A机上执行

ssh -gCfNR 0.0.0.0:33:10.10.10.11:22 [email protected]
#如果报错则说明之前构建的连接仍在运行中,可以去B机上kill掉相应进程,重新在A机上进行连接

在B机上查看是否正在进行转发

netstat -lnt

33 端口正在被监听,则说明已经生效,可通过个人电脑进行测

ssh -p 33 [email protected]
# 此处需要输入的是内网主机C的root密码,因为最终转发到了内网主机C的22端口上

稳定性

构建是完成了,第一次用好像没什么问题,但是过一段时间没使用后可能会发现连接已经断开了。隧道是很容易因为各种原因被断开的。
为了稳定的连接,我们需要使用 autossh 进行自动重连

CentOS下载autossh

yum install autossh

如果是使用 autossh ,建议免密,否则操作会复杂很多

autossh -M 4010 -gCfNR 0.0.0.0:33:10.10.10.11:22 [email protected]
# -M 表示使用执行机器的 4010 监听SSH连接状态,如果出了问题会自动重连

如此,简单的内网穿透便完成了!

除了22端口的穿透,ssh隧道也可以用于数据库甚至是web应用的穿透,但还是要注意,穿透有风险,操作需谨慎!

有问题可邮箱或者qq微信联系

你可能感兴趣的:(运维,ssh,服务器,运维,网络,shell)