一、前言
最近买了个树莓派4b 8g版本的,想着当作个人网盘使用。正好平时开发用的MySQL、nginx、redis等软件也可以放到树莓派上面跑了。
二、准备材料
- 服务器,用来搭建ngrok的服务器,必须有公网IP能正常访问。我用的是centos7.5
- 域名,用来做映射。
两个条件缺一不可。如何无法满足上述条件,只能去买别人搭建好的了,但是费用也不低。某网的是10元/月,但是现在腾讯云搞活动,云服务器平均一个月最低才7.3,而且不限制老用户。我其实也是今天薅了个羊毛。
三、搭建
配置域名
比如我用lisen.me做映射,那么必须要配置好lisen.me还有*.lisen.me,将域名指向公网IP。
安装git和Golang
这个比较简单,直接执行下面的命令即可
apt-get install build-essential golang mercurial git
下载源码
此处使用非官方地址,修复了部分包无法获取
git clone https://github.com/tutumcloud/ngrok.git ngrok
生成签名证书
使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,如果不想买SSL证书,我们需要生成自己的自签名证书,并编译一个携带该证书的ngrok客户端。
cd ngrok NGROK_DOMAIN="lisen.me" 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
注意替换域名:将
lisen.me
替换成自己的域名替换默认证书
执行完成后需要替换证书
cp base.pem assets/client/tls/ngrokroot.crt
执行完命令后,会提示是否覆盖,输入y回车即可。
编译服务端
make release-server release-client
运行服务端
编译成功后会在bin目录下找到
ngrokd
和ngrok
这两个文件。其中ngrokd
就是服务端程序了。./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="lisen.me" -httpAddr=":80" -httpsAddr=":443"
注意替换域名
httpAddr
、httpsAddr
分别是ngrok
用来转发http
、https
服务的端口,可以随意指定。ngrokd
还会开一个4443
端口用来跟客户端通讯(可通过-tunnelAddr=”:xxx”
指定)。编译客户端
不同客户端编译方法不一样,我这里只介绍win和树莓派的
8.1 windows 64位
GOOS=windows GOARCH=amd64 make release-client
8.2 树莓派
GOOS=linux GOARCH=arm make release-client
执行对应的命令会在bin目录下生成相对应的windows和linux_arm的目录,客户端分别放到两个目录中。
下载客户端到要穿透的电脑并配置
因为我使用树莓派运行,所以下载linux_arm目录下的ngrok,然后上传到树莓派系统。
配置客户端
在ngrok同级目录创建文件
ngrok.cfg
,并配置信息,我配置的比较多,按需配置即可server_addr: lisen.me:4443 trust_host_root_certs: false tunnels: weixin: subdomain: www proto: http: 80 about: subdomain: seafile proto: http: 8000 ssh: remote_port: 222 proto: tcp: 22 vnc: remote_port: 5900 proto: tcp: 5900 mysql: remote_port: 3306 proto: tcp: 3306 redis: remote_port: 6379 proto: tcp: 6379
采用严格的单空格缩进,可以代理其他主机,直接跟端口默认是本主机,还要注意防火墙的配置。
运行客户端
./ngrok -config ngrok.cfg start-all
启动后出现
online
字样说明内网穿透成功。
四、配置服务端开机自启
- 思路很简单,就是在
/etc/systemd/system/
目录下创建一个叫做ngrok.service
的文件,然后写入一下代码:
[Unit]
Description=ngrok
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/ngrok/bin/ngrokd -tlsKey=/usr/bin/ngrok/server.key -tlsCrt=/usr/bin/ngrok/server.crt -domain="lisen.me" -httpAddr=:80 -httpsAddr=:443 > /dev/null 2>&1 &
[Install]
WantedBy=multi-user.target
这样的话系统就会把我们的脚本识别为服务,然后我们就可以用systemctl
这个工具来轻松管理ngrok的运行与启动。
运行ngrok
systemctl start ngrok
查询ngrok状态
systemctl status ngrok
实现开机启动
systemctl enable ngrok
五、配置客户端开机自启
- 思路很简单,就是在
/etc/systemd/system/
目录下创建一个叫做ngrok.service
的文件,然后写入一下代码:
[Unit]
Description=ngrok
After=network.target
[Service]
Type=simple
ExecStart=/home/pi/ngrok/ngrok -config /home/pi/ngrok/ngrok.cfg start-all
[Install]
WantedBy=multi-user.target
这样的话系统就会把我们的脚本识别为服务,然后我们就可以用systemctl
这个工具来轻松管理ngrok的运行与启动。
运行ngrok
systemctl start ngrok
查询ngrok状态
systemctl status ngrok
实现开机启动
systemctl enable ngrok
楼主辛苦了。