本文转自:自搭Ngrok实现树莓派内网穿透,有删改。node
若是把花生壳类比为使用别人搭好的ss服务,那么自建Ngrok就是使用本身的ss服务,可见自搭Ngrok的优点不言而喻,流量费用十分经济,速度,稳定性和安全性将远远赛过花生壳。linux
如今花生壳是一种比较流行的穿透内网的方式,不过其稳定性随着使用人数的增多而大打折扣,内网穿透的价格也不便宜,一套花生棒就是动轭上百,并且流量还要单独买,若是遭遇流量攻击套餐基本就泡汤了。c++
Ngrok编译部署条件:git
- 域名 (.top域名4元首年)
- 拥有独立IP的VPS或云主机 (标准配置低于50一年)
编译 Ngrok 客户端时会使用openssl生成证书来加密通信,保证了安全性,使用时必须和签署证书时的域名吻合。github
安装必要包golang
yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ build-essential mercurial
这里使用国内镜像下载源码windows
# 下载地址: https://www.golangtc.com/static/go/ wget https://www.golangtc.com/static/go/1.7.6/go1.7.6.linux-386.tar.gz tar -zxvf go1.7.6.linux-386.tar.gz mv go /usr/local/ ln -s /usr/local/go/bin/* /usr/bin/
安装成功后查看可Go编译环境centos
[root@centos~]# go env GOARCH="386" GOBIN="" GOEXE="" GOHOSTARCH="386" GOHOSTOS="linux" GOOS="linux" GOPATH="" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/linux_386" CC="gcc" GOGCCFLAGS="-fPIC -m32 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build142852038=/tmp/go-build -gno-record-gcc-switches" CXX="g++" CGO_ENABLED="1"
Go 编译过程当中要求高版本的 git,而 yum 源里面默认只有 1.7.1 版本。浏览器
wget https://www.kernel.org/pub/software/scm/git/git-2.9.3.tar.gz tar zxvf git-2.9.3.tar.gz cd git-2.9.3 ./configure --prefix=/usr/local/git-2.9.3 make make install
取代 yum 安装的低版本 git安全
yum remove git* ln -s /usr/local/git-2.9.3/bin/* /usr/bin/
检查 git 版本是否为 2.9.3
[root@centos ~]# git --version git version 2.9.3
声明编译的路径和必要的域名(域名改为你本身的)
git clone https://github.com/inconshreveable/ngrok.git ~/ngrok export GOPATH=~/ngrok/ export NGROK_DOMAIN="ngrok.sfantree.com" cd ~/ngrok
生成证书,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 -i cp server.crt assets/server/tls/snakeoil.crt -i cp server.key assets/server/tls/snakeoil.key -i
服务器端为linux-x86-64
export GOOS=linux export GOARCH=386 make release-server
编译完成事后 ~/ngrok/bin/ngrokd
即为服务端运行文件.
若客户端版本与服务端一致,则无需更改 “COARCH” 值,直接编译客户端
make release-client
编译完成事后 ~/ngrok/bin/ngrok
即为客户端运行文件。
注 : 这里测试时只编译了 i386 的服务器端和 i386 的客户端,实际上能够经过改变
GOOS
与GOARCH
来获取各个平台的客户端与服务端,GOOS
能够指定为windows
、linux
、freebsd
、darwin
(Mac OS X 10.5 or 10.6) 和nacl
(Chrome 的Native Client 接口) ,GOARCH
能够指定为amd64
(64-bit x86) 、386
(32-bit x86) 、 和arm
(32-bit ARM),可见 Go 语言的跨平台能力至关彪悍。
在编译配置时的域名 ngrok.sfantree.com
解析到服务器IP
注意:指定 A 记录时 ngrok 与 *.ngrok 都要填上,这样能方便地使用不一样子域转发不一样的本地服务。
将编译好的可执行文件移至 /usr/bin/
下
cp ~/ngrok/bin/ngrokd /usr/bin/
为 ngrokd 单独开一个 screen
yum install -y screen screen -dmS ngrokd screen -x ngrokd
运行 ngrokd
ngrokd -domain="ngrok.sfantree.com" -httpAddr=":80" -httpsAddr=:10001 -tunnelAddr=:10002
屏幕会输出一连串日志信息,httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,服务端设置 tunnelAddr 端口用来跟客户端通信,注意设置防火墙使端口开放。
将 ~/ngrok/bin/ngrok
移至客户端下
新建配置文件
mkdir ~/ngrok/ && cd ~/ngrok/ touch ~/ngrok/ngrok.cfg echo "server_addr: ngrok.sfantree.com:10002" >> ~/ngrok/ngrok.cfg echo "trust_host_root_certs: false" >> ~/ngrok/ngrok.cfg
运行客户端
注意给客户端赋予执行的权限
# 指定子域名为 pi,采用 http 协议和使用 80 端口 ./ngrok -subdomain pi -proto=http -config=ngrok.cfg 80
浏览器地址栏输入 pi.ngrok.sfantree.com
从 Ngrok 强大的反向代理功能能够看出 Go 语言独特魅力,除了 glibc 的版本有必定要求,其跨平台编译为部署省去了很多时间,固然 Go 还有更多的优势,本文提到的也只是 Ngrok 的冰山一角,利用其 TCP 转发也能够远程 SSH 树莓派,更多玩法就自行百谷了。