ngrok 搭建内网穿透

0. 系统环境

1. 准备安装包

go 语言不要太新版的,也不要太旧版的,容易出莫名其妙的问题

git 版本不清楚,尽量是 2.0 以上的吧

2. 域名泛解析

参考: https://www.vediotalk.com/archives/336

3. go 环境搭建

下载对应系统的安装包 go1.9.2.linux-amd64.tar.gz

yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386

tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz

root 下执行

mkdir $HOME/go
echo 'export GOROOT=/usr/local/go'>> ~/.bashrc
echo 'export GOPATH=$HOME/go'>> ~/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc
source $HOME/.bashrc

4. git 安装

下载安装包

# 下载编译工具
yum -y groupinstall Development Tools
yum -y install zlib-devel perl-ExtUtils-MakeMaker asciidoc xmlto openssl-devel

yum install curl-devel


tar -C /usr/local -zxvf git-2.9.0.tar.gz
cd /usr/local/git-2.9.0
./configure --prefix=/usr/local/git
make && make install
export PATH="/usr/local/git/bin:$PATH"
source /etc/profile
git --version

5. 获取 ngrok 源码

cd /usr/local
git clone https://github.com/inconshreveable/ngrok.git

1. 修改 ~/.bashrc

# ngrok
# 修改为自己解析的域名
export NGROK_DOMAIN="xxx.cn"
export GOPATH="/usr/local/ngrok/"

2. source 一下

source ~/.bashrc

3. 生成自签名 ssl 证书

cd /usr/local/ngrok

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

# 查看一下
ls -l
  • 多了 6 个证书,少了请重新操作

-rw-r--r-- 1 root root 1679 Dec 30 21:37 rootCA.key
-rw-r--r-- 1 root root 1139 Dec 30 21:37 rootCA.pem
-rw-r--r-- 1 root root   17 Dec 30 21:37 rootCA.srl
-rw-r--r-- 1 root root 1021 Dec 30 21:37 server.crt
-rw-r--r-- 1 root root  911 Dec 30 21:37 server.csr
-rw-r--r-- 1 root root 1679 Dec 30 21:37 server.key

4. 替换证书,询问是否确认替换,全部 yes

cp -rf rootCA.pem assets/client/tls/ngrokroot.crt
cp -rf device.crt assets/server/tls/snakeoil.crt
cp -rf device.key assets/server/tls/snakeoil.key

6. 交叉编译

1. windows 客户端编译

  • 首先
cd /usr/local/go/src/
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 ./make.bash

rm -rf /root/go1.4
cp -r /usr/local/go /root/go1.4
  • 再然后
cd /usr/local/ngrok
GOOS=windows GOARCH=amd64 make release-server release-client

2. mac 客户端编译

  • 首先
cd /usr/local/go/src/
GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 ./make.bash
  • 再然后
cd /usr/local/ngrok
GOOS=darwin GOARCH=amd64 make release-server release-client

3. linux 客户端编译

  • 首先
cd /usr/local/go/src/
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./make.bash

rm -rf /root/go1.4
cp -r /usr/local/go /root/go1.4
  • 再然后
cd /usr/local/ngrok
GOOS=linux GOARCH=amd64 make release-server release-client

4. arm 客户端编译

  • 首先
cd /usr/local/go/src/
GOOS=linux GOARCH=arm CGO_ENABLED=0 ./make.bash
  • 再然后
cd /usr/local/ngrok
GOOS=linux GOARCH=arm make release-server release-client

8. ngrokd 服务端启动

  • 临时启动
/usr/local/ngrok/bin/linux_amd64_linux/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
  • 后台启动
nohup /usr/local/ngrok/bin/linux_amd64_linux/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" > /dev/null &
  • 想要结束进程
# 得到 PID
ps -aux | grep ngrokd
# kill PID
kill xxxx
  • 说明
(2)参数说明:3 个端口可随意配置(不能和现有服务端口冲突,阿里云服务器需打开对应端口)

# -domain         访问 ngrok 是所设置的服务地址生成证书时那个域名
# -httpAddr       http 协议端口 默认为 80
# -httpsAddr      https 协议端口 默认为 443 (可配置 https 证书)
# -tunnelAddr     通道端口,默认 4443

(3)注意:
所有涉及的端口,都需在阿里云(腾讯云)上设置规则,即打开端口

9. ngrok 启动客户端

  • 将 ngrok 客户端拷贝到需要穿透的服务器
  • 创建 ngrok.cfg 配置文件,只使用 ssh 登录
server_addr: "xxx.cn:4443"  # 远程地址,需要修改
trust_host_root_certs: false
tunnels:  # 隧道
  ssh:  # 隧道名称
    remote_port: 503       # 绑定到远程地址的那个端口,需要自己设定
    proto:
      tcp: 22               # 本地的 TCP 22端口
  • 一个网上的 ngrok.cfg
server_addr: "leon.cn:4443"   //注意域名一定要和服务器端一致
trust_host_root_certs: false
tunnels:
  web:
    subdomain: leon    # 域名前缀  leon.cn
    remote_port: 9024
    proto:
      http: 80              # 本地的 HTTP 80 端口
      
  https:
    subdomain: "ssl"
    proto:
      https: 443
      
  openvpn:
    remote_port: 5555       # 映射的端口
    proto:
      tcp: 1194
    
  ssh:
    remote_port: 2222
    proto:
      tcp: 22
  • 临时启动
./ngrok -config=ngrok.cfg start http        #启动 web 服务 
./ngrok -config=ngrok.cfg start tcp         #启动 tcp 服务 
./ngrok -config=ngrok.cfg start http tcp    #同时启动两个服务 
./ngrok -config=ngrok.cfg start ssh         #同时启动 shh 
./ngrok -config=ngrok.cfg start-all         #启动所有服务
  • 后台启动
setsid ./ngrok -config=ngrok.cfg start-all
  • 重启脚本
#/bin/sh

# set -x

# 检查 ngrokd 是否关闭
# 若关闭,重启服务


for ((;;))
do
    # 显示时间
    date "+%Y-%m-%d %H:%M:%S"

    # 查找 ngrokd 的 PID
    pidlist=`ps -ef | grep "/usr/local/ngrok/bin/linux_amd64_linux/ngrokd" | grep -v "grep" | awk '{print $2}'` 

    if [ "$pidlist" = "" ] 
    # 如果不存在
    then 
        echo "no ngrokd pid alive!"
        # 重启命令
        `nohup /usr/local/ngrok/bin/linux_amd64_linux/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" > /dev/null 2>&1 &` ; ls > /dev/null
        wait
    else 
        echo -e "ngrokd pid list :  $pidlist  \n"
        wait 
    fi 

    echo -e "\n\n\n"
    # 休眠五分钟
    sleep 300
done

echo "shell stop!!!!!, " 
  • 运行
nohup sh restart_ngrokd.sh > restart.log &

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值