用 ngrok + SSH 实现公网远程控制电脑
项目背景
当网络处于 NAT/不稳定的公网 IP 环境下,简单通过 SSH 连接内网主机是不可能的:
- 无法缓解 NAT
- 远程无法直接 ssh 自己网络内的主机
- 公司或家庭网络常常封锁 22 端口
ngrok 利用「逆向 TCP 隔离网络通道」,实现了一个有效的「软公网」模型。内网主机主动连接 ngrok,且外网可通过接口 TCP 重应连接,达成一个安全连通。
架构设计图
[手机或远程控制终端]|ssh -p 12345 user@x.tcp.ngrok.io|
[ngrok 公网中继服务器]|Secure Tunnel (ngrokd)|
[你的 Mac / Windows SSH 服务]
1. 配置 SSH 服务器
macOS
sudo systemsetup -setremotelogin on
测试本地 SSH:
ssh youruser@localhost
Windows
打开 PowerShell (管理员):
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
测试本地 SSH:
ssh youruser@localhost
2. 配置 ngrok TCP 逆向通道
- 注册 ngrok: https://ngrok.com
- 下载 CLI: https://ngrok.com/download
- 配置 Token:
ngrok config add-authtoken <your-token>
启动 SSH TCP 选项:
ngrok tcp 22
输出:
tcp://4.tcp.ngrok.io:12345 → localhost:22
3. 远程连接命令结构
ssh youruser@4.tcp.ngrok.io -p 12345
建议配置 SSH config:
Host my-macHostName 4.tcp.ngrok.ioPort 12345User youruser
连接可简化为:
ssh my-mac
4. 跨平台遥控命令对比
功能 | macOS (终端) | Windows (PowerShell / CMD) |
---|---|---|
锁屏 | pmset displaysleepnow | rundll32.exe user32.dll,LockWorkStation |
睡眠 | pmset sleepnow | rundll32.exe powrprof.dll,SetSuspendState 0,1,0 |
关机 | sudo shutdown -h now | shutdown /s /f /t 0 |
重启 | sudo shutdown -r now | shutdown /r /f /t 0 |
登出 | osascript -e 'tell app "System Events" to log out' | shutdown /l |
通知框 | osascript -e 'display notification "Hi 灵儿" with title "SSH"' | msg * "你好" |
5. 安全性加固
使用 SSH 公钥:
ssh-keygen -t ed25519
ssh-copy-id youruser@localhost
禁用密码登陆:
sudo nano /etc/ssh/sshd_config# 修改:
PasswordAuthentication no
PermitRootLogin no
限制 ngrok TCP 访问:
ngrok tcp 22 --acl allow_cidr=203.0.113.0/24
6. 自动化脚本
启动 ngrok 并输出 URL
#!/bin/bash
ngrok tcp 22 > ~/ngrok.log &
sleep 2
grep -o 'tcp://.*' ~/ngrok.log | tee ~/ngrok_url.txt
一键锁屏:
ssh my-mac 'pmset displaysleepnow'
请下方评论让我知道你最喜欢哪一部分哟~