由于学校部分内网与跟外网不通,所以在校园网或者外网的情况下,连接不到内网服务器,看不了内网的网站。但是有时候我会需要在自己宿舍或者家里连接学校的内网服务器,看一下内网网站,一开始想到的是内网服务器搭建ss服务器,然后一想,怎么对外网IP映射端口呢,我又没有路由器权限。想来想去,还是直接用内网穿透的工具吧。
安装GO
安装编译ngrok,首先需要安装go(够浪),好想学go啊,可是我已经有Python了
一,yum安装
1.安装EPEL源
yum install epel-release
2.安装go
yum install golang -y
二,下载安装
打开https://golang.org/dl/,下载最新版的Linux安装包,目前最新版本是1.12.6
wget https://dl.google.com/go/go1.12.6.linux-amd64.tar.gz
tar -C /usr/local/ -zxvf go1.12.6.linux-amd64.tar.gz
修改环境变量
nano .bashrc
添加如下
#go lang
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
使环境变量生效
source .bashrc
查看go版本
go version
#go version go1.12.6 linux/amd64
编译ngrok
首先我们需要准备以下:
- 一个主机记录为*的域名(可以为二级域名)
- 一个通配符证书
- 一台有外网IP的服务器(以上操作全在这台服务器上进行)
git以下ngrok的源码
git clone https://github.com/inconshreveable/ngrok
获取通配符证书的过程就省去了算了还是说一下吧
安装acme(获取Let’s Encrypt证书)
curl https://get.acme.sh | sh
使环境变量生效
source .bashrc
由于通配符证书只能使用DNS验证的方式,所以这边主要说一下DNSPOD跟阿里云的申请过程(我直接使用阿里云的accesskeys跟DNSPOD的API Token),当然你也可以自己添加DNS解析
配置变量环境
#阿里云
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
acme.sh --issue --dns dns_ali -d *.example.com -d example.com
#DNSPOD
export DPI_Id="1234"
export DPI_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dpi -d *.example.com -d example.com
之后就可以得到这个域名的通配符证书了,我们只需要关注得到的以下文件:
- example.com.key
- fullchain.cer
- ca.cer
替换证书
cd ngrok/assets/client/tls/
看到:ngrokroot.crt snakeoilca.crt
替换成:ca.cer fullchain.cer (记得重命名为上面的)
cd ngrok/assets/server/tls/
看到:snakeoil.crt snakeoil.key
替换成:fullchain.cer example.com.key(记得重命名为上面的)
编译服务端
cd ngrok/
make release-server
如果在这里编译出错了,那你应该是选择了下载安装,解决方法:
#make: bin/go-bindata: Command not found错误
cd $GOROOT/bin
把go-bindata复制到ngrok/bin/目录下即可,之后再重新编译。
软连接一下:
ln -s /root/ngrok/bin/ngrokd /usr/bin/
运行:
ngrokd -tlsKey="/root/ngrok/assets/server/tls/snakeoil.key" -tlsCrt="/root/ngrok/assets/server/tls/snakeoil.crt" -domain="example.com" -httpAddr=":1313" -httpsAddr=":1314" -tunnelAddr=":1315"
# domain是你上面的域名,httpAddr是HTTP的端口,httpsAddr是HTTPS的端口,tunnelAddr是ngrok的监听端口。(你也可以不加httpAddr以及后面的参数,让ngrok使用自己默认的端口,这里主要是服务器已经占用了80跟443端口,所以自己指定了端口)
输出:
[11:06:28 CST 2019/06/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[11:06:28 CST 2019/06/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
[11:06:28 CST 2019/06/18] [INFO] (ngrok/log.Info:112) Listening for public http connections on 0.0.0.0:1313
[11:06:28 CST 2019/06/18] [INFO] (ngrok/log.Info:112) Listening for public https connections on 0.0.0.0:1314
[11:06:28 CST 2019/06/18] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on 0.0.0.0:1315
如果是以上输出,那么就说明服务端启动成功。
编译客户端-Linux
cd ngrok/
make release-client
如果是yum安装GO,那么客户端就是:ngrok/bin/ngrok
如果是下载安装GO,那么客户端就是:/usr/local/go/bin/ngrok
把客户端拷贝到内网服务器上,同级目录下创建编辑一个文件ngrok.cfg:
server_addr: "example.com:1315"
trust_host_root_certs: true
保存。
运行客户端
./ngrok -subdomain miku -config=ngrok.cfg 80
#这句命令的意思是,设置访问二级域名为miku.example.com,引用ngrok.cfg配置文件,监听本地的80端口。
编译客户端-Windows
GOOS=windows
GOARCH=amd64
make release-client
之后的操作方法上同。
经过上面的操作,我就可以使用自己的域名加端口,访问学校内网服务器的端口了。
还是FRP简单 😆
😎 来看看
访问体验好坏,完全取决于服务端带宽,国外的会丢包,国内的小水管~~ 😥
nice 学习
了解,学习下了~