手撕TCP內網穿透及配置樹莓派

注意: 本文內容于 2025-04-13 15:09:48 創建,可能不會在此平臺上進行更新。如果您希望查看最新版本或更多相關內容,請訪問原文地址:手撕TCP內網穿透及配置樹莓派。感謝您的關注與支持!

之前入手了樹莓派5,折騰一段時間后,環境算是搭好了。

但是又不想隨身攜帶,我剛好有個公網IP,想著通過公網訪問。于是就用到了內網穿透。

清明節三天爆肝,斷斷續續總共耗費一周。簡單測試,性能還行。

一、TCP內網穿透

1.1 起因

使用fatedier/frp的過程中,不管在Windows還是Linux,都被掃出病毒了。而且這還是Golang自身的問題,參考Why does my virus-scanning software think my Go distribution or compiled binary is infected? 。

這個內網穿透本身也沒多難,因此自己用Java手撕一套內網穿透工具,還是很有必要的。

1.2 原理

原理很簡單,一張時序圖以蔽之。

1.3 使用示例

創建一個Java項目,JDK使用8及以上,引入依賴

<dependency><groupId>top.meethigher</groupId><artifactId>tcp-reverse-proxy</artifactId><version>1.0.3</version>
</dependency>
<dependency><groupId>io.vertx</groupId><artifactId>vertx-core</artifactId><version>4.5.10</version>
</dependency>
<!-- 若不使用http反向代理,可不加此依賴 -->
<dependency><groupId>io.vertx</groupId><artifactId>vertx-web</artifactId><version>4.5.10</version>
</dependency>
<!-- 若不想添加日志,可只添加slf4j-api -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.12</version>
</dependency>
<!-- 若不使用TCP內網穿透,可不加此依賴 -->
<dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-javalite</artifactId><version>4.30.2</version>
</dependency>

假如我有一個內網SSH服務10.0.0.10:22,需要通過192.168.0.200:22穿透出去。并且網絡條件受限如下

  1. 10.0.0.10可以主動連接192.168.0.200
  2. 192.168.0.200無法主動連接10.0.0.10
  3. 只要雙方建立連接,即可實現雙向數據傳輸

這就需要TCP內網穿透了。假設你內網穿透使用的控制端口為44444

首先,在192.168.0.200這臺機器,使用如下代碼啟動TunnelServer

ReverseTcpProxyTunnelServer.create(Vertx.vertx()).port(44444)// 用于用戶連接和數據連接的延遲判定,如果網絡較差/DNS解析較慢的情況下,建議將該參數調大.judgeDelay(2000).start();

10.0.0.10這臺機器,使用如下代碼啟動TunnelClient

ReverseTcpProxyTunnelClient.create(Vertx.vertx()).backendHost("10.0.0.10").backendPort(22).dataProxyName("ssh-proxy").dataProxyHost("192.168.0.200").dataProxyPort(22).connect("192.168.0.200", 44444);

以上的源代碼都是開源的

  • 開發工具包:meethigher/tcp-reverse-proxy: 基于Vert.x實現的HTTP反向代理與TCP反向代理、內網穿透
  • 可直接運行的Jar包:Release Release-v3.0.0 · meethigher/http-proxy-boot

1.4 實戰

下面放一個我將樹莓派用于生產環境時,使用的內網穿透配置Bash腳本。

服務端

cat >/etc/systemd/system/tunnel-server.service<<EOF
[Unit]
Description=tunnel-server
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/sh -c "java -jar tunnel-server.jar >/dev/null 2>&1"
WorkingDirectory=/usr/local/tunnel-server
[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload
systemctl enable tunnel-server
systemctl start tunnel-server

客戶端

cat >/etc/systemd/system/tunnel-client.service<<EOF
[Unit]
Description=tunnel-client
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/sh -c "java -jar tunnel-client.jar >/dev/null 2>&1"
WorkingDirectory=/usr/local/tunnel-client
[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload
systemctl enable tunnel-client
systemctl start tunnel-client

由于客戶端所在局域網內的IP經常變,因此我添加了一個固定的VIP

cat >/etc/systemd/system/vip.service<<EOF
[Unit]
Description=vip
After=network.target[Service]
Type=oneshot
ExecStartPre=/usr/bin/sleep 30
ExecStart=/usr/sbin/ip addr add 192.168.1.222/32 dev wlan0
ExecStop=/usr/sbin/ip addr del 192.168.1.222/32 dev wlan0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF

以上配置完了,就是再將內網穿透出來的SSH服務,配置為私鑰登錄。不多贅述。

二、無顯示器樹莓派5

樹莓派入門視頻,參考樹莓派教程第一課 樹莓派簡介 十分鐘玩轉系列入門篇_嗶哩嗶哩_bilibili

又額外買了512GB存儲,總共花費1007元。

2.1 系統燒錄

下載系統鏡像,選擇環境最全的這個。

我沒有顯示器,需要采用遠程SSH使用。但是需要到了SSH服務器拒絕了密碼的情況。通過啟用無屏幕 SSH Raspberry Pi - Thinbug進行解決。而在簡易版系統上,無法使用該功能。

使用鏡像燒錄工具下載也可,但是我個人比較喜歡留存離線鏡像。

下載鏡像燒錄工具。

打開鏡像燒錄工具,選擇設備、選擇操作系統鏡像、選擇存儲卡。

點擊Next,編輯設置。

WIFI國家一定要設置為CN

之后就等待燒錄即可。

2.2 遠程SSH

我在遠程連接樹莓派SSH時,遭拒絕了,是因為樹莓派OS設置了不允許直接通過root登錄。

需要執行如下操作。參考自啟用無屏幕 SSH Raspberry Pi - Thinbug

  1. 在SD卡內創建ssh文件,內容為空。
  2. 在SD卡內創建userconf.txt文件,內容為pi:$6$/4.VdYgDm7RJ0qM1$FwXCeQgDKkqrOU3RIRuDSKpauAbBvP11msq9X58c8Que2l1Dwq3vdJMgiZlQSbEXGaY5esVHGBNbCxKLVNqZW1,表示設置用戶pi的密碼是raspberry

上面這個密碼也可以自己生成,使用命令

openssl passwd -6 '你的密碼'

搞定之后,將SD卡插入樹莓派,獲取樹莓派在局域網的IP地址,直接通過SSH進行登錄。

ssh -p 22 pi@192.168.1.113

或者使用圖形界面工具,比如XShell

安裝neofetch,查看系統信息

apt -y install neofetch
neofetch

2.3 說明

樹莓派OS是基于DebianOS。

我平時使用的系統是CentOS(停止維護)或者RockyLinux。

本質都是Linux,注意下使用細節即可。

項目CentOS(RockyLinux)Debian
上游來源Red Hat Enterprise Linux (RHEL)自主開發
包格式.rpm.deb
包管理器yum / dnfaptapt 是對舊有工具(如 apt-getapt-cache)的一個綜合替代

2.4 修改默認的反人類設置

2.4.1 vi中上下左右變成abcd

使用vi編輯文件,輸入i進行insert模式,此時按上下左右時,變成了abcd,而不是光標移動。執行如下命令解決。

apt -y remove vim-common && apt -y install vim

2.4.2 vi右鍵無法粘貼

這些新功能,對于我這種老古董來說,用起來太反人類了,因此我切到了neovim。參考Disable vim automatic visual mode on mouse select

apt remove -y vim
apt install -y neovim

2.4.3 root用戶終端無色

樹莓派中pi用戶的終端有顏色,root用戶的終端無顏色。簡單粗暴,把pi用戶的配置復制過來。

cp ~/.bashrc ~/.bashrc-bak
cp /home/pi/.bashrc ~./bashrc

重連終端即可生效。

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

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

相關文章

Java從入門到“放棄”(精通)之旅——程序邏輯控制④

Java從入門到“放棄”&#xff08;精通&#xff09;之旅&#x1f680;&#xff1a;程序邏輯的完美理解 一、開篇&#xff1a;程序員的"人生選擇" 曾經的我&#xff0c;生活就像一段順序執行的代碼&#xff1a; System.out.println("早上8:00起床"); Syste…

學習筆記九——Rust所有權機制

&#x1f980; Rust 所有權機制 &#x1f4da; 目錄 什么是值類型和引用類型&#xff1f;值語義和引用語義&#xff1f;什么是所有權&#xff1f;為什么 Rust 需要它&#xff1f;所有權的三大原則&#xff08;修正版&#xff09;移動語義 vs 復制語義&#xff1a;變量賦值到底…

Cocos Creator Shader入門實戰(八):Shader實現圓形、橢圓、菱形等頭像

引擎&#xff1a;3.8.5 您好&#xff0c;我是鶴九日&#xff01; 回顧 Shader的學習是一條漫長的道路。 理論知識的枯燥無味&#xff0c;讓很多人選擇了放棄。然而不得不說&#xff1a;任何新知識、新領域的學習&#xff0c;本身面臨的都是問題&#xff01; 互聯網和AI給了我…

深入理解計算機操作系統(持續更新中...)

文章目錄 一、計算機系統漫游1.1信息就是位上下文 一、計算機系統漫游 1.1信息就是位上下文 源程序實際上就是一個由值0和1組成的位&#xff08;又稱為比特&#xff09;&#xff0c;八個位被組織成一組&#xff0c;稱為字節。每個字節表示程序中的某些文本字符 大部分現代計…

YOLO V8的??Anchor-Free??、??解耦頭(Decoupled Head)、損失函數定義(含??Varifocal Loss)

YOLOv8 的 ??Anchor-Free?? 設計摒棄了傳統 YOLO 系列中依賴預定義錨框&#xff08;Anchor Boxes&#xff09;的機制&#xff0c;轉而直接預測目標的中心點和邊界框尺寸。這種設計簡化了模型結構&#xff0c;降低了超參數調優的復雜度提升了檢測速度和精度。以下是其核心實…

QuarkPi-CA2 RK3588S卡片電腦:6.0Tops NPU+8K視頻編解碼+接口豐富,高性能嵌入式開發!

QuarkPi-CA2 RK3588S卡片電腦&#xff1a;6.0Tops NPU8K視頻編解碼接口豐富&#xff0c;高性能嵌入式開發&#xff01; 芯片框架 視頻介紹 https://www.bilibili.com/video/BV1btdbYkEjY 開發板介紹 核心升級&#xff0c;產品炸裂 QuarkPi-CA2卡片電腦搭載瑞芯微RK3588S芯片…

【響應式編程】Reactor 常用操作符與使用指南

文章目錄 一、創建操作符1. just —— 創建包含指定元素的流2. fromIterable —— 從集合創建 Flux3. empty —— 創建空的 Flux 或 Mono4. fromArray —— 從數組創建 Flux5. fromStream —— 從 Java 8 Stream 創建 Flux6. create —— 使用 FluxSink 手動發射元素7. generat…

從靜態綁定驅動模型到現代設備模型 —— 一次驅動架構的進化之旅

&#x1f50d; B站相應的視屏教程&#xff1a; &#x1f4cc; 內核&#xff1a;博文視頻 - 從靜態綁定驅動模型到現代設備模型 在 Linux 內核的發展歷程中&#xff0c;設備驅動結構經歷了從"硬編碼 手動注冊"的早期實現方式&#xff0c;到"設備模型統一管理&qu…

Embedding質量評估、空間塌縮、 Alignment Uniformity

Embedding質量的評估和空間塌縮的解決是自然語言處理&#xff08;NLP&#xff09;和推薦系統領域的關鍵問題。以下是綜合多篇研究的總結&#xff1a; 一、Embedding質量評估方法 基準測試與任務指標 MTEB/C-MTEB&#xff1a;使用多語言或中文的基準測試集&#xff08;如58個數據…

批量給dwg顯示略縮圖_c#插件實現(com)

如果&#xff0c;cad文件無略縮圖&#xff1a; AutoCAD2021版本以上&#xff0c;命令行輸入"netload "加載此dll插件&#xff0c;然后輸入 “lst”&#xff0c;選擇文件夾&#xff0c;即可一鍵實現給dwg增加略縮圖。 效果如下&#xff1a; 附部分代碼&#xff1a; …

嬰幼兒托育服務與管理實訓室:托育未來的基石

在社會對嬰幼兒托育服務的重視程度不斷加深的當下&#xff0c;專業托育人才的需求急劇增長。嬰幼兒托育服務與管理專業作為培育這類人才的關鍵途徑&#xff0c;要求學生熟練掌握嬰幼兒身心發展、飲食營養以及衛生保健等基礎知識&#xff0c;同時具備全面的照護與管理能力。要實…

(自用)若依生成左樹右表

第一步&#xff1a; 在數據庫創建樹表和單表&#xff1a; SQL命令&#xff1a; 商品表 CREATE TABLE products (product_id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255) , price DECIMAL(10, 2) , stock INT NOT NULL, category_id INT NOT NULL); 商品分類…

Linux:DNS服務配置(課堂實驗總結)

遇到的問題&#xff0c;都有解決方案&#xff0c;希望我的博客能為你提供一點幫助。 操作系統&#xff1a;rocky Linux 9.5 ??一、配置DNS服務器的核心步驟?? 步驟 1&#xff1a;安裝 BIND 軟件?? ??檢查是否安裝??&#xff1a; rpm -qa | grep "^bind"…

搭建一個Spring Boot聚合項目

1. 創建父項目 打開IntelliJ IDEA&#xff0c;選擇 New Project。 在創建向導中選擇 Maven&#xff0c;確保選中 Create from archetype&#xff0c;選擇 org.apache.maven.archetypes:maven-archetype-quickstart。 填寫項目信息&#xff1a; GroupId&#xff1a;com.exampl…

若依前后端分離版運行教程、打包教程、部署教程

后端打包教程 注意&#xff1a;需要先運行redis 2、前端運行教程 2.1安裝依賴 2.2運行 打開瀏覽器查看,地址&#xff1a;http://localhost:80 3、前端打包教程 3.1打包 3.2運行打包好的文件&#xff0c;先找到打包好的文件 這是nginx的文件結構 將打包好的文件放到html目錄下…

SpringAi 會話記憶功能

在使用chatGPT&#xff0c;豆包等產品后&#xff0c;就會發現他們的會話有“記憶”功能。 那么我們用API接口的話&#xff0c;這個是怎么實現的呢&#xff1f; 屬于比較粗暴的方式&#xff0c;把之前的內容與新的提示詞一起再次發給大模型。讓我們看到他們有記憶功能。 下面介紹…

基于Python的經濟循環模型構建與可視化案例

一、代碼結構概覽 該代碼構建了一個包含經濟數據生成、可視化分析和政策模擬的交互式經濟系統仿真平臺&#xff0c;主要包括三大模塊&#xff1a; 多部門經濟數據生成&#xff1a;模擬包含產業關聯的復雜經濟數據 增強型可視化&#xff1a;提供多維度的經濟數據分析視圖 Das…

第十六屆藍橋杯大賽軟件賽省賽 Python 大學 B 組 部分題解

題面鏈接Htlang/2025lqb_python_b 個人覺得今年這套題整體比往年要簡單許多&#xff0c;但是G題想簡單了出大問題&#xff0c;預估50101015120860&#xff0c;道阻且長&#xff0c;再接再厲 A: 攻擊次數 答案&#xff1a;103&#xff1f;181&#xff1f;題目沒說明白每回合是…

C++基礎精講-05

文章目錄 1.構造函數初始化列表1.1 初始化列表的使用1.2 有參構造函數的默認值 2.對象所占空間大小2.1 大小的計算2.2 內存對齊機制 3. 析構函數3.1 基本概念3.2 總結 4.valgrind工具集4.1 介紹4.2 memcheck的使用 5. 拷貝構造函數5.1 拷貝構造函數定義5.2 淺拷貝/深拷貝5.3 拷…

文章記單詞 | 第28篇(六級)

一&#xff0c;單詞釋義 shirt /???t/ n. 襯衫&#xff1b;襯衣commonly /?k?m?nli/ adv. 通常地&#xff1b;一般地&#xff1b;普遍地pick /p?k/ v. 挑選&#xff1b;采摘&#xff1b;撿起&#xff1b;選擇&#xff1b;n. 選擇&#xff1b;鶴嘴鋤&#xff1b;精華com…