【随笔】2026-10-05 | 从"连不上家里的电 脑"到全链路打通
date: 2026-10-05
tags: 内网穿透, frp, SSH, NAT, CGNAT, 华为云, Windows, 计划任务, 远程访问, 折腾实录
type: 随笔
需求很朴素:人在外面,用手机 SSH 连回家里电脑。现状很骨感:家宽没有公网 IP、光猫防火墙拦一切入站、路由器连管理权限都拿不 到。这篇文章复盘我两天的完整探索------从方案 海选到 13 个坑逐一取证,从"能连上"的及格 线,一路走到"重启后还能连、闲置一晚不断线"的毕业线。
一、起点:现代家宽的"三无"困境
先交代需求。我不只是想"看看"家里的电脑: 在外面临时改两行代码、跑个脚本、让 tmux 里的长任务夜里自己跑------这些都需要一个真正 的 SSH 会话,不是远程桌面能替代的。
想在外面的任意网络里 SSH 回家,先得回答一个问题:外面的包,凭什么进得了你家的门 ?
我的家宽现状是标准的"三无":
| # | 墙 | 现状 |
|---|---|---|
| 1 | 无公网 IPv4 | 运营商早已不分配独立 公网 IP,家宽普遍缩在 CGNAT(运营商级 NAT)后面,几百户共用一个公网出口 |
| 2 | IPv6 有了,但白搭 | 光猫/路由器自带 IPv6 防火墙,拦截一切入站连接;想改配置 需要电信运营商的超级账号------普通用户这 辈子拿不到 |
| 3 | 路由器零配置权限 | 端口映射、DMZ、UPnP,想都别想 |
结论其实只有一个:一切依赖"外面主动连进来"的方案,全部死刑。 唯一的活路,是让 家里的电脑主动伸出手去。
二、方案海选:四条路线的否决与胜出
方向定了,接下来是选路。我把能找到的路线 挨个过了一遍:
| 方案 | 结局 | 一句话点评 |
|---|---|---|
| IPv6 直连 + 防火墙放行 | ❌ | 卡在路由 器超级账号,普通人无解 |
| EasyConnect | ❌ | 方向反了------那是"你连 单位内网"的商用 SSL VPN,个人根本没有服务端可部署,安全口碑还差 |
| Tailscale | 备选 | 优秀,但协调服务器在境外,国内使用有不确定性 |
| EasyTier + 公共共享节点 | 中途翻车 | 国产开源、去中心化,电脑端轻松入网;但手 机流量死活入不了网------疑似运营商 CGNAT 对公共节点 UDP 限流 |
| 云服务器 + frp | ✅ 最终胜者 | 出站穿透的经典解法,配一台最低配云服务器,连 接确定性 100% |
EasyTier 那次翻车反而成了整个选型的关键转折:手机端无法稳定运行组网类工具(VPN 常驻、电池优化杀后台、部分平台压根没有客户端),这个事实反向逼出一个洞察------
客户端越"傻"越好,理想状态是手机只需 要一个普通 SSH App。
frp 恰好满足:手机直连云服务器公网 IP,对组网协议零感知。家里的网络再复杂,也复杂 不到手机头上。
三、买服务器:三个新手概念题
方案定了,先买服务器。这一步踩的不是技术 坑,是概念坑。
1. VPC ≠ VPS(一字之差,天壤之别)
云控制台里最显眼的"VPC"是个大坑爹名词------它是虚拟私有云 ,本质是一张"网络规划图" ,不是服务器 ,装不了任何东西。真正要 买的是 ECS / 轻量应用服务器:一台有公网 IP 的真机器。
2. "仅 IPv6 无限流量"的诱惑
便宜是因为服务器只有 IPv6 地址。看似划算 ,实则埋雷:你发起连接的每一个网络都必 须有 IPv6 。一旦连上 IPv4-only 的 WiFi(公司、酒店、朋友家)→ 彻底失联,连服务 器都摸不到。
多花几块钱买 IPv4 标准型,买的是"任何网络都连得上"的保底。
3. 镜像与规格选择
-
Windows Server?1G 内存跑不动它自己
-
CentOS 8.2?已停止维护(EOL),无安全更新
-
最终选 Ubuntu 24.04 LTS------教程最多、生态最广、支持到 2029
-
规格 2 核 1G,跑一个 frps(内存占用仅 20MB 左右),属于"大材小用"级别的匹配
四、原理篇:frp 凭什么绕过一切封锁
动手之前先想明白原理。frp 的穿透靠三层技 巧,层层递进:
1. 状态型防火墙的"漏洞"
防火墙/NAT 只拦"不请自来"的入站包,但放行合法出站连接的所有回程数据。frpc 开机就主动连服务器的 7000 端口------合法出站,一 路绿灯。
2. 长连接 = 永不挂断的专线
这条出站连接靠心跳包死死保持。之后所有数 据都"装在"它里面运输------对家里的防火墙来说 ,这些全是"合法出站连接的回程数据",无差 别放行。
3. 连接拼接
css
[手机] --TCP--> [服务器 frps:6000] ==长连接隧道== [家电脑 frpc] --TCP--> [sshd:2222]
手机连服务器 6000 → frps 通过长连接喊 frpc 接应 → frpc 回头连本机 sshd → 两段字节 流无缝对接。SSH 加密是端到端的:手机 和 sshd 直接协商密钥,服务器夹在中间只是 个搬运工,搬的全是看不懂的密文。
一句话总结:家里的人够不着外面?那就 让家里的人先伸手出来,所有人沿着这条手双 向通话。
五、部署实录:从 frps 到手机首连
服务器端
bash
# 下载 frp v0.61.1(GitHub 国内龟速的解法见坑 3)
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
tar -xzf frp_0.61.1_linux_amd64.tar.gz
sudo mkdir -p /opt/frp
sudo cp frp_0.61.1_linux_amd64/frps /opt/frp/
/opt/frp/frps.toml:
toml
bindPort = 7000
auth.token = "<你的token>"
用 systemd 托管(崩溃自重启):
ini
# /etc/systemd/system/frps.service
[Unit]
Description=frps service
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable --now frps
sudo ufw allow 7000/tcp # frpc 的生命线
sudo ufw allow 6000/tcp # 对外代理口
# 验证:frps 存活、端口已监听
systemctl status frps
ss -tlnp | grep 7000 # 此刻只应看到 7000------6000 要等 frpc 注册后才出现(见坑 2)
别忘了云控制台的安全组------网页上还有一 层防火墙,7000 和 6000 都要放行(这个"双 层防火墙"是后面坑 5 的主角)。
家电脑端
C:\frp\frpc.toml(终态版本,含后文坑 13 的药方):
toml
serverAddr = "<服务器公网IP>"
serverPort = 7000
auth.token = "<你的token>"
# 关键:首次登录失败不退出,内置无限重连 (坑 13 的药方)
loginFailExit = false
[log]
to = "C:/frp/frpc.log"
level = "info"
maxDays = 7
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 2222
remotePort = 6000
命令行党可以直接给 Defender 加排除(为什 么需要排除,见坑 8):
powershell
Add-MpPreference -ExclusionPath "C:\frp"
手机首连
Termius 里新建 Host:
| 字段 | 值 |
|---|---|
| Address | <服务器公网IP> |
| Port | 6000 |
| Username / Password | 家电脑的账户密码 |
连上那一刻,提示符是家里电脑的主机名。
手机永远只连 6000。它不知道也不需要知道:这条连接在服务器上被"换乘"了一次,最 后敲的是家电脑的 2222。
六、踩坑实录:13 个坑的取证式展开
部署一路走下来,我总共踩了 13 个坑。按剧 本类型分组复盘。
连通类:三个"不通",各有各的剧本
坑 1:端口测试的时序陷阱。 部署 frps 之前就测 Test-NetConnection <服务器公网IP> -Port 7000 → False,差点误判为防火墙 问题。真相:没进程监听的端口,内核直接 拒绝连接。端口连通测试必须在服务部署之 后做,否则你根本无法区分"防火墙拦了"和"压根没人听"。
坑 2:6000 端口"不通"的虚惊。 frps 起来了,6000 还是 False?正常------6000 要等 frpc 连上来"注册映射"后,frps 才开始监听。要分清哪些端口是服务启动即监听,哪些是客户端注册后动态出现的。
坑 5:防火墙是两层的。 云厂商安全组(网页配置)和系统防火墙(ufw)相互独立,都要放行 。排查"配置全对但就是不通"的顺 序:先 sudo ufw status 看系统层,再查云控制台安全组。这是我"按步骤做但不通"的头 号元凶。
下载类
坑 3:GitHub 国内龟速。 服务器 wget GitHub Release 卡在重定向------真实下载地址是 objects.githubusercontent.com,国内极慢。解法组合拳:
-
GitHub 加速代理前缀(搜"GitHub 文件加速"找当前可用的)
-
Gitee 社区同步仓库(站内搜 frp)
-
aria2 多线程硬啃:
aria2c -x 8 <地址> -
终极大招:本地下载好,scp 传上去
下载完记得 ls -lh 校验大小(frp 0.61.1 linux 包约 13M),偏小就是没下完整, 解压必报错。
稳定性类
坑 4:SSH 频繁掉线。 client_loop: send disconnect: Connection reset,闲置几 分钟必掉。病根:SSH 太安静,被中间 NAT 设备判死 (状态登记被清掉了)。客户端侧 的药方是给 ~/.ssh/config 加心跳:
text
Host *
ServerAliveInterval 30
每 30 秒一个心跳包骗过闲置检测;长任务再 进 tmux 兜底,掉线重连 tmux attach 回到现场,任务零中断。服务端全局心跳的展开见 第八章------这个坑后来还以"手机掉线"的形态返 场了一次。
Windows 特产
坑 6:sshd 端口竟是 2222。 家电脑的 sshd 早已改过端口(非默认 22)。好在 frp 架构下这无所谓------frpc.toml 的 localPort 填 2222 即可,手机端永远只连 6000,本地端口对外完全透明。这也是端口映射架构的 优雅之处:内外端口解耦。
坑 8:杀毒软件把 frp 判成"黑客工具"。 frp 一下载就被 Windows Defender 报毒(HackTool)。这不是误报恐慌------frp 确实是内网 穿透工具,天然长着一张"远控"的脸。解法:Windows 安全中心 → 病毒防护 → 管理设置 → 排除项 → 给 C:\frp 整个文件夹加排除。只在自有设备、自有服务器之间使用,加排除是 安全的。
坑 9:frp 压根没有"装成服务"的子命令。 我想当然地跑 frpc service install,得到 unknown command "service"------新版 frp 早已移除该子命令。替代方案是 Windows 计划任务托管,其中三个参数是灵魂:
-
触发器
AtStartup------开机即启,不依赖任 何用户登录 -
运行账户
SYSTEM+-RunLevel Highest -
ExecutionTimeLimit = 0------不设它, 计划任务默认 72 小时强杀长进程,隧道会在 第三天准时断流且毫无征兆
注册命令(管理员 PowerShell):
powershell
$action = New-ScheduledTaskAction -Execute "C:\frp\frpc.exe" -Argument "-c C:\frp\frpc.toml"
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries `
-ExecutionTimeLimit (New-TimeSpan -Seconds 0) -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1)
Register-ScheduledTask -TaskName "frpc" -Action $action -Trigger $trigger -Principal $principal -Settings $settings
注册完当场体检(注意用管理员身份跑,否则 会撞上坑 12 的"薛定谔状态"):
powershell
Get-ScheduledTask -TaskName "frpc" # State 应为 Ready
Get-ScheduledTaskInfo -TaskName "frpc" # LastRunTime / NumberOfMissedRuns
坑 10:注册成功的计划任务,复查时凭空消失。 Register-ScheduledTask 显示成功 、State=Ready,几分钟后 Get-ScheduledTask 查无此人,原因未明(疑似被安全软件或系统优化清理)。教训:计划任务要做"存在性体检"------部署完成后隔段时间复查一次。
工具链与权限
坑 7:安全红线------密码绝不进聊天框。 我曾想"把服务器密码发给 AI 助手让它帮我干" 。两层否定:第一,AI 没有终端工具,物理上干不了;第二,更重要的是密码一旦出现在 对话里就视同泄露。正确的"AI 帮我干"形态,是把 AI 助手装在服务器上本地执行------密码 永不出服务器。
坑 11:编码连环坑------中文是 PowerShell 5.1 的天敌。 同一天被同一根源连坑三次:
-
中文注释脚本:UTF-8 无 BOM 的 .ps1 被老版 PowerShell 按 GBK 误读,注释行"吞掉"下一行代码,报错行号整体偏移------看着像语法错误,其实是编码错误
-
中文路径 :脚本里写死的
C:\Users\<用户名>\...日志路径,经编码错乱写进了一个乱码目录,日志"凭空消失" -
乱码目录别有洞天 :想清理时才发现里面还住着第三方应用的历史数据(连枚举都被 ACL 拒绝)------清理"垃圾"目录前,先验明正 身
终极解法一句话:Windows 自动化脚本,一 律纯 ASCII。
坑 12:SYSTEM 任务的"薛定谔状态"。 SYSTEM 注册的计划任务,普通权限下 Get-ScheduledTask 报"找不到"、schtasks 报 Access denied------看起来任务没了,实际是安全描述符挡住了普通用户的读取。验证系统级任务 的存活,必须以管理员视角。(坑 10 的"消失",有一半概率其实只是坑 12 的错觉。)
第 13 个坑,藏在明天早晨
到这里,12 个坑全部填平,隧道稳定、开机自启"配置完毕",一切测试通过。我信心满满地 关机睡觉------
第二天早晨,手机连上去的那一刻:Connection refused。
七、重启考:一次阵亡与 7 秒自救
这是全套流程里最隐蔽的一枪,值得单开一章 。
现场
重启后的家电脑就在眼前,隧道却死了。手机 Termius 报 Connection refused。我做了四路探测:
| # | 探测 | 结果 | 说明 |
|---|---|---|---|
| 1 | 家电脑 Get-Process frpc | 无此进 程 | frpc 死了 |
| 2 | Test-NetConnection <服务器公网IP> -Port 7000 | True | 服务器和 frps 活得好好的 |
| 3 | Test-NetConnection <服务器公网IP> -Port 6000 | False(refused) | 没人监听 6000 = frpc 压根没注册映射 |
| 4 | 家电脑开机时间 | 08:46 | 计划任务(AtStartup)早就该拉起它了 |
推理链:服务器无辜 → frpc 被任务拉起过、 但死了 → AtStartup 触发器没有失败 → 它不是被拉起失败的,是被拉起之后自己退出的。
顺带一个取证细节:6000 探测回来的是 refused 而不是 timeout------服务器内核明确说" 没人在听",而不是防火墙默默丢包。refused = 无人监听,timeout = 防火墙拦截,这组区 别第一次在实战里派上用场。
病根:loginFailExit 的默认值
可它为什么退出?没有日志,死无对证------这本 身就是第一个教训(下一章"可观测性先行"的 由来)。只能查配置和文档,最后在 frp 文档里定罪:
loginFailExit默认为true:首次登录服务器失败,进程直接退出。
时间线还原:开机 → AtStartup 任务抢在网络就绪之前拉起 frpc → 首连必败 → frpc 直接自杀 → 任务的 3 次重试若仍撞上无网窗 口,就死透了。配置"看起来全对",死的却悄 无声息。
药方
frpc.toml 顶层加一行,同时把日志配上:
toml
loginFailExit = false
[log]
to = "C:/frp/frpc.log"
level = "info"
maxDays = 7
首连失败不退出,内置无限重连------网络一就绪 ,立刻自己爬起来。
复考:7 秒自救实录
再重启一次。这次日志在场,铁证如下:
| 时间 | frpc.log 实录 | 解读 |
|---|---|---|
| 09:15:26 | connect error: A socket operation was attempted to an unreachable network | 首连失败:网络未就绪 |
| 09:15:28 | connect error: ...(重试 #1) | 仍然无网------但进程还活着 |
| 09:15:33 | login to server success → start proxy success | 网络就绪,7 秒 完成自救 |
手机再连:一次成功。
复盘:第一次考试输在哪
输在两处:
-
考试方法错:AtStartup + 真实重启 + 开机无网窗口,这个组合我从头到尾没真实跑过------"每一步都单独测过"和"整条链路考过", 是两回事
-
考场没有监控 :第一次失败时 frpc.log 还不存在------计划任务后台进程没有控制台, 死因只能靠推理定罪;日志配上之后复考,才 拿到 7 秒自救的铁证。先有可观测性,才谈得上排查
一句话概括:装成开机任务 ≠ 开机真能用。 自启可靠性必须用真实重启来考------而且要先把日志配上,再谈排查。
八、可靠性工程与两场毕业考
打通隧道只是及格线。真正要交付的是:重 启后还能连、放一晚上不断线。
0. 可观测性先行
frpc 以计划任务后台运行时没有控制台 ,不落盘日志就等于全程盲诊:进程死了不知道 、怎么死的不知道、什么时候复活的也不知道 。坑 13 能拿到 7 秒自救的铁证,正是日志的功劳。所以 frpc.toml 的 [log] 不是可选 项,是地基。
1. 重启自愈三保命
| 配置 | 做法 | 作用 |
|---|---|---|
| sshd 启动类型改 Automatic | Set-Service sshd -StartupType Automatic | 开机自动监听 2222 |
| frpc 计划任务托管 | AtStartup + SYSTEM + ExecutionTimeLimit=0 + RestartCount 3 | 开机拉起、崩溃自重启、无 72h 强杀 |
| 睡眠/休眠全关 | powercfg /change standby-timeout-ac 0(dc 同理,hibernate 同理) | 电脑永远醒着 |
2. 手机掉线痊愈三件套
手机闲置几分钟掉线,和坑 4 的 PC 端掉线是同一种病:NAT 设备把"太安静"的连接登 记项清掉了------只是这次被清的是"手机→服务器"那一段。药方:
-
服务端全局心跳 :sshd_config 追加
ClientAliveInterval 30+ClientAliveCountMax 5------家电脑每 30 秒探测一次,一处修改,覆盖所有客户端(手机、平板、任何人 的电脑) -
客户端双保险:Termius → Settings → SSH → Keep Alive Interval = 30
-
治锁屏杀后台:安卓对 Termius 关闭电池优化,否则心跳包根本发不出去
3. 提权执行的正确姿势
注册计划任务、改 sshd、关睡眠,全都需要管理员权限,非提权上下文一律 Access is denied。最稳的形态:把全部修改写成一个自 检脚本 ,每步打印 [1]~[6] 的结果,管理员身份一气呵成跑完,输出形如:
text
[1] sshd StartupType = Automatic ... OK
[2] ClientAliveInterval = 30 ... OK
[3] 睡眠/休眠已全关 ... OK
[4] 计划任务 frpc 已注册 ... OK
[5] ExecutionTimeLimit = 0 ... OK
[6] frpc 日志配置 ... OK
ALL DONE
输出即验收单,六步全绿再收工。
两场毕业考成绩单
| 考试 | 内容 | 结果 |
|---|---|---|
| 重启考 | 真实重启,隧道自动恢复 | ✅ 实际 7 秒(frpc.log 铁证,见第七章) |
| 闲置考 | 放置 10~15 分钟不断线 | ✅ 30 秒心跳双保险生效 |
双考全过,这套系统才算毕业。
九、最终架构与成本
css
[手机 Termius] --ssh--> [云服务器 frps:6000] <--长连接隧道-- [家电脑 frpc] --> [sshd:2222]
-
服务器:华为云轻量 2 核 1G · Ubuntu 24.04 · IPv4 标准型,月成本一杯奶茶钱
-
家电脑 :frpc 由计划任务托管(开机自启、崩溃自动拉起、
loginFailExit = false抗开机竞速);日志落盘 frpc.log;sshd 心跳 30 秒;睡眠全关 -
服务器 frps :systemd 托管,
Restart=on-failure崩溃自重启 -
手机 :Termius 直连
公网IP:6000免密登录;Termux 接入为第二客户端------ssh-keygen生成密钥,ssh <用户名>@<服务器公网IP> -p 6000即连 -
加固收尾:密钥登录 + 关闭密码 + 账 户白名单,sshd_config 终态节选(账户名脱 敏):
text
Port 2222
ClientAliveInterval 30
ClientAliveCountMax 5
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers <用户名>
Termux 的新公钥要进的就是 administrators_authorized_keys------它被 ACL 锁定,普通权 限写不进去,必须经管理员 PowerShell 追加 。这也是"一处配置,所有客户端通用"的落点 :心跳在全局段,授权在 Match 块,新设备接入只需追加一行公钥。
双客户端的意义在于验证了架构的优雅:服 务端一处配置(心跳 + 授权),所有客户端通用。新设备想接入?生成密钥、追加公钥, 完事。
十、心法与进化设想
写给同样困境的你:四条心法
-
认清方向:家宽 NAT/防火墙下,"由内向外"是唯一活路------先找"让家电脑主动出站"的方案,再谈其他
-
客户端越傻越好 :方案优劣的隐藏维度是客户端的环境依赖------最好客户端只需要 一个标准 SSH App,VPN 常驻类方案在手机端 都是定时炸弹
-
能连上只是及格线:真正交付的是"重 启后还能连、闲置一晚不断线"------开机自启、心跳保活、睡眠关闭,可靠性工程才是最后一公 里
-
坑都是知识点:端口测试时序、双层防火墙、NAT 闲置超时、编码连环坑......每个坑背 后都是一条原理,踩过就真正懂了
进化设想:让家电脑从公网隐身
毕业不是终点,这套系统还有一条清晰的进化 路线。
现状的取舍 :一条命令直达家电脑,连 服务器的账号都不需要------frps 只是字节搬运工,SSH 的密钥协商与内容全程不经过它(手 机↔家电脑端到端加密)。便利拉满,代价是 6000 端口对全网开放,家电脑的 sshd 天天被 扫描器敲门(好在只进得来持密钥的人)。
进阶形态:跳板模式(堡垒机思路):
现在:手机 ──直接敲──→ 公网:6000 ──→ 家电脑 (6000 全网可敲)
设想:手机 ──先登──→ 服务器:22 ──→ 本机:6000 ──→ 家电脑(6000 收回服务器本机)
三个动作,缺一不可:
-
frps.toml 加
proxyBindAddr = "127.0.0.1"------6000 只绑回环网卡,公网物理不可达 -
云防火墙删掉 6000 放行规则------双保险
-
7000 保持开放------家电脑 frpc 的生命 线,与 6000 是两码事(最易搞混的一步)
成立前提是服务器为自己的专用机------两段加密 的信任模型才成立。而"专用"同时意味着守 门责任在己:服务器变成唯一入口后,它的 22 端口就是全家的门锁,fail2ban 与密钥化 登录正是这门工程的地基。代价是 Termius 要配 Jump Host(体验仍是一键),以及服务器 理论上可见中转流量(自有机,可接受)。
同场加映:服务器兼任常驻基地 。它 7×24 在线、机房带宽、不依赖家里供电断网。Termius 加一个 Host(root@公网IP:22)即可与"家电脑 Host"并存:需要家里的环境走隧道,需要稳定的 Linux 环境直连服务器------两把钥匙,各开各的门。
随笔小结:内网穿透的胜负手不在工具 ,而在方向------家宽的墙只拦"进来",不拦"出去",让家电脑先伸手,一切自然打通。工具链本身两天就能跑通,真正的工程量在可靠性:13 个坑里最狠的一个(loginFailExit 默认值) 专门猎杀"配置全对但没真机重启过"的人------** 装成开机任务 ≠ 开机真能用**,能连上只是及格线,重启后 7 秒能自己爬起来,才算毕业。
懿路向前 · AI辅助整理
2026-10-06