记录一下自己在Ubuntu下搭建ngrok服务的过程
前言
最近想要在校园网内搭建一个VPN服务,但是因为校园网,所以没有公网IP,只好做内网穿透了,之前做了一些n2n以及ssh隧道的尝试,这次使用ngrok反向代理尝试一下:
由于最初没有安装go环境,以及下载go环境的一些不方便,曾打算使用ngrok-c,但是尝试以后,发现貌似仅支持openwrt。。。可能是我学艺不精吧,如果可以请私信我。
搭建环境:
局域网外(公网)
- 阿里云的ECS服务器
- Ubuntu 16.04 64位 系统
- 用户:root
局域网内
- 树莓派
- Ubuntu 系统
-公网服务器端
安装go环境
别人的博客:
#wget https://golangtc.com/static/go/1.8.3/go1.8.3.linux-amd64.tar.gz
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar zxvf go1.8.3.linux-amd64.tar.gz
mv go /usr/local/
emmmm,反正我是两个都下载失败了的,也是我一开始放弃go的原因.
直到,我使用了以下操作…
apt-get install golang
其他博客里的环境变量配置,我于是也没去弄了,其实是弄崩了一次bash。。
ngrok的配置
1.下载ngrok源码
方法一
git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=~/ngrok
cd ngrok
方法二
wget htps://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/ngrok.tar.gz
tar zxvf ngrok.tar.gz
export GOPATH=~/ngrok
cd ngrok
2.生成签名证书
使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,我们需要生成自己的证书,并提供携带该证书的ngrok客户端。
证书生成过程需要一个NGROK_BASE_DOMAIN。如果你要提供服务的地址为”temple.com”,那NGROK_BASE_DOMAIN就应该 是”temple.com”。就假设我的服务域名是temple.com。
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=temple.com" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=temple.com" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
执行完以上命令,在ngrok目录下会生成6个新的文件
device.crt device.csr device.key
rootCA.key rootCA.pem rootCA.srl
3.替换证书
ngrok通过bindata将ngrok源码目录下的assets目录(资源文件)打包到可执行文件(ngrokd和ngrok)中 去,assets/client/tls和assets/server/tls下分别存放着用于ngrok和ngrokd的默认证书文件,我们需要将它们替换成我们自己生成的:(因此这一步务必放在编译可执行文件之前)
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
4.编译ngrokd(服务端)和ngrok(客户端)
在ngrok目录下执行如下命令,编译ngrokd:
GOOS=linux GOARCH=amd64 make release-server
go支持交叉编译的平台非常多,详见 GO中文文档
#64位linux server
make release-server GOOS=linux GOARCH=amd64
#32位linux server
make release-server GOOS=linux GOARCH=386
emmm,据说别的博客一般会出现两种错误,但遗憾的是我并没有遇到。
同样,在ngrok目录下编译ngrok:
我的客户端是运行在树莓派上,所以执行
GOOS=linux GOARCH=arm make release-client
编译完成过后~/ngrok/bin/ngrokd即为服务端运行文件
编译完成过后~/ngrok/bin/linux_arm/ngrok即为树莓派客户端运行文件
至此,文件编译已经完成,可以进行调试了。
调试
1.启动ngrokd(服务器)
cp ~/ngrok/bin/ngrokd /usr/bin/
ngrokd -domain="temple.com" -httpAddr=":6000"
若弹出The program 'ngrokd' is currently not installed. You can install it by typing: apt install ngrok-server
不要使用它提供的语句,可以使用 find / -name ngrokd 找到在/root/ngrok/bin/ngrokd目录,于是
cd /root/ngrok/bin
./ngrokd -domain="temple.com" -httpAddr=":6000"
然后,正常的服务日志就出来了
[17:28:09 CST 2017/11/06] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[17:28:09 CST 2017/11/06] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:6000
[17:28:09 CST 2017/11/06] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[17:28:09 CST 2017/11/06] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
客户端的使用
在树莓派上用scp root@temple.com:ngrok/bin/linux_arm/ngrok /home/pi/ngrok
将bin文件夹下载到树莓派上。
cd ~/ngrok/bin
cat > ngrok.conf <<EOF
#必须是 域名:隧道端口 的格式
server_addr: "temple.com:4443"
#自行编译无需验证ngrok官网证书
trust_host_root_certs: false
tunnels:
http:
remote_port: 26321
proto:
tcp: 80
EOF
其中26321为服务器端口,不要与其他冲突即可,我这里随便打的。
80为本地转发端口,主要决定于你想将哪个端口转发出去。
4443我没有修改,使用的是默认值。
客户端启动
./ngrok -config=ngrok.conf start http
或者说将文件放入/usr/bin 中就不需要再加入路径。
cp /home/pi/ngrok/ngrok /usr/bin
cp /home/pi/ngrok/ngrok.conf /usr/bin
ngrok -config=ngrok.conf start http
完成
ngrok
Tunnel Status | online |
---|---|
Version | 1.7/1.7 |
Forwarding | tcp://temple.com:26321 -> 127.0.0.1:80 |
Web Interface | 127.0.0.1:4040 |
Conn | 0 |
Avg Conn Time | 0.00ms |
多端口转发
可以进行多端口转发,方法如下:
文件ngrok.conf 内容如下设置
cd ~/ngrok/bin
cat > ngrok.conf <<EOF
#必须是 域名:隧道端口 的格式
server_addr: "temple.com:4443"
#自行编译无需验证ngrok官网证书
trust_host_root_certs: false
tunnels:
http1:
remote_port: 26321
proto:
tcp: 80
http2:
remote_port: 23422
proto:
tcp: 2313
EOF
运行
ngrok -config=ngrok.conf start http1 http2即可