文章目錄
- 前言
- **常見困境與解決方案**
- **實際應用價值**
- 1. Remote JVM Debug
- 2. 系統要求與環境準備
- 2.1 服務器環境
- 2.2 本地開發環境
- 3. 內網服務器準備及開始
- 3.1 安裝cpolar配置支持遠程ssh登錄
- 3.1.1 什么是cpolar?
- 3.1.2 安裝cpolar
- 3.1.3 注冊及配置cpolar系統服務
- 3.1.4 登錄cpolar web ui 管理界面配置ssh端口穿透
- 3.1.4.1 放行9200端口
- 3.1.4.2 訪問cpolar web ui管理界面
- 3.1.4.3 保留固定TCP公網地址
- 3.1.4.4 啟用ssh隧道,配置固定tcp地址
- 3.1.4.5 使用固定的tcp地址進行遠程ssh登錄
- 3.2 安裝JDK
- 3.3 上傳打包好的Jar文件至服務器
- 3.3.1 打包springboot項目
- 3.3.2 上傳至服務器
- 4. 啟動 JAR 文件并配置遠程調試
- 4.1 啟動 JAR 文件
- 4.2 cpolar隧道配置
- 4.2.1 http(8080端口)穿透
- 4.2.2 調試端口(5005端口)穿透
- 4.2.2.1 保留固定tcp地址
- 4.2.2.2 創建新隧道
- 5.IDEA遠程Debug調試內網項目
- 5.1 idea配置remote jvm debug
- 5.2 啟動及調試
- 6.可能出現的問題
- 6.1 訪問頁面出現404的情況是怎么回事?
- 7.總結
- 項目源碼
- cpolar 與IDEA的遠程JVM調試技術組合,本質是為內網服務打造了一座“數字橋”。它解決了傳統運維場景中最核心的矛盾——物理隔離與實時響應、人工成本與效率提升。無論是深夜救場的核心故障,還是日常代碼邏輯驗證,這種方案都展現了極高的實用性。對于依賴分布式架構的企業而言,這不僅是工具鏈的補充,更是構建“遠程即在場”DevOps文化的基石。尤其在混合辦公常態化的今天,它讓開發者能隨時隨地掌控服務狀態,真正實現了“故障無邊界”的運維愿景——無需現場救火,一切盡在指尖掌控。
前言
深夜收到緊急通知:“測試環境的核心服務又掛了!”——如果該服務部署在嚴格隔離的內網,這樣的場景往往意味著開發者要在凌晨驅車趕往辦公室。但借助cpolar 的內網穿透技術與IDEA的遠程調試功能,這種低效模式已被徹底打破:即使身處千里之外,也能像操作本地項目一樣完成JAR包異常分析。
常見困境與解決方案
- 難題1:“黑盒”環境下的定位難
當無法直接訪問內網服務時,傳統的日志查看或運維協助往往信息滯后。cpolar通過端口映射將調試通道“拉到身邊”,讓開發者能實時追蹤變量值和堆棧軌跡。 - 難題2:跨地域協作低效
團隊成員分散在不同城市?遠程IDE連接+穿透隧道的組合,使多人協同診斷成為可能——資深工程師可通過共享會話指導新人快速上手復雜問題。 - 難題3:安全合規與操作便捷性平衡
cpolar支持按需創建/銷毀通道,并提供訪問權限控制(如IP白名單),既保障數據安全又避免長期暴露端口風險。
實際應用價值
- 成本優化:減少差旅費用及人工等待時間;
- 效率躍升:從發現故障到修復平均耗時縮短60%以上;
- 知識沉淀:通過遠程調試記錄,形成標準化問題處理手冊。
本文使用的示例項目已在GitHub開源,您可以直接獲取完整代碼進行學習和實踐:
- GitHub倉庫:https://github.com/TanChengBin/springboot-debug-test
- 項目特點:基于Spring Boot的遠程調試測試項目,包含正常接口和異常接口,便于測試各種調試場景
1. Remote JVM Debug
Remote JVM Debug(遠程JVM調試)是一種允許開發人員通過調試工具(如 IntelliJ IDEA)連接到運行在遠程服務器上的Java應用程序并進行調試的技術。這個過程通常涉及通過網絡連接到遠程JVM實例,并允許開發者在不直接訪問物理機器的情況下查看、修改代碼狀態,診斷和修復問題。
2. 系統要求與環境準備
2.1 服務器環境
- 內網服務器操作系統:Windows 或 Linux。
- JDK 版本:確保服務器上安裝了正確版本的 JDK,支持遠程調試。
- cpolar 安裝:需要在內網服務器上安裝 cpolar 客戶端,用于穿透遠程登錄、調試端口及HTTP請求。
2.2 本地開發環境
- IDEA:本地開發機器需要安裝 IntelliJ IDEA。
- JDK:本地開發機器需要安裝 JDK(版本與遠程服務器相同)。
3. 內網服務器準備及開始
由于大部分項目基本部署在Linux服務器中,因為Linux的性能更優,占用更低。所以本文采用的模擬內網服務器為Linux的CentOS7
系統。
3.1 安裝cpolar配置支持遠程ssh登錄
此步驟需提前在內網服務器中操作,以支持在家遠程登錄公司測試環境中的內網服務器
3.1.1 什么是cpolar?
- cpolar 是一款內網穿透工具,可以將你在局域網內運行的服務(如本地 Web 服務器、SSH、遠程桌面等)通過一條安全加密的中間隧道映射至公網,讓外部設備無需配置路由器即可訪問。
- 廣泛支持 Windows、macOS、Linux、樹莓派、群暉 NAS 等平臺,并提供一鍵安裝腳本方便部署。
3.1.2 安裝cpolar
首先,我們需要先安裝curl:
sudo yum install curl
接下來下載cpolar,一條命令完成安裝
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
測試 cpolar
版本以確保安裝
cploar version
3.1.3 注冊及配置cpolar系統服務
官網地址:https://www.cpolar.com
進入cpolar官網,點擊免費注冊
按鈕進行注冊一個賬號
向系統添加及啟動cpolar服務
#添加cpolar服務
sudo systemctl enable cpolar#啟動cpolar服務
sudo systemctl start cpolar
查看服務狀態
sudo systemctl status cpolar
3.1.4 登錄cpolar web ui 管理界面配置ssh端口穿透
3.1.4.1 放行9200端口
在訪問web頁面前,需要先檢查系統防火墻是否放行9200端口,避免訪問不了
systemctl status firewalld
有兩種方式可以實現訪問,一種是放行該端口,另一種是直接關閉防火墻(不建議)
#放行 9200 端口
#--zone=public:使用默認區域(通常是 public)
#--add-port=9200/tcp:添加 TCP 協議的 9200 端口
#--permanent:永久生效(不加此參數則是臨時規則,重啟失效)
firewall-cmd --zone=public --add-port=9200/tcp --permanent#重載防火墻配置(及刷新配置使其生效)
firewall-cmd --reload
驗證端口是否已放行
firewall-cmd --zone=public --query-port=9200/tcp
輸出內容為yes則成功放行
3.1.4.2 訪問cpolar web ui管理界面
在訪問之前,不確定ip地址可以通過ifconfig
命令查看服務器ip
ifconfig
確定好ip地址后,在瀏覽器中訪問:
http://<此處應為您的IP>:9200 #如:http://192.168.184.133:9200
將前面步驟注冊好的cpolar賬號登錄即可進入后臺頁面
登錄成功同時,服務器也會后臺無感自動配置token,無需手動配置token
配置文件位置:/usr/local/etc/cpolar/cpolar.yml
cat /usr/local/etc/cpolar/cpolar.yml
3.1.4.3 保留固定TCP公網地址
使用cpolar為其配置TCP地址,該地址為固定地址,不會隨機變化,方便后續ssh遠程登錄。
進入官網的預留頁面:https://dashboard.cpolar.com/reserved
列表中顯示了一條已保留的TCP地址記錄:
- 地區:顯示為
China Top
。 - 地址:顯示為
16.tcp.cpolar.top:14290
。
注:地址每個賬號的都不同,請以自己保留生成的為主
3.1.4.4 啟用ssh隧道,配置固定tcp地址
點擊左側菜單欄的隧道管理
,展開進入隧道列表
頁面,頁面下默認會有 2 個隧道:
- ssh隧道,指向22端口,tcp協議
- website隧道,指向8080端口,http協議(http協議默認會生成2個公網地址,一個是http,另一個https,免去配置ssl證書的繁瑣步驟)
接著點擊ssh隧道的編輯按鈕,進入編輯頁面,修改成固定tcp地址,如圖所示:
3.1.4.5 使用固定的tcp地址進行遠程ssh登錄
ssh遠程工具可以使用MobaXterm
、Xshell
或者FinalShell
都可以,這里采用FinalShell
進行遠程登錄演示
接下來,雙擊創建的ssh連接,如出現提示,點擊接受并保存
即可,即可連接到內網服務器
3.2 安裝JDK
本文采用jdk17作為演示
#下載jdk17軟件包
wget https://download.oracle.com/java/17/archive/jdk-17_linux-x64_bin.rpm#安裝jdk17
sudo rpm -ivh jdk-17_linux-x64_bin.rpm
安裝完成后,查看版本,確認安裝
java -version
3.3 上傳打包好的Jar文件至服務器
該項目為簡單模擬測試調試使用項目,共寫3個簡單接口:
- 🟢正常接口:
/api/normal/info
:獲取應用程序的基本信息,包括名稱、版本、作者等 - 🔴異常接口:
/api/bug/null-pointer
:故意拋出NullPointerException,用于調試異常處理 - 🟡阻塞接口:
/api/bug/infinite-loop
:進入無限循環,模擬線程阻塞場景
3.3.1 打包springboot項目
idea中側邊欄選擇Maven選項,然后如圖操作進行構建打包jar文件:
3.3.2 上傳至服務器
依次步驟打開找到jar文件springboot-debug-test-1.0.0.jar
將jar文件直接拖動至finalshell
空白處即可上傳
注意:一定要使用 root 用戶登錄,否則上傳可能失敗(或者確保當前用戶對目標目錄具有寫權限)。
如果使用普通用戶登錄 FinalShell,可通過
chmod
或chown
命令賦予目標目錄寫權限。
4. 啟動 JAR 文件并配置遠程調試
4.1 啟動 JAR 文件
使用 java -jar
命令啟動你需要調試的 JAR 文件,并開啟遠程調試。需要在啟動命令中指定 JVM 調試參數:
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 springboot-debug-test-1.0.0.jar
5005
為遠程調試的端口號。
springboot-debug-test-1.0.0.jar
是要調試的 JAR 文件名稱。
項目已經成功啟動,端口5005被監聽,后臺該jar文件項目在端口8080(http)上運行。
4.2 cpolar隧道配置
4.2.1 http(8080端口)穿透
訪問cpolar web ui管理界面(忘記可看前面3.1.4.2小節),進入到隧道列表,名稱為website
的隧道,點擊編輯,可以看到如下信息:
- 隧道名稱:website
- 協議:http
- 本地地址:8080
這些信息正是后臺項目8080端口所需要的,所以不需要進行修改,默認創建好的隧道直接可以使用。
接著左側菜單欄選擇【狀態】>【在線隧道列表】,可以看到website隧道有兩個公網地址,http協議(http協議默認會生成2個公網地址,一個是http,另一個https,免去配置ssl證書的繁瑣步驟)
直接選擇一個至瀏覽器測試,這里選擇http(注:每個用戶的公網地址都不相同)
由于后臺項目提到的接口地址后綴為/api/normal/info
,所以正確拼接地址應為:
<您的公網地址>/api/normal/info #如:http://5c19bf20.r1.cpolar.top/api/normal/info
接口正常返回了api接口信息,穿透成功!
4.2.2 調試端口(5005端口)穿透
4.2.2.1 保留固定tcp地址
選擇將5005端口穿透設置為固定的tcp地址是為了方便后續多次調試,tcp地址不會進行變化,也可以不進行此步驟操作。
進入官網的預留頁面:https://dashboard.cpolar.com/reserved
- 地區當前選擇的是:
China Top
- 地址信息為:
3.tcp.cpolar.top:12718
記住新創建的地址信息(注意:每個用戶創建的地址信息都有所不同,請注意個人的地址信息
)
4.2.2.2 創建新隧道
進入創建隧道列表,填寫好對應信息,如下圖:
- 協議:
tcp
- 本地地址為:
5005
- 端口類型:
固定tcp端口
- 預留tcp地址:
填寫您預留固定的tcp地址
5.IDEA遠程Debug調試內網項目
5.1 idea配置remote jvm debug
點擊啟動按鈕左邊的選項卡,然后在選項卡中點擊Edit Configurations
進入Run/Debug Configurations
頁面
依次點擊左上角【+】號按鈕,下滑選擇【Remote JVM Debug】選項,點擊進入。
填寫主機以及端口信息,具體參考如下圖:
- Name:
自定義名字(如:Remote Debug)
- Host:
填寫固定的tcp地址去除端口部分(如:3.tcp.cpolar.top)
- Port:
填寫固定的tcp地址端口部分(如:12718)
5.2 啟動及調試
點擊右上角的小蟲子圖標即可啟動調試,啟動調試后,控制臺會出現類似Connected to the target VM, address: '3.tcp.cpolar.top:12718', transport: 'socket'
的信息,即代表啟動成功
來到BugController
控制器,里面有一個異常接口api/bug/null-pointer
,代碼如下:
/*** 空指針異常接口* * 該接口會故意拋出NullPointerException* 用于測試空指針異常的調試場景* * @return 永遠不會執行到這里,因為會拋出異常*/@GetMapping("/null-pointer")public String nullPointerException() {//1.此位置故意設置nullString字符串為nullString nullString = null;String now = LocalDateTime.now().format(FORMATTER);System.out.println("空指針異常接口被調用,準備拋出異常,時間:" + now);//2.待接口返回時執行nullString的toString方法時就會拋出NullPointerException異常return nullString.toString();}
切換到瀏覽器,然后請求8080端口的穿透地址
+異常接口地址
進行請求,如:
<您的8080端口穿透地址>/api/bug/null-pointer #如:http://5c19bf20.r1.cpolar.top/api/bug/null-pointer
接著在String nullString = null;
代碼段左邊打上斷點調試,如下圖:
再次請求一次該鏈接http://5c19bf20.r1.cpolar.top/api/bug/null-pointer
進行發送http請求,可以看到后端idea中已經進去斷點調試了
進入下一步驟,查看到nullString
變量值確實為null
多跳幾個步驟,進入源碼后可以確認已拋出空指針異常,提示 nullString 為 null,無法調用其方法。
在finalShell終端1界面中也可以看到,控制臺輸出的日志出現了NullPointerException
異常
通過以上的配置,這樣您就可以在家中或者外出無法及時回到公司時,也能很輕松的調試公司中內網服務器里部署的測試環境項目啦!
6.可能出現的問題
6.1 訪問頁面出現404的情況是怎么回事?
訪問出現404:
可以發現,接口路徑中少了全局上下文路徑/api ,補上就可以訪問啦!
7.總結
通過本教程,我們成功實現了使用 Cpolar 結合 Remote JVM Debug 技術,在本地 IDE 環境中調試部署在公司內網中的 Java 服務。整體流程包括:
- 安裝并配置 Cpolar,打通從公網訪問內網的通道;
- 啟用 JVM 的遠程調試模式,開放調試端口;
- 使用 IntelliJ IDEA 配置 Debug 遠程連接;
- 最終實現對遠程服務的斷點調試與問題排查。
本方案適用于以下典型場景:
- 公司測試環境無法直接從公網訪問;
- 無法通過 VPN 連通或 VPN 配置復雜;
- 出現遠程服務異常但又難以復現時,進行現場調試。
在實際使用中應注意:
- 遠程調試存在安全風險,建議僅限于測試環境,并設置好訪問權限;
- cpolar 每次生成的公網地址可能會變化,建議使用固定子域名(需高級用戶);
- 遠程調試應避免在生產環境開啟,以免暴露調試端口。
通過這種方式,極大提升了遠程問題定位效率,也為遠程辦公/故障應急提供了可靠手段。
項目源碼
本文中使用的示例項目已開源,歡迎訪問GitHub倉庫獲取完整代碼:
👉 https://github.com/TanChengBin/springboot-debug-test
如果您覺得這個項目對您有幫助,歡迎給項目點個Star??支持!
cpolar 與IDEA的遠程JVM調試技術組合,本質是為內網服務打造了一座“數字橋”。它解決了傳統運維場景中最核心的矛盾——物理隔離與實時響應、人工成本與效率提升。無論是深夜救場的核心故障,還是日常代碼邏輯驗證,這種方案都展現了極高的實用性。對于依賴分布式架構的企業而言,這不僅是工具鏈的補充,更是構建“遠程即在場”DevOps文化的基石。尤其在混合辦公常態化的今天,它讓開發者能隨時隨地掌控服務狀態,真正實現了“故障無邊界”的運維愿景——無需現場救火,一切盡在指尖掌控。
以上就是如何在本地使用Remote JVM Debug 進行內網服務器調試,并安裝cpolar內網穿透工具配置固定不變的TCP公網地址,實現隨時隨地遠程訪問的全過程,感謝您的觀看,有任何問題歡迎留言交流。
cpolar官網-安全的內網穿透工具 | 無需公網ip | 遠程訪問 | 搭建網站