Ubuntu下搭建ngrok服务器及客户端

记录一下自己在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 Statusonline
Version1.7/1.7
Forwardingtcp://temple.com:26321 -> 127.0.0.1:80
Web Interface127.0.0.1:4040
Conn0
Avg Conn Time0.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即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值