DEV Community

钟智强
钟智强

Posted on

用 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 服务]
Enter fullscreen mode Exit fullscreen mode

1. 配置 SSH 服务器

macOS

sudo systemsetup -setremotelogin on
Enter fullscreen mode Exit fullscreen mode

测试本地 SSH:

ssh youruser@localhost
Enter fullscreen mode Exit fullscreen mode

Windows

打开 PowerShell (管理员):

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
Enter fullscreen mode Exit fullscreen mode

测试本地 SSH:

ssh youruser@localhost
Enter fullscreen mode Exit fullscreen mode

在这里插入图片描述

2. 配置 ngrok TCP 逆向通道

  1. 注册 ngrok: https://ngrok.com
  2. 下载 CLI: https://ngrok.com/download
  3. 配置 Token:
ngrok config add-authtoken <your-token>
Enter fullscreen mode Exit fullscreen mode

启动 SSH TCP 选项:

ngrok tcp 22
Enter fullscreen mode Exit fullscreen mode

输出:

tcp://4.tcp.ngrok.io:12345 → localhost:22
Enter fullscreen mode Exit fullscreen mode

3. 远程连接命令结构

ssh youruser@4.tcp.ngrok.io -p 12345
Enter fullscreen mode Exit fullscreen mode

建议配置 SSH config:

Host my-mac
    HostName 4.tcp.ngrok.io
    Port 12345
    User youruser
Enter fullscreen mode Exit fullscreen mode

连接可简化为:

ssh my-mac
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

禁用密码登陆:

sudo nano /etc/ssh/sshd_config

# 修改:
PasswordAuthentication no
PermitRootLogin no
Enter fullscreen mode Exit fullscreen mode

限制 ngrok TCP 访问:

ngrok tcp 22 --acl allow_cidr=203.0.113.0/24
Enter fullscreen mode Exit fullscreen mode

6. 自动化脚本

启动 ngrok 并输出 URL

#!/bin/bash
ngrok tcp 22 > ~/ngrok.log &
sleep 2
grep -o 'tcp://.*' ~/ngrok.log | tee ~/ngrok_url.txt
Enter fullscreen mode Exit fullscreen mode

一键锁屏:

ssh my-mac 'pmset displaysleepnow'
Enter fullscreen mode Exit fullscreen mode

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

Top comments (0)