注意: 本文內容于 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
穿透出去。并且網絡條件受限如下
10.0.0.10
可以主動連接192.168.0.200
192.168.0.200
無法主動連接10.0.0.10
- 只要雙方建立連接,即可實現雙向數據傳輸
這就需要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
- 在SD卡內創建
ssh
文件,內容為空。 - 在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 / dnf | apt 。apt 是對舊有工具(如 apt-get 和 apt-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
重連終端即可生效。