手把手教你在 CentOS7 上部署Ngrok (踩坑填坑)

一、項目準備

1、一個可用的域名(不是必須,但是最好有)

2、一臺有公網IP的服務器

二、項目實施

? ? ? ? 本文的操作過程主要參考了《教你自己服務器搭建Ngrok》,但是隨著時間的推移,很多軟件因版本升級而產生了一些變化,因此有必要重新梳理一遍部署過程。同時,本文也是操作筆記,方便日后查閱。

? ? ? ? 在服務商處購得一臺云服務器,使用MobaXterm以SSH遠程登錄,首先是更新一下軟件

yum update

然后安裝golang

yum install go

提示找不到包

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
?* base: mirror.xtom.com.hk
?* extras: mirror.xtom.com.hk
?* updates: mirror.xtom.com.hk
No package go available.
Error: Nothing to do

需要添加源

rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO
curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo

這時再安裝golang便會提示安裝成功。查看一下go的版本

go version

go version go1.21.5 linux/amd64

golang的當前最新版。下面,拉取Ngrok的源碼。也可以使用國內源ngrok: ngrok 國內加速版本

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

?然后,進入ngrok目錄,并創建ssl目錄

cd ngrok/
mkdir ssl
cd ssl

生成自簽名證書

export NGROK_DOMAIN="xx.xx.xxx"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 5000 -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 5000 -out server.crt

NGROK_DOMAIN那里設置成你的域名,此時會生成6個文件

base.key ?base.pem ?base.srl ?server.crt ?server.csr ?server.key

然后執行下面的命令替換源碼包自帶的證書

cp base.pem ../assets/client/tls/ngrokroot.crt
cp server.crt ../assets/server/tls/snakeoil.crt
cp server.key ../assets/server/tls/snakeoil.key

回到上級目錄,然后生成服務端

cd ../
GOOS=linux GOARCH=amd64 make release-server

結果提示錯誤

bin/go-bindata -nomemcopy -pkg=assets -tags=release \
? ? ? ? -debug=false \
? ? ? ? -o=src/ngrok/client/assets/assets_release.go \
? ? ? ? assets/client/...
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
? ? ? ? -debug=false \
? ? ? ? -o=src/ngrok/server/assets/assets_release.go \
? ? ? ? assets/server/...
go get -tags 'release' -d -v ngrok/...
go: go.mod file not found in current directory or any parent directory.
? ? ? ? 'go get' is no longer supported outside a module.
? ? ? ? To build and install a command, use 'go install' with a version,
? ? ? ? like 'go install example.com/cmd@latest'
? ? ? ? For more information, see https://golang.org/doc/go-get-install-deprecation
? ? ? ? or run 'go help get' or 'go help install'.
make: *** [deps] Error 1

修改一下go的環境變量?

go env -w GO111MODULE=auto

再次編譯就會通過。接著生成Windows版的客戶端

GOOS=windows GOARCH=amd64 make release-client

注: 如果是32位系統,GOARCH=386;如果是64為系統,GOARCH=amd64

? ? ? ? 如果要編譯linux,GOOS=linux;? ? 如果要編譯window,GOOS=windows

在./bin/windows_amd64/目錄下,會生成?ngrok.exe,將其下載到本地電腦上。在本地電腦ngrok.exe的同目錄下,新建一個配置文件ngrok.cfg,保存以下內容

server_addr: "xx.xx.xxx:4443"
trust_host_root_certs: false

這里的域名要和上文證書簽名那里的保持一致。

接下來,先啟動服務端。在服務器輸入

 ./bin/ngrokd -domain="xx.xx.xxx"

?[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[06:52:24 UTC 2024/03/01] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting: {"bytesIn.count":0,"bytesOut.count":0,"connMeter.count":0,"connMeter.m1":0,"httpTunnelMeter.count":0,"linux":0,"osx":0,"other":0,"tcpTunnelMeter.count":0,"tunnelMeter.count":0,"tunnelMeter.m1":0,"windows":0}

然后啟動客戶端,在本地電腦的CMD中輸入?

ngrok.exe -log=stdout -config=ngrok.cfg 8080

再然后,不出意外地出意外了。本地電腦提示

[15:02:25 CST 2024/03/01] [DEBG] (ngrok/log.(*PrefixLogger).Debug:79) [ctl:7cd75b8e] Closing
[15:02:25 CST 2024/03/01] [EROR] (ngrok/log.Error:120) control recovering from failure tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead

服務器提示

[07:02:28 UTC 2024/03/01] [DEBG] (ngrok/log.(*PrefixLogger).Debug:79) [tun:134e61f5] Waiting to read message
[07:02:28 UTC 2024/03/01] [WARN] (ngrok/log.(*PrefixLogger).Warn:87) [tun:134e61f5] Failed to read message: remote error: tls: bad certificate
[07:02:28 UTC 2024/03/01] [DEBG] (ngrok/log.(*PrefixLogger).Debug:79) [tun:134e61f5] Closing?

這個報錯原因是生成證書沒有開啟SAN擴展,go 1.15 版本開始廢棄 CommonName,因此推薦使用 SAN 證書。?

那么可否使用低版本的go來編譯ngrok呢?答案是不行,ngrok的一些依賴組件在低版本的go下無法編譯通過。

下面,在服務器上重新制作證書,并啟用SAN。

cd ssl/
echo subjectAltName = DNS:xx.xx.xxx>extfile.cnf

然后,重新簽名,在上述簽名命令的最后一句加上?-extfile extfile.cnf

openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 5000 -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 5000 -out server.crt -extfile extfile.cnf

完成之后,還是先替換證書,make clean 之后再重新編譯服務端和客戶端。

重新運行服務端和客戶端,可以看到,ngrok會隨機分配域名前綴。這就需要我們配置 *.xx.xx.xxx的泛解析為服務器IP。

Tunnel Status ? ? ? ? ? ? ? ? online ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Version ? ? ? ? ? ? ? ? ? ? ? 1.7/1.7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Forwarding ? ? ? ? ? ? ? ? ? ?http://4ec9da1.xx.xx.xxx -> 127.0.0.1:8080 ? ? ? ? ? ? ? ? ? ? ? ?

Forwarding ? ? ? ? ? ? ? ? ? ?https://4ec9da1.xx.xx.xxx -> 127.0.0.1:8080 ? ? ? ? ? ? ? ? ? ? ? ?

Web Interface ? ? ? ? ? ? ? ? 127.0.0.1:4040 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

# Conn ? ? ? ? ? ? ? ? ? ? ? ?0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Avg Conn Time ? ? ? ? ? ? ? ? 0.00ms ? ? ?

但是,我申請到的域名是一個二級域名,無法配置泛解析,必須修改源碼,讓ngrok不分配前綴。

在ngrok/src/ngrok/server/tunnel.go的89行,刪掉?%x.?rand.Int31(),以及該文件第一行引入的?math/rand,重新編譯出服務端與客戶端即可。

// Register for random URLt.url, err = tunnelRegistry.RegisterRepeat(func() string {return fmt.Sprintf("%s://%x.%s", protocol, rand.Int31(), vhost)}, t)

如果你沒有域名,可以直接使用IP地址,那么前文把DNS字段改成IP即可。

三、參考文獻

內網穿透 ngrok 服務器搭建與坑點

教你自己服務器搭建Ngrok?

ngrok的https等多隧道搭建及使用(菜鳥篇)?

verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead?

我們來親手搭建一個Ngrok內網穿透服務器?

Ngrok內網穿透?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713025.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

掌握 MySQL 的數據類型

知道了表是由不同數據類型的列組成的,然后填充了一行一行的數據。 當我們要創建表的時候,就要根據業務需求,選擇合適的數據類型。比如在實戰項目中,文章表就是由下面這些不同數據類型的字段定義的。 目前用到了 bigint、tinyint、…

vue3+ts+vite使用mock數據

安裝以下命令 npm i vite-plugin-mock --save-dev npm i mockjs --save-dev 在根路徑下創建mock文件夾 mock\user.ts const menuList [{path: /system,component: Layout,name: system,meta: {title: 系統管理,icon: Setting,roles: [sys:manage]},children: [{path: /depar…

blender 導出bvh x軸旋轉90度

目錄 blender導出模型后,x 軸旋轉了 90 度,和縮放不對的問題 bvh: blender導出模型后,x 軸旋轉了 90 度,和縮放不對的問題 博文解決了fbx格式d軸旋轉90度的問題,bvh的沒有解決 Blender - Export FBX to …

Java中使用poi+poi-tl實現根據模板導出word文檔

場景 若依管理系統前后端分離版基于ElementUI和SpringBoot怎樣實現Excel導入和導出: 若依管理系統前后端分離版基于ElementUI和SpringBoot怎樣實現Excel導入和導出_若依導出前端獲得到后端的execl流之后怎么操作-CSDN博客 上面講的是Excel的導出,如果是需要根據w…

即插即用篇 | YOLOv8 引入 MHSA 注意力機制 | 《Bottleneck Transformers for Visual Recognition》

論文名稱:《Bottleneck Transformers for Visual Recognition》 論文地址:https://arxiv.org/pdf/2101.11605.pdf 文章目錄 1 原理2 源代碼3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yamltemplate-neck.yaml

Mac 重新安裝系統

Mac 重新安裝系統 使用可引導安裝器重新安裝(可用于安裝非最新的 Mac OS,系統降級,需要清除所有數據) 插入制作好的可引導安裝器(U盤或者移動固態硬盤),如何制作可引導安裝器將 Mac 關機將 Ma…

排序——冒泡排序

冒泡排序的基本思想 從前往后&#xff08;或從后往前&#xff09;兩兩比較相鄰元素的值&#xff0c;若為逆序&#xff08;即 A [ i ? 1 ] < A [ i ] A\left [ i-1\right ]<A\left [ i\right ] A[i?1]<A[i]&#xff09;&#xff0c;則交換它們&#xff0c;直到序列…

MySQL慢查詢分析

1. 什么是慢查詢&#xff1f; 在MySQL中&#xff0c;慢查詢定義為執行時間超過特定閾值的查詢。這個閾值可以通過MySQL的配置選項long_query_time來設置。默認情況下&#xff0c;long_query_time的值是10秒&#xff0c;意味著任何執行時間超過10秒的查詢都會被認為是慢查詢。然…

標準PoE交換機、非標準PoE交換機和非PoE交換機三者到底有何區別?

目錄 前言&#xff1a; 一、標準PoE交換機 1.1 工作原理 1.2 應用場景 1、視頻監控 2、無線接入點 3、IP電話 1.3 優勢 1、簡化布線 2、簡化安裝 3、提高可靠性 二、非標準PoE交換機 2.1 工作原理 2.2 應用場景 1、無線路由器 2、IP電話 3、數據中心 2.3 優勢…

c++面試三 -- 智能指針--7000字

一、智能指針 C 中的智能指針是一種用于管理動態分配的內存的對象&#xff0c;它們可以自動進行內存管理&#xff0c;避免內存泄漏和懸掛指針等問題。 1. 懸掛指針 懸掛指針&#xff08;dangling pointer&#xff09;是指在程序中仍然存在但已經不再指向有效內存地址的指針。懸…

IO多路復用 poll模型

poll 是一種在 Linux 系統中進行 I/O 多路復用的模型&#xff0c;它與 select 類似&#xff0c;但具有一些不同之處。poll 允許監視的文件描述符數量不受限制&#xff0c;而不像 select 有一定的限制。 基本概念&#xff1a; poll 函數&#xff1a; 通過 poll 函數&#xff0c…

隊列的結構概念和實現

文章目錄 一、隊列的結構和概念二、隊列的實現三、隊列的實現函數四、隊列的思維導圖 一、隊列的結構和概念 什么是隊列&#xff1f; 隊列就是只允許在一端進行插入數據操作&#xff0c;在另一端進行刪除數據操作的特殊線性表&#xff0c;隊列具有先進先出 如上圖所示&#x…

【比較mybatis、lazy、sqltoy、mybatis-flex操作數據】操作批量新增、分頁查詢(二)

orm框架使用性能比較 環境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0比較mybatis、lazy、sqltoy、mybatis-flex操作數據 測試條件常規對象 orm 框架是否支持xml是否支持 Lambda對比版本mybatis????3.5.4sqltoy????5.2.98lazy????1.2.4-JDK17-SNAPS…

自定義 Python 程序參數解析

需要通過Python程序運行其它應用程序&#xff0c;程序格式為&#xff1a; 我的程序 <我的程序參數> 應用程序 <應用程序參數> 由于應用程序不固定&#xff0c;應用程序的參數也不固定&#xff0c;我的程序不需要對應用程序參數進行解析&#xff0c;僅需要解析自己的…

Vue+SpringBoot打造天然氣工程運維系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 系統角色分類2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系統管理員功能2.3.2 用戶服務部功能2.3.3 分公司&#xff08;施工單位&#xff09;功能2.3.3.1 技術員角色功能2.3.3.2 材料員角色功能 2.3.4 安…

快速冪-計算a的b次對m取余

題目 題解參考 a a ? a a a*a aa?a這部分是計算 a 2 i a^{2^i} a2i&#xff0c; a b Π i 0 t a n i 2 i Π i 0 t ( a 2 i ) n i a^b \Pi_{i0}^{t}a^{n_i 2^i} \Pi_{i0}^{t}(a^{2^i})^{n_i} abΠi0t?ani?2iΠi0t?(a2i)ni? ,代碼中的b&1是計算 n i n_i ni?…

Zabbix企業運維監控工具

Zabbix企業級監控方案 常見監控軟件介紹 Cacti Cacti是一套基于 PHP、MySQL、SNMP 及 RRD Tool 開發的監測圖形分析工具&#xff0c;Cacti 是使用輪詢的方式由主服務器向設備發送數據請求來獲取設備上狀態數據信息的,如果設備不斷增多,這個輪詢的過程就非常的耗時&#xff0…

sql注入less46作業三

采用報錯注入 updatexml(XML_document,XPath_string,new_value) 一共可以接收三個參數&#xff0c;報錯位置在第二個參數。 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- #查詢庫名 ?sort1 and updatexml(1,concat(0x7e,(select group_concat(table_name) fr…

[每周一更]-(第89期):開源許可證介紹

開源代碼本就是一種共享精神&#xff0c;一種大無畏行為&#xff0c;為了發揚代碼的魅力&#xff0c;創造更多的價值&#xff0c;讓愛傳遞四方&#xff0c;讓知識惠及更多人&#xff1b; 寫文章也是一種共享精神&#xff0c;讓知識傳播出去。 介紹下開源中不同許可證的內容限…

初學Vue總結

0 Vue概述 問題&#xff1a;我們已經學過了htmlCssjavascript,可以開發前端頁面了&#xff0c;但會發現&#xff0c;效率太低了。那么&#xff0c;有沒有什么工具可以提高我們的開發效率&#xff0c;加快開發速度呢&#xff1f; 他來了&#xff0c;他來了&#xff0c;他大佬似…