ngrok服务端与客户端
June 16, 2018
自己搭建Ngrok服务器 #
- 使用平台:Ali云 Ubuntu 16.04
- Go编译器版本: 1.9.1
- 依赖: gcc、cmake、build-essential、git
1. Ubuntu安装Go编译器 #
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. 安装其他依赖 #
sudo apt install -y git gcc cmake build-essential screen
3. 下载ngrok源码并编译 #
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端运行 #
# 直接执行命令
./ngrokd -domain="之前生成的证书中的域名或IP" -httpAddr=":8081" -httpsAddr=":8082"
# 执行成功后会监听4443端口和client进行通讯
一般会开成后台运行,使用screen
screen -S ngrok-keeper
./ngrokd -domain="之前生成的证书中的域名或IP" -httpAddr=":8081" -httpsAddr=":8082"
# Ctrl + A + D 离开当前screen
# screen -r 回到之前离开的screen
5. Client端运行 #
将对应平台的可执行文件下载下来,这里注意,自签名的证书是编译进可执行文件中的,因此要更换域名的时候要重新编译。
先创建一个配置文件
# 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
执行成功以后会看到下面的信息:
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 登录 #
# 任何其他电脑
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,一般就是用户目录。
# 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服务
sudo apt install -y openssh-server
ps -e | ack sshd
# 查看是否有启动服务
# 如果没有启动就手动启动
sudo service ssh start
!解决断链接的问题 #
在使用的过程中总是频繁的断开连接,这个很影响游戏体验,主要就是ssh保持长连接的问题。 解决的办法也很简单
1. 配置客户端的sshd #
# sudo vim /etc/ssh/sshd_config
# 添加下面代码在最后
ClientAliveInterval 10
ClientAliveCountMax 5
# 由于断开频繁,因此这里我的时间间隔很小只有10s
顺带配置客户端的ssh #
非必须
# sudo vim /etc/ssh/ssh_config
# 在末尾添加
TCPKeepAlive yes
ServerAliveInteval 30