在云主机上搭建ngrok实现内网穿透

本文详细介绍如何在CentOS系统上使用ngrok实现公网穿透,包括安装GO语言、从github拉取ngrok、配置letsencrypt免费证书、打包程序、运行服务端及客户端等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ngrok可以支持http,https,tcp各种协议的转发,可以将自己本地的电脑映射到公网上,其安装配置也十分的简单,但是前提条件是需要你有一个域名。


这里安装的ngrok是1.x版本,ngrok的作者在自己的开源库里说明了这个版本存在内存泄露等严重问题,而他的ngrok2.x则是解决了这些问题,但是是收费的,并没有开源。
鉴于博主使用至今并没有出现什么严重的问题,我觉得这个还是可以继续在自己的主机搭建来玩一玩的。


博主是在CentOS系统的云主机上搭建ngrok的,域名和证书都是免费获取的,具体方法可以参照这篇教程
当然嫌麻烦也可以不申请证书,但是域名一定要有,而且域名申请也十分简单,。,


域名和证书都有了之后就是ngrok的安装了,这里提供一下CentOS的安装教程
1.首先安装GO语言,因为ngrok是GO语言编写的

yum install golang

2.接下来需要从github上将ngrok拉取下来,如果没有git,执行yum install git安装,然后选个地方直接拉取git clone https://github.com/tutumcloud/ngrok.git ngrok
拉下来的目录结构如下

[root@VM_16_11_centos temp]# ll ngrok/
total 40
drwxr-xr-x 4 root root 4096 Sep  2 10:16 assets
drwxr-xr-x 4 root root 4096 Sep  2 13:53 bin
drwxr-xr-x 2 root root 4096 Sep  2 10:16 contrib
-rw-r--r-- 1 root root  199 Sep  2 10:16 CONTRIBUTORS
drwxr-xr-x 2 root root 4096 Sep  2 10:16 docs
-rw-r--r-- 1 root root  551 Sep  2 10:16 LICENSE
-rw-r--r-- 1 root root 1433 Sep  2 10:16 Makefile
drwxr-xr-x 5 root root 4096 Sep  2 10:23 pkg
-rw-r--r-- 1 root root 1904 Sep  2 10:16 README.md
drwxr-xr-x 5 root root 4096 Sep  2 10:18 src

3.进入拉下来的ngrok文件夹,如果你已经配置了letsencrypt的免费证书,那么就将生成的证书文件复制到asseert文件夹,下面是博主自己的证书存放的位置和ngrok的存放位置,请自行更改

 cp /etc/letsencrypt/live/madongyu.ml/chain.pem temp/ngrok/assets/client/tls/ngrokroot.crt 
 cp /etc/letsencrypt/live/madongyu.ml/cert.pem temp/ngrok/assets/server/tls/snakeoil.crt 
 cp /etc/letsencrypt/live/madongyu.ml/privkey.pem temp/ngrok/assets/server/tls/snakeoil.key 

没有证书的话就只能自己签名一个了,$NGROK_DOMAIN是自己的域名

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

得到证书之后操作如上,不过如果你用的是letsencrypt的证书,那么运行ngrok的时候最好指定证书地址,而不是放在assert打包到程序。。。不然就要三个月换一次。。。
4.证书也配置好之后就是程序的打包了,可以选择打包对应平台的客户端和服务端

#win服务端
GOOS=windows GOARCH=386 make release-server 
#win客户端
GOOS=windows GOARCH=386 make release-client
#linux服务端
GOOS=linux GOARCH=386 make release-server
#linux客户端
GOOS=linux GOARCH=386 make release-client

直接在ngrok目录下运行命令就可以了,生成的程序在bin文件夹里面
5.最后就是运行了,如果客户端一直连接不上,请关掉防火墙,或者检查证书是否有误。
服务端运行
ngrokd -domain="madongyu.ml" -httpAddr=":1111" -httpsAddr=":2222 -tlsKey=xxx.key -tlsCrt=xxx.crt"
如果配置了assert就不需要后面两个参数,这两个就是指定证书的位置,domian参数代表域名,httpAddr和htppsAddr代表监听的http和https对应的端口
客户端运行,需要写一个配置文件ngrok.cfg,当然也可以不写
A)监听http和https,这里监听客户端主机的8987端口
ngrok.exe -subdomain test kyt -config=ngrok.cfg 8987
这里监听成功后会在你的域名前面添加前缀,即subdomain的值test,变成test.xxxx.xxxx,这个时候你需要配置自己域名的子域名,具体操作可以在自己云主机的管理界面操作,下面是我自己的配置成功的图,使用‘*’是为了偷懒。。。记住配置成功后需要时间生效,10分钟以内生效
这里写图片描述
B)监听TCP(可用于远程主机联机),这里使用start参数可以直接在配置文件里面调用参数,这样就不用写很多了,而且这里也不用配置子域名了,不需要。
.\ngrok.exe -config=.\config.cfg start transmission
配置文件ngrok.cfg,必须遵循YML文件格式,否则会报错,直接复制过去可能运行的时候会报错,可以使用线上的YAML检测工具校验

server_addr: "madongyu.ml:4443"
trust_host_root_certs: false
tunnels:
  transmission:
    remote_port: 3389
    proto:
      tcp: 3389

server_addr就是自己服务器的域名以及默认的监听端口4443,可以在启动的时候自定义。
tunnels是隧道的意思,我们可以自定义多条隧道,名字也可以自定义,transmission就是我自定义的tcp隧道(名字随意),监听客户端的3389端口,绑定到主机的3389端口。


### 内网穿透技术详解及在树莓派个人服务器中的实现方法 #### 什么是内网穿透 内网穿透是一种技术手段,用于将局域网内的设备或服务暴露到互联网上。通常情况下,家庭或办公室的网络环境是通过路由器接入互联网的,而路由器会分配给内部设备私有IP地址。由于这些私有IP地址无法直接被外部网络访问,因此需要借助内网穿透技术来实现外网对内网设备的访问[^2]。 #### 内网穿透的主要方法 内网穿透可以通过以下几种方式实现: 1. **路由器端口映射**:如果用户的路由器具有公网IP地址,可以通过配置路由器的端口映射规则,将特定端口的流量转发到局域网内的树莓派设备上[^2]。 2. **商业化或开源内网穿透工具**:例如frp、ngrok等工具,它们利用中间服务器作为桥梁,将外网请求转发到内网设备上[^3]。 3. **云主机反向代理**:通过购买一台具有公网IP的云主机,设置反向代理规则,将请求转发到内网中的树莓派设备上[^2]。 #### 内网穿透在树莓派个人服务器中的应用 树莓派作为一种低成本、低功耗的嵌入式计算设备,非常适合用来搭建个人服务器。然而,默认情况下,树莓派位于家庭或办公室的局域网中,无法直接被外网访问。为了解决这一问题,可以采用内网穿透技术。 以下是使用frp实现内网穿透的具体方法: #### 配置frp服务端 在具有公网IP的服务器上安装frp服务端,并创建配置文件`frps.ini`: ```ini [common] bind_port = 7000 ``` 启动frp服务端: ```bash ./frps -c ./frps.ini ``` #### 配置frp客户端(树莓派) 在树莓派上安装frp客户端,并创建配置文件`frpc.ini`: ```ini [common] server_addr = x.x.x.x # 替换为frp服务端的公网IP server_port = 7000 [web] type = http local_ip = 127.0.0.1 local_port = 8080 custom_domains = yourdomain.com ``` 启动frp客户端: ```bash ./frpc -c ./frpc.ini ``` 完成上述配置后,可以通过`yourdomain.com`访问树莓派上的Web服务[^3]。 #### 示例代码:验证树莓派上的Web服务 在树莓派上安装Nginx并启动服务: ```bash sudo apt update sudo apt install nginx sudo systemctl start nginx ``` 确保Nginx监听的端口与frp客户端配置文件中的`local_port`一致。 #### 注意事项 - 确保frp服务端和客户端的版本匹配。 - 如果树莓派ZERO是armv6架构,可能需要寻找适合该架构的frp客户端版本[^4]。 - 定期检查frp的日志文件,确保其正常运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值