搭建ngrok服务实现内网穿透

日期: 2019-05-09

环境说明:

 编译环境:名称:CentOS7 系统:CentOS7 1810 64位GO版本:1.11 和 1.13 均测试编译通过,1.18不行公网主机:名称:cloud7系统:CentOS7 minimal 1804 64位本地主机:名称:yl_deep_local系统:Ubuntu 18.04 64位本次需要做内网穿透,实现再其他地方能连接本地主机yl_deep_local。注意文中的 tunnel.MYDOMAIN.COM 请替换为自己实际用的域名。

1 编译程序

1.0 准备工作

编译环境的主机最好配置国内的yum源,还需要配置epel源。配置epel后能方便的使用yum安装go语言编译环境。

1.1 下载源码包

git clone https://github.com/inconshreveable/ngrok.git

可以使用git下载,也可以直接下载zip包(我这里直接下载zip包,解压并上传到系统中)
我将源码放置于/opt/src/ngrok-src,如下图

1.2 生成证书

注意替换为自己的域名

mkdir ~/tmp
cd ~/tmp
export NGROK_DOMAIN="tunnel.MYDOMAIN.COM"
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 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 rootCA.key -CAcreateserial -out server.crt -days 5000

完成后生成如下证书(位于~/tmp目录):

替换证书

cd /opt/src/ngrok-src
cp ~/tmp/rootCA.pem assets/client/tls/ngrokroot.crt
cp ~/tmp/server.crt assets/server/tls/snakeoil.crt
cp ~/tmp/server.key assets/server/tls/snakeoil.key

1.3 安装go语言编译环境

(需配置epel源)

yum install golang

使用root账号运行,安装了如下包

1.4 编译程序

客户端版本说明

  • 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
  • ARM 平台:GOOS=linux GOARCH=arm
cd /opt/src/ngrok-src
export GOPATH=$(pwd)    # 设置go目标目录
GOOS=windows GOARCH=amd64 make release-client    # 编译windows 64客户端
GOOS=windows GOARCH=amd64 make release-server    # 编译windows 64服务端
GOOS=linux GOARCH=amd64 make release-client    # 编译linux 64客户端
GOOS=linux GOARCH=amd64 make release-server    # 编译linux 64服务端
GOOS=darwin GOARCH=amd64 make release-client    # 编译MAC 64客户端
GOOS=darwin GOARCH=amd64 make release-server    # 编译MAC 64服务端

完成编译后bin目录下有以下文件(各平台都编译了,以后备用)

2 配置服务端

2.1 配置域名解析到公网主机ip

这样 *.tunnel.MYDOMAIN.COM 和 tunnel.MYDOMAIN.COM 都解析到了公网主机 cloud7

2.2 配置服务端并启动服务

将ngrokd(linux amd64版)上传到公网主机的/opt/ngrok/目录下,然后添加执行权限

chmod +x /opt/ngrok/ngrokd    # 后来由于方便起见放到 /usr/bin 目录下

后来由于方便起见放到 /usr/bin 目录下,以便可以使用命令直接运行

ngrokd -domain=tunnel.MYDOMAIN.COM -httpAddr=:5442 -httpsAddr=:5443 -tunnelAddr=:4443

效果如下图:

看情况,后台启动添加 nohup,日志重定向到日志文件或/dev/null

2.3 开启防火墙端口

我这里只用4443

firewall-cmd --zone=public --add-port=4443/tcp --permanent
firewall-cmd --reload

3 配置客户端

3.1 配置客户端

将ngrok(linux amd64版)上传到本地主机的/opt/ngrok/目录下,然后添加执行权限

chmod +x /opt/ngrok/ngrok

新建配置文件(这里使用配置文件的方式启动ngrok,另一种方式是直接命令中指定相关配置选项)

cd /opt/ngrok/
vi /opt/ngrok/ngrok-config

内容如下

server_addr: "tunnel.MYDOMAIN.COM:4443"
trust_host_root_certs: false
tunnels:web:proto:http: 80subdomain: webwebs:proto:https: 443hostname: webs.tunnel.MYDOMAIN.COMssh:proto:tcp: 10022remote_port: 10022

这里配置了3条转发,这里测试用10022作为ssh端口,默认端口为22。

3.2 启动客户端

前面配置了3条,这里只启动ssh

./ngrok -config=ngrok-config start ssh

效果如下
如果需同时启动其他规则,命令start后添加其他规则名称即可,如启动web和webs

./ngrok -config=ngrok-config start web webs

如果想一次启动所有,可以使用命令

./ngrok -config=ngrok-config start-all

3.3 效果测试

xshell的ssh配置,主机中填写域名

使用xshell连接

连接成功,试了几个小时,没有掉线情况。之前使用ssh转发,经常掉,现在终于解决问题了。

4 配置为服务自启动

将程序配置为服务项,开机启动

4.1 配置服务端

服务端为CentOS7

vi /usr/lib/systemd/system/ngrokd.service

内容如下,注意Exec命令中不要有双引号,会导致失败(找了好久问题)

[Unit]
Description=ngrokd
After=network.target[Service]
TimeoutStartSec=30
ExecStart=/usr/bin/ngrokd -domain=tunnel.MYDOMAIN.COM -httpAddr=:5442 -httpsAddr=:5443 -tunnelAddr=:4443 -log-level=INFO
ExecStop=/bin/kill -SIGINT $MAINPID
ExecReload=/bin/kill -SIGHUP $MAINPID
Restart=on-failure
#NotifyAccess=main
#WatchdogSec=30[Install]
WantedBy=multi-user.target

启动设置及相关命令

systemctl daemon-reload  # 载入配置服务
systemctl enable ngrokd  # 设置开机启动
systemctl start ngrokd   # 开启ngrok
systemctl status ngrokd  # 查看状态
systemctl stop ngrokd    # 停止

4.2 配置客户端

客户端为Ubuntu 18.04

vim /lib/systemd/system/ngrok-ssh.service

内容如下

[Unit]
Description=ngrok-ssh.service[Service]
#Type=forking
#PIDFile=/run/test.pid
#EnvironmentFile=/etc/systemd/test.conf
ExecStart=/usr/bin/nohup /usr/bin/ngrok  -log=stdout -log-level=INFO -config=/opt/ngrok/ngrok-config start ssh
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
Restart=on-failure
#NotifyAccess=main
#WatchdogSec=30[Install]
WantedBy=multi-user.target

相关命令

systemctl daemon-reload    # 载入配置服务
systemctl enable ngrok-ssh  # 设置开机启动
systemctl start ngrok-ssh    # 启动服务
systemctl status ngrok-ssh    # 查看状态
systemctl stop ngrok-ssh    # 停止服务

5 后续补充

2022-10-19重新编译,有几个坑:

  1. go 新版不行,后使用ubuntu 20.04(go 1.13)成功编译;
  2. 依赖 uniseg 最高支持 uniseg-0.2.0 版本的,试出来的;
  3. 由于网络问题可能无法下载依赖的,可以通过手动下载,然后放置到src下对应的目录,如提示go get -tags 'release' -d -v ngrok/... github.com/nsf/termbox-go (download) 时,可以到github下载源代码,然后放到src/github.com/nsf/termbox-go即可,如图:

编译搭建ngrok服务实现内网穿透相关推荐

  1. linux服务器搭建ngrok服务-实现内网穿透(转载,自己搭建成功)

    1.ngrok依赖gcc 和 golang的安装已经存在请忽略 # 安装 gcc   yum -y install gcc   yum -y install gcc-c++   # 安装 golang ...

  2. Ngrok免费实现内网穿透

    1.使用场景 让本地局域网的跑的应用可以被外网访问 2.常用内网穿透工具 能实现内网穿透的工具也挺多,下面列出了几个 Ngrok 一个通过任何NAT或防火墙为您的本地主机服务器提供即时访问.安全的UR ...

  3. [Linux]zerotier阿里云部署moon服务实现内网穿透

    [Linux]zerotier私有云部署moon服务实现内网穿透 一.前言 zerotier+阿里云ESC服务器+MacBook Air(M1)+openwrt 二.zerotier基本使用(直连外网 ...

  4. 群晖搭建个人网站,内网穿透实现公网访问 1/3

    系列文章 群晖搭建个人网站,内网穿透实现公网访问 1/3 群晖搭建个人网站,内网穿透实现公网访问 2/3 群晖搭建个人网站,内网穿透实现公网访问 3/3 现代商业活动离不开数据,随着时间推移,企业的数 ...

  5. 群晖搭建个人网站,内网穿透实现公网访问 3/3

    列文章 群晖搭建个人网站,内网穿透实现公网访问 1/3 群晖搭建个人网站,内网穿透实现公网访问 2/3 群晖搭建个人网站,内网穿透实现公网访问 3/3 上一篇: 群晖搭建个人网站,内网穿透实现公网访问 ...

  6. ngrok+nginx 实现内网穿透 共用80端口

    内网穿透能干嘛: 穿透后,你的机器指定端口就直接暴露在外网上,3389,vnc,web服务等等任何服务都可以支持.微信开发需要回调web服务器接口,如果开发机器在内网,就无法调试. 原理 外网服务器A ...

  7. ngrok一款内网穿透+记录HTTP请求的神器(支持HTTPS)

    双方都是内网的反弹shell工具. Ngrok的下载地址:https://ngrok.com/download 如果你是MAC OS X或者linux可以按照以下步骤安装. $ unzip /path ...

  8. 如何利用VPS配置搭建frp/frps进行内网穿透

    目录 扯一会闲话 什么是frp 准备材料 服务器端安装说明 常用命令包括 扯一会闲话 事情的起因是我用旧电脑拼凑了一台NAS,想在外面也能访问我放在家里的NAS.但大家也知道公网IPv4地址现在已经所 ...

  9. 用IIS搭建网站并进行内网穿透

    前言 在这个信息的时代,我们想要搭建一个属于自己的服务器是非常简便的. 利用windows自带的web服务器IIS(Internet Information Services),来搭建一个属于自己的网 ...

最新文章

  1. 解决opencv错误AttributeError: module ‘cv2.cv2‘ has no attribute ‘xfeatures2d‘
  2. 唱歌如何保持高位置_歌唱中如何找到声音的高位置,内容详解
  3. rest-framework之响应器(渲染器)
  4. Maven之——使用本地jar包并打包进war包里面的方法
  5. 【Flink】FlinkPer-partition watermark 问题 某个 分区延迟 导致数据丢失
  6. Android中ListView复用导致布局错乱的解决方案
  7. 技术专家(ai/大数据)_``我们淹没在数据中'':在专家和AI时代如何思考自己
  8. hilife技术支持网站
  9. 方维直播源码搭建详细流程
  10. Web实现:flex弹性布局三栏自适应布局
  11. 园林系统优秀党员推荐材料_事迹材料-园林绿化公司党员先进个人事迹材料
  12. ESP32-C3入门教程 WiFi篇②——WiFi Station 模式连接到 AP 热点接入点
  13. 广义线性混合模型(GLMM)变量选择
  14. 单曲循环 翻译_Loop, repeat and replay “单曲循环” 用哪个词?
  15. 解决myeclipse里面git的pull操作问题
  16. 分享10款小白也能做起来的平衡车设计资料
  17. 用友nc阻止java运行_用友NC网页版进不去,应用程序已被安全设置阻止..._安全工程师_帮考网...
  18. NetBeans中文字体显示问题
  19. vue 批量图片上传
  20. 数学物理方法 06 定解问题

热门文章

  1. 考研复试英语介绍计算机专业,2018计算机考研复试英语自我介绍范本及重点
  2. 语音标注工具:Praat
  3. Praat:强大的语音处理工具。
  4. 关于学习java函数式接口Function中的apply方法的一些感悟
  5. 关于励志的名人名言----做人的名言
  6. 解决MySql数据库远程访问Access denied for user: xxx@%' to database ‘datatest’ 问题
  7. E音乐盒! emusicbox 批量下载百度MP3搜狗MP3
  8. arm el2与el3_armv8架构与指令集.整理.初稿.pdf
  9. G6展示网络拓扑图,适配大数据量的方案
  10. MATLAB-Simulink基础知识