作者:他们都叫我老宁
前言
先来说说什么是内网穿透,内网穿透是一种通过公共网络(通常是互联网)访问位于私有网络中的计算机或服务的技术。是否需要内网穿透?如果家里或公司的网络不能够被互联网直接访问(没有公网IP)那么就可能需要内网穿透。当然并不是说一定要做内网穿透,对于一些特定的服务,暴露到公网其实并不安全。今天介绍的是基于端口转发来实现内网穿透,所以需要一定的条件:
-
一台拥有公网IP的主机
-
有域名更好
介绍
GOST是一个开源软件,马上就发布3.0正式版了,可能只有小部分小伙伴听说过,但是很多小伙伴绝对使用过它提供的服务,今天只介绍它的端口转发功能,其它功能可以参阅https://gost.run/官方文档
这篇文章会先大致介绍下原理,后面再来进行实操。如果没有公网IP的网络环境就如下图一样,主机A可以访问互联网和云主机,互联网和云主机之间也是可以互相访问的,但是互联网是无法访问到主机A的,同样云主机也无法直接访问到主机A
而加上内网穿透,网络环境就变成如下图。主机A当然可以直接访问互联网,而互联网想要访问主机A,则需要先访问到云主机,而我们可以在云主机和主机A上打通一个通道(因为这两台机器我们都可以控制),通过这个通道,自然就可以访问到主机A了。这样就实现常说的内网穿透了
可以通过GOST非常简单的实现打通隧道的操作,只需要两行命令,在云主机上开启socks5协议的服务,再把主机A的5230的服务转发到云主机的3333端口上,这样就可以通过访问云主机的3333端口访问到主机A的5230的服务了,而6666端口就是云主机和主机A之间的通道端口
搭建
接下来进行演示,这里的演示环境为:云主机(阿里云ECS)、主机A(群晖218)
首先去ECS安全组,把需要的端口放开,如果服务器开启了防火墙,也要放开相应的端口
分别通过SSH命令进入阿里云ECS后台,执行如下命令安装GOST(可以去https://github.com/go-gost/gost/releases下载适合主机架构的版本;如果安装过慢,也可以下载到本地再上传到ECS)
wget https://github.com/go-gost/gost/releases/download/v3.0.0-nightly.20231202/gost_3.0.0-nightly.20231202_linux_amd64.tar.gz
下载完毕后,进行解压
tar -xzvf gost_3.0.0-nightly.20231202_linux_amd64.tar.gz
在群晖218上执行(218是intel处理器)进行下载
wget https://github.com/go-gost/gost/releases/download/v3.0.0-nightly.20231202/gost_3.0.0-nightly.20231202_linux_386.tar.gz
下载完毕后,进行解压
tar -xzvf gost_3.0.0-nightly.20231202_linux_386.tar.gz
接下来运行服务,在ECS上执行如下命令运行GOST服务
./gost -L socks5://:6666?bind=true
在群晖218上执行如下命令运行GOST服务。这行命令大致的意识是把x.x.x.x远端3333端口映射到127.0.0.1的5230端口上(x.x.x.x为你服务器的地址)
./gost -L rtcp://:3333/127.0.0.1:5230 -F socks5://x.x.x.x:6666
现在打开浏览器输入x.x.x.x:3333(x.x.x.x为你服务器的地址),可以看到群晖218上端口为5230的服务已经可以被访问了
如果拥有域名的话,可以通过配置反向代理,后面就可以直接使用域名访问内网的服务了,而云主机只当当做了一个中转机,使用了它的带宽而已
优化
上面的方法虽然可以把服务转发到了外网,但是如果在某些时候,我们仅仅只想连接到内网简单设置下,并不想把服务一直暴露到公网怎么办?
只需要在218上先执行:
./gost -L socks5://:7777?bind=true
再开启一个终端,再执行如下命令,服务端的命令保持不变
./gost -L rtcp://:3333/127.0.0.1:7777 -F socks5://x.x.x.x:6666
前面在ECS上执行的命令可以理解为,准备好了一个666接头等待别人来连接,而群晖218上又准备好了一个7777的接头,最后执行的rtcp://:3333/127.0.0.1:7777则是把7777的接头转到了ECS的3333上,这样打开3333就不是刚刚的5230的服务了,而是一个接头,只要连接到这个接头,就连接到群晖218的内网了
现在可以设置浏览器插件SwitchyOmega的socks5代理为x.x.x.x:3333来测试是否可以访问你的内网设备
到这里有些小伙伴就会想,那这样岂不是知道端口号,人人都可以访问我的内网设备和云主机了?是的,这样只要知道了你的公网IP和端口,那么就会十分的危险,所以我们在开启socks5服务的时候可以加上授权,在云主机上执行如下命令,user为用户,123456为密码
./gost -L socks5://user:12345678@:6666?bind=true
在本地设备也要加上授权(x.x.x.x为你服务器的地址)
./gost -L rtcp://:3333/127.0.0.1:5230 -F socks5://user:12345678@x.x.x.x:6666
这样就非常安全了。有小伙伴会问,那这个通道传输数据安全么?引用文档的一句话:GOST支持标准SOCKS5协议的0x00(NO AUTHENTICATION REQUIRED)和0x02(USERNAME/PASSWORD)方法,并在此基础上扩展了两个方法:TLS(0x80)和TLS-AUTH(0x82),用于数据加密。如果客户端和服务端都使用GOST,则数据传输默认会被加密(协商使用0x80或0x82方法),否则使用标准SOCKS5进行通讯(0x00或0x02方法) 同样的,可以在本地设备加上授权
./gost -L socks5://user1:123456:7777?bind=true
再运行
./gost -L rtcp://:3333/127.0.0.1:7777 -F socks5://user:12345678@x.x.x.x:6666
但是这样关闭终端就会终止程序的运行,所以修改命令为:nohup xxx > gost.log 2>&1 &,xxx为执行的命令,如下
nohup ./gost -L rtcp://:3333/127.0.0.1:7777 -F socks5://user:12345678@x.x.x.x:6666 > gost.log 2>&1 &
如果想要关闭gost程序,则可以执行
kill -9 $(ps aux | grep “gost” | sed /grep/d | awk {print $2})
最后,只需要找个支持sockt5的客户端,设置好公网IP、端口、用户、密码就可以进到你的内网了
会思考的小伙伴就会发现,哪怕是拥有公网IP,也可以通过这个方法来实现去掉HTTPS后的端口号,也不用去路由器上打开防火墙和端口转发了
后记
GOST的主要用处不是用来干这个的,很多人用它来搭建中转服务,其实原理都差不多。当然GOST也不是仅仅支持socks协议,还有很多,比如可以使用ss协议gost -L ss://AEAD_CHACHA20_POLY1305:123456@:8338,其中CHACHA20_POLY1305为加密协议,123456为密码;GOST同样支持docker部署,也支持使用配置文件运行,这里只是简单的介绍了它的端口转发和命令行运行而已,想要了解得更深,可以查看官方文档https://gost.run/
最后插一句,双十一阿里云有个活动,现在好像还没有结束,99元一年:2核2G3M带宽
阅读更多网络存储精彩内容,可前往什么值得买查看