0%

树莓派ngrok内网穿透(无公网IP)

  • 一个树莓派 (RaspberryPi 3B+)
  • 一个VPS (亚马逊云)
  • 一个域名 (阿里域名)

安装环境

安装gcc, wget, screen
sudo apt install gcc wget screen -y

配置Go

下载go并解压
wget https://www.golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz && tar -zxvf go1.9.2.linux-amd64.tar.gz

移动go并创建软连接
sudo mv go /usr/local/ && ln -sf /usr/local/go/bin/* /usr/bin/

查看go版本
go env

配置ngrok

下载ngrok并解压ngrok
wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/ngrok/ngrok.zip && unzip ngrok.zip

写入变量

1
2
export GOPATH=~/ngrok/
export NGROK_DOMAIN="xxx.trojanazhen.top"

cd ~/ngrok

生成证书

生成证书,Ngrok会使用此证书加密通讯:

1
2
3
4
5
6
7
8
9
openssl genrsa -out base.key 2048

openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out rootCA.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 rootCA.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

将证书文件复制到指定位置:

1
2
3
cp rootCA.pem assets/client/tls/ngrokroot.crt -f
cp server.crt assets/server/tls/snakeoil.crt -f
cp server.key assets/server/tls/snakeoil.key -f

编译

服务端编译:
Linux 平台 32 位系统:GOOS=linux GOARCH=386
Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
Windows 平台 32 位系统:GOOS=windows GOARCH=386
Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
MAC 平台 32 位系统:GOOS=darwin GOARCH=386
MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64

查看linux架构
dpkg --print-architecture

1
2
3
4
5
export GOOS=linux

export GOARCH=amd64

make release-server # 会在bin目录下生成ngrokd文件

客户端编译:

1
2
3
4
5
export GOOS=linux

export GOARCH=arm

make release-client # 会在bin目录下生成linux_arm文件夹

域名解析

把申请的域名解析到这个服务器的公网ip
A xxx 默认 52.xx.xx.xxx

vps服务器端口开启
5000 0.0.0.0/0
4443 0.0.0.0/0

vps服务器端部署:(vps上运行)
sudo cp ~/ngrok/bin/ngrokd /usr/bin/

screen -S ngrok

sudo ./ngrokd -log=ngrok_log.txt -domain="xxx.trojanazhen.top"

客户端部署

树莓派新建ngrok和配置文件
mkdir ~/ngrok/ && cd ~/ngrok/ && touch ngrok.cfg

ngrok.cfg

1
2
3
4
5
6
7
server_addr: xxx.trojanazhen.top:4443
trust_host_root_certs: false
tunnels:
ssh:
remote_port: 5000
proto:
tcp: "192.168.2.234:22"

运行:
把服务器端的~/ngrok/bin/linux_arm/ngrok下载到树莓派的ngrok文件夹

tcp22穿透
screen -S tcp_ssh

sudo ./ngrok -proto=tcp -config ngrok.cfg 22

启动服务
screen -S ngrok

sudo ./ngrok -config=ngrok.cfg start ssh

树莓派开机自启ngrok

sudo touch /etc/init.d/ngrok && sudo chmod +755 /etc/init.d/ngrok

sudo vi /etc/init.d/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
#!/bin/bash
### BEGIN INIT INFO
# Provides: ngrok
# Required-Start:
# Required-Stop:
# default-Start: 2 3 4 5
# default-Stop: 0 1 6
# Short-Description: Start/Stop ngrok server
### END INIT INFO
set -e

do_start()
{
nohup sudo /home/pi/ngrok/ngrok -proto=tcp -config /home/pi/ngrok/ngrok.cfg 22 >> /home/pi/ngrok/log.log 2>&1 &
nohup sudo /home/pi/ngrok/ngrok -config=/home/pi/ngrok/ngrok.cfg start ssh >> /home/pi/ngrok/log.log 2>&1 &
}

do_stop()
{
ps -ef | grep ngrok | awk '{print $2}' | sudo xargs kill -9
}

case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart)
do_stop
do_start
;;
*)
;;
esac

exit 0

开启自启服务
sudo vi /etc/rc.local

1
2
sudo /etc/init.d/ngrok start
exit 0

or

1
2
3
4
5
sudo apt install chkconfig -y

sudo chkconfing ngrok on

chkconfing ngrok

欢迎关注我的其它发布渠道