花生壳是比较目前流行的穿透内网的工具,但其稳定性和价格确实不敢恭维。Ngrok 是一个由 Go 语言写的反向代理工具,可以将本地端口映射到公网上,其速度和稳定性不亚于花生壳。为了方便连接树莓派便利用博客主机搭建 Ngrok 映射了22端口...
解析设置
以域名 ngrok.syscmd.online 为例
记录类型 | 主机记录 | 解析线路 | 记录值 | MX优先级 | TTL |
A | ngrok | default | [服务器IP] | - | 600 |
A | *.ngrok | default | [服务器IP] | - | 600 |
Ngrok 的安装编译与运行
sudo apt-get install build-essential golang mercurial git cd ~ git clone https://github.com/inconshreveable/ngrok.git #建议使用 git clone https://github.com/tutumcloud/ngrok.git,该分支修复了无法访问的包地址。 cd ngrok NGROK_DOMAIN="ngrok.syscmd.online" #Ngrok 绑定的域名 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 #交叉编译时可能会因为 GFW 的原因导致依赖无法下载 sudo GOOS=linux GOARCH=amd64 make release-server release-client #GOOS参数:Mac OS用darwin,Windows用windows。 #GOARCH参数:ARM嵌入式用arm,32位操作系统用386。 sudo GOOS=linux GOARCH=arm make release-client #树莓派用这个,编译完的 ngrok 位于bin/linux_arm/。 #测试服务端 Ngrok sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.syscmd.online" -httpAddr=":5566" -httpsAddr=":7788" #httpAddr、httpsAddr 分别是用来转发 http、https 服务的端口,默认分别为80、443。 #ngrokd 会通过 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=":xxx" 指定)。 #若配置了 iptables 规则,需要放行这三个端口上的 TCP 协议。 #服务端 Ngrok 守护进程 sudo apt install screen screen -S keepngrok cd ~/ngrok/ sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.syscmd.online" -httpAddr=":5566" -httpsAddr=":7788" #按 Ctrl + A + D 挂起 screen screen -ls #列出当前挂起的 screen #会输出类似如下内容 There is a screen on: 1997.keepngrok (03/24/17 21:16:01) (Detached) 1 Socket in /var/run/screen/S-ubuntu. screen -r keepngrok #恢复挂起的 screen,或者使用 screen -r 1997
Ngrok客户端的使用
由于Ngrok会将内网设备端口映射到公网上,运行在内网设备上的服务要做好安全配置!
映射SSH
#下载 bin/linux_arm/ngrok 并在同路径下创建配置文件 ngrok.cfg #注意格式,不要使用TAB代替空格! server_addr: "ngrok.syscmd.online:4443" trust_host_root_certs: false tunnels: ssh: remote_port: 2222 proto: tcp: 22 #运行 ./ngrok -config=ngrok.cfg start ssh
树莓派开机自启Ngrok
sudo nano /etc/init.d/ngrok #!/bin/sh ### BEGIN INIT INFO # Provides: ngrok # Required-Start: $local_fs $remote_fs $network # Required-Stop: $local_fs $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: ngrok # Description: Start Ngrok Service # ### END INIT INFO NAME=Ngrok DAEMON=/home/pi/ngrok/ngrok CONFIG=/home/pi/ngrok/ngrok.cfg TUNNELS="ssh" [ -x "$DAEMON" ] || exit 0 case "$1" in start) echo "Starting $NAME..." start-stop-daemon --start --chuid pi --exec $DAEMON --quiet --oknodo --background -- -config $CONFIG start $TUNNELS || return 2 ;; stop) echo "Stopping $NAME..." start-stop-daemon --stop --exec $DAEMON --quiet --oknodo --retry=TERM/30/KILL/5 || return 2 ;; restart) $0 stop && sleep 2 && $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0 sudo chmod +x /etc/init.d/ngrok #添加开机启动 sudo update-rc.d ngrok defaults #删除开机启动 sudo update-rc.d -f ngrok remove
我的小Pi
[左:内网 SSH 连接树莓派,右:公网 SSH 连接树莓派,下:Ngrok 公网服务器]
映射HTTP
#下载 bin/ngrok 并在同路径下创建配置文件 ngrok.cfg #注意格式,不要使用 TAB 代替空格! server_addr: "ngrok.syscmd.online:4443" trust_host_root_certs: false tunnels: http: subdomain: "test" auth: "username:password" proto: http: 80 #运行 ./ngrok -config=ngrok.cfg start http
正在 Deepin 上开发的 Z-BlogPHP 主题...
本地可以访问 http://127.0.0.1:4040 查看 Ngrok 日志
参考资料
[1] https://www.svenbit.com/2014/09/run-ngrok-on-your-own-server/
[2] http://www.lampblog.net/ubuntu/start-stop-daemon%E5%91%BD%E4%BB%A4/
[3] http://coderbee.net/index.php/linux/20130524/141
本文标题:Ngrok实现树莓派内网穿透
版权声明:本文使用「署名 4.0 国际」创作共享协议,转载或使用请遵守署名协议。