手撕TCP内网穿透及配置树莓派
发布于2025-04-13 15:09:48,更新于2025-04-20 15:44:20,标签:life java tcp 文章会持续修订,转载请注明来源地址:https://meethigher.top/blog之前入手了树莓派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及以上,引入依赖
1 | <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
1 | ReverseTcpProxyTunnelServer.create(Vertx.vertx()) |
在10.0.0.10
这台机器,使用如下代码启动TunnelClient
1 | ReverseTcpProxyTunnelClient.create(Vertx.vertx()) |
以上的源代码都是开源的
- 开发工具包:meethigher/tcp-reverse-proxy: 基于Vert.x实现的HTTP反向代理与TCP反向代理、内网穿透
- 可直接运行的Jar包:Release Release-v3.0.0 · meethigher/http-proxy-boot
1.4 实战
下面放一个我将树莓派用于生产环境时,使用的内网穿透配置Bash脚本。
服务端
1 | cat >/etc/systemd/system/tunnel-server.service<<EOF |
客户端
1 | cat >/etc/systemd/system/tunnel-client.service<<EOF |
由于客户端所在局域网内的IP经常变,因此我添加了一个固定的VIP
1 | cat >/etc/systemd/system/vip.service<<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
上面这个密码也可以自己生成,使用命令
1 | openssl passwd -6 '你的密码' |
搞定之后,将SD卡插入树莓派,获取树莓派在局域网的IP地址,直接通过SSH进行登录。
1 | ssh -p 22 pi@192.168.1.113 |
或者使用图形界面工具,比如XShell
安装neofetch
,查看系统信息
1 | apt -y install neofetch |
2.3 说明
树莓派OS是基于DebianOS。
我平时使用的系统是CentOS(停止维护)或者RockyLinux。
本质都是Linux,注意下使用细节即可。
特性 | CentOS | Rocky Linux | Ubuntu | Debian |
---|---|---|---|---|
上游来源 | RHEL(Red Hat) | RHEL(Red Hat) | Debian | 独立开发 |
包格式 | .rpm | .rpm | .deb | .deb |
包管理器 | yum (CentOS 7 及以下)dnf (CentOS 8 开始) | dnf | apt (高级工具)dpkg (底层工具) | apt (高级工具)dpkg (底层工具) |
2.4 修改默认的反人类设置
2.4.1 vi中上下左右变成abcd
使用vi编辑文件,输入i进行insert模式,此时按上下左右时,变成了abcd,而不是光标移动。执行如下命令解决。
1 | apt -y remove vim-common && apt -y install vim |
2.4.2 vi右键无法粘贴
这些新功能,对于我这种老古董来说,用起来太反人类了,因此我切到了neovim。参考Disable vim automatic visual mode on mouse select
1 | apt remove -y vim |
2.4.3 root用户终端无色
树莓派中pi
用户的终端有颜色,root
用户的终端无颜色。简单粗暴,把pi
用户的配置复制过来。
1 | cp ~/.bashrc ~/.bashrc-bak |
重连终端即可生效。
2.5 apt换国内源
备份原源,并更换国内源
1 | cp /etc/apt/sources.list /etc/apt/sources.list.bak |
2.6 虚拟机管理平台
2.6.1 CPU是否支持虚拟化
输入如下命令,输出结果大于 0 表示支持。如果是 0,需要在 BIOS 中开启虚拟化支持(Intel VT-x 或 AMD-V)。
1 | egrep -c '(vmx|svm)' /proc/cpuinfo |
由于我的机器是树莓派,ARM64的机器,验证是否支持虚拟化,就需要使用如下命令
1 | dmesg | grep kvm |
输出结果包含VHE mode initialized successfully
,则表示支持虚拟化。源码参考自linux/arch/arm64/kvm/arm.c · torvalds/linux
2.6.2 准备镜像
我计划安装arm64架构的两个不同操作系统的虚拟机,分别为
2.6.3 搭建环境
安装QEMU和KVM所需的环境
1 | apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst |
工具包说明如下
- qemu-kvm
- KVM 支持的 QEMU 虚拟机管理器
- libvirt-daemon-system
systemctl
服务libvirtd
支持
- libvirt-clients
- 包含一组命令行工具,用于和 libvirt 守护进程交互。
- 常用工具
virsh
:管理虚拟机(启动、关闭、查看信息等)virt-clone
:克隆虚拟机virt-xml
:编辑虚拟机XML配置
- bridge-utils
- 桥接网络的工具包
- virtinst
- 包含一组命令行工具
virt-install
,用于基于命令行创建虚拟机
- 包含一组命令行工具
2.6.4 虚拟网卡
通过NAT模式开启一个网卡,作为后续虚拟机的网关
1 | # 查看libvirt中名为default的虚拟网卡的完整xml配置 |
2.6.5 虚拟机
安装一个Debian12.10系统的虚拟机,桥接入虚拟网卡
1 | # 创建该文件夹完成后,将iso镜像拷入 |
虚拟机的常用操作命令
1 | # 查看虚拟机列表 |
2.6.6 快照
如果需要建立快照,推荐磁盘使用qcow2格式。
快照相关操作如下
1 | # 创建快照 |