2025-02-22 18:00:29
本文将介绍SSH隧道穿透内网的技术的实际操作方式,通过这种方式,实现将内网设备的端口号挂载到指定服务器上,让服务支持对外发现。
我们知道的是,在国内分配到的公网IPv4数量不到全球的10%,在如此缺少的情况下,国内的公网做了进一步的管理规范:固定公网IP即专线,需要向服务商申请铺设专线,费用较为高昂,一般面向企业;动态公网IP,对于电子发烧友来说是人手一个,当然还有一个大的群体是入公网的监控设备(不过据说监控程序漏洞很多,经常会见到监控泄露的新闻出现);然后是最多使用的接入网络节点获得的内网IP。常常说的电信一个电话就能获得公网IP,主要指的是动态公网IP,如果需要假设NAS等设备,需要设置DDNS动态域名解析,才能实现服务支持。
本文不介绍如何接入公网IP并且设置DDNS来架设NAS,而是从另外一个方式——SSH隧道技术来实现服务提供。
实现这个技术的前提是拥有一个公网服务器,这个服务器可以是自己买的也可以是其他提供商的支持挂载的服务器,便宜的学生机也只要100RMB左右/年,只要你能成为学校技术社团的社长部长,就可以不断薅学弟、学弟的学弟、学弟的学弟的学弟的羊毛!
我们经常会在登录linux系统使用ssh指令,实际上windows系统一样支持ssh。
SSH下载地址:OpenSSH github地址
比如我的服务器用户名是Administrator,先IP地址是101.43.71.114,那么在本地命令行只要输入如下指令并且确认登录密码即可成功登录服务器。
ssh Administrator@101.43.71.114
可以输入windows系统的终端命令,进行操作,如下是展示当前用户目录下的文件列表:
不过如果每次登录都要输入密码未免有些麻烦,如果信任当前本地设备,那么可以在本地生成一份公私钥,并且将公钥上传服务器,即可免密登录。
本地输入如下指令,并且一直回车即可,默认使用rsa方式:
ssh-keygen -t rsa
如下,即表示生成成功,文件保存在了C:\Users\Administrator/.ssh/ 目录下。
在目录下我们可以看到四个文件,其中id_rsa是私钥,id_rsa.pub是公钥。
接着来到服务器侧,将上面的公钥文件内容追加到服务器的此文件中 ~/.ssh/authorized_keys 并且保存。
找到服务器此文件(windows) C:\ProgramData\ssh\sshd_config 。去除如下三条配置的注解,并且注释掉Match和AuthorizedKeysFile配置。
解注
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
注释
#Match Group administrators
#AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
接着,我们在服务器win+R,输入services.msc,打开所有服务项,将openssh服务重启,即配置完成。
此时,我们再次ssh登录就不需要密码了。
要建立反向隧道,首先需要服务器网关支持,仍然是上方的ssh_config配置文件,修改如下项启动网关。
GatewayPorts yes
接着启动本地一个服务,如本地服务端口是1919,想要挂载在服务器7070端口,可以如下写法:
ssh -R 7070:localhost:1919 Administrator@101.43.71.114
其中-R表示反向,这种是启用shell反向,不过更常用的是-NfR指令。其中-f表示后台模式,-N不启用Shell,当然也可以-NR,来启动但不进入后台模式。通常我们会加上N,因为很多服务对输入流监听,如果只使用-R,那么可能会造成一些问题。
ssh -NR 7070:localhost:1919 Administrator@101.43.71.114
ssh -NfR 7070:localhost:1919 Administrator@101.43.71.114
使用telnet指令验证服务器端口是否建立:
telnet 101.43.71.114 7070
(如果是网站应用,可能会涉及到跨域处理)
类似的,还有正向隧道,可以将服务器的端口映射到本地端口,指令如下:
ssh -L 6666:localhost:7070 Administrator@101.43.71.114
可以用于线上接口本地代测等功能实现,因为本文主要实现反向隧道穿透技术,这里就不多赘述正向隧道的各种应用啦!