ngrok服务端与客户端

自己搭建Ngrok服务器

  • 使用平台:Ali云 Ubuntu 16.04
  • Go编译器版本: 1.9.1
  • 依赖: gcc、cmake、build-essential、git

1. Ubuntu安装Go编译器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget https://dl.google.com/go/go1.9.7.linux-amd64.tar.gz
tar -zxvf go1.9.7.linux-amd64.tar.gz
mv go/ /usr/local/


# vim /etc/profile
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# save & exit vim

source /etc/profile
go version

# 显示Go的版本即安装成功

2. 安装其他依赖

1
2

sudo apt install -y git gcc cmake build-essential screen

3. 下载ngrok源码并编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
git clone https://github.com/inconshreveable/ngrok.git ngrok
cd ngrok


# 生成ssl自签名证书, 需要被编译进最终可执行文件中

NGROK_DOMAIN="tunnel.paladnix.top"
# 注意域名换成你自己的
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt
# 将生成的证书文件拷贝到指定位置,替代默认证书
cp base.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key


# compile
# 可以交叉编译客户端和服务端
# 可以编译出Linux、Mac、Windows三个平台上的可执行文件
# 如果是当前平台运行的直接:
make release-server release-client

# 如果客户端需要在不同的平台

# Mac
GOOS=darwin GOARCH=amd64 make release-client

# Linux
GOOS=linux GOARCH=amd64 make release-client

# arm
GOOS=linux GOARCH=arm make release-client

# Windows
GOOS=windows GOARCH=amd64 make release-client

# 编译完成后,在./bin目录下出现:ngrok(client)、ngrokd(server)

4. Server端运行

1
2
3
4
# 直接执行命令
./ngrokd -domain="之前生成的证书中的域名或IP" -httpAddr=":8081" -httpsAddr=":8082"

# 执行成功后会监听4443端口和client进行通讯

一般会开成后台运行,使用screen

1
2
3
4
5
6
7

screen -S ngrok-keeper

./ngrokd -domain="之前生成的证书中的域名或IP" -httpAddr=":8081" -httpsAddr=":8082"

# Ctrl + A + D 离开当前screen
# screen -r 回到之前离开的screen

5. Client端运行

将对应平台的可执行文件下载下来,这里注意,自签名的证书是编译进可执行文件中的,因此要更换域名的时候要重新编译。

先创建一个配置文件

1
2
3
4
5
6
7
8
9
10
# vim ngrok.conf
server_addr: "YOUR_DOMAIN/IP"
trust_host_root_certs: false
# save & exit vim

# 将本机的TCP协议22端口暴露出去,用于ssh登录和scp
./ngrok -config=ngrok.conf -proto=tcp 22

# 将本机的http协议8080端口暴露出去, 用于访问本机网站
./ngrok -config=ngrok.conf -proto=http 8080

执行成功以后会看到下面的信息:

1
2
3
4
5
6
7
8
ngrok                                               (Ctrl+C to quit)

Tunnel Status online
Version 1.7/1.7
Forwarding tcp://tunnel.paladnix.com:35291-> 127.0.0.1:22
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms

接下来你就认为tunnel.paladnix.top:35291 就是你的内网主机就可以了。

SSH & SCP 登录

1
2
3
4
5
6
7
8
# 任何其他电脑
ssh -p 35291 paladnix@tunnel.paladnix.top
# 其中用户名是你内网主机上的用户,密码是内网主机对应的密码
# 注意是小写的`-p`


scp -P 35291 paladnix@tunnel.paladnix.top:/home/paladnix/a.cpp ./
# 注意是大写的`-P`

接下来就可以各种骚了。
ngrok是以tcp协议做基础的,所以理论上可以有很多用法。有待开发。

ngrok 配置文件

ngrok开源的1.x 的版本默认的配置文件是:$HOME/.ngrok, 这里的HOME不是PATH中的HOME是机器指定的HOME,一般就是用户目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# vim ~/.ngrok

server_addr: "tunnel.paladnix.top:4443"
trust_host_root_certs: false

tunnels:
ssh:
remote_port: 54321 # 指定远程端口是54321, 避免每次都是随机端口
proto:
tcp: 22

http:
proto:
http: 3000

# 启动方式,可以同时启动,也可以单独启动
ngrok start ssh http

补充

客户端机器需要安装ssh—server,开启sshd服务

1
2
3
4
5
sudo apt install -y openssh-server
ps -e | ack sshd
# 查看是否有启动服务
# 如果没有启动就手动启动
sudo service ssh start

!解决断链接的问题

在使用的过程中总是频繁的断开连接,这个很影响游戏体验,主要就是ssh保持长连接的问题。
解决的办法也很简单

1. 配置客户端的sshd

1
2
3
4
5
6
7
8
9

# sudo vim /etc/ssh/sshd_config

# 添加下面代码在最后

ClientAliveInterval 10
ClientAliveCountMax 5

# 由于断开频繁,因此这里我的时间间隔很小只有10s

顺带配置客户端的ssh

非必须

1
2
3
4
5
6

# sudo vim /etc/ssh/ssh_config
# 在末尾添加

TCPKeepAlive yes
ServerAliveInteval 30
Talk is not cheap.