用 ngrok + SSH 实现公网远程控制电脑

发布于:2025-07-11 ⋅ 阅读:(22) ⋅ 点赞:(0)

项目背景

当网络处于 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 逆向通道

  1. 注册 ngrok: https://ngrok.com
  2. 下载 CLI: https://ngrok.com/download
  3. 配置 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-mac
    HostName 4.tcp.ngrok.io
    Port 12345
    User 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'

请下方评论让我知道你最喜欢哪一部分哟~


网站公告

今日签到

点亮在社区的每一天
去签到