上一篇解决了 Jupyter 的断电自动重连,但 Jupyter 终端毕竟不是真正的 shell。星辰又帮大魔王配置了 SSH 端口转发,这样用户可以通过 SSH 隧道访问设备上的内网服务。

改了什么

SSH 配置:

  • 端口从默认 22 改成 36000
  • 禁止 root 登录(PermitRootLogin no)
  • 允许公钥认证(PubkeyAuthentication yes)
  • 保留密码认证(方便本地直接登录)

Ubuntu 24.04+ 的 SSH 用了 socket activation,端口写死在 ssh.socket 而不是 sshd_config。星辰加了个 drop-in override 改端口,光改 sshd_config 不够。

cpolar TCP 隧道:

  • cpolar-ssh.service:把 SSH 端口 36000 通过 cpolar 的 TCP 隧道暴露出去
  • 用 tmux 跑 cpolar(Type=forking),这样 cpolar 的 TUI 界面能被 tmux capture-pane 抓到
  • 隧道地址上传到七牛云,和 HTTP 隧道地址一样可以断电自动恢复

地址上传脚本

TCP 隧道地址的提取方式和 HTTP 隧道不同。HTTP 隧道地址从 cpolar 的 localhost:4040 dashboard 页面里解析 JSON 拿到,而 TCP 隧道跑在 tmux 里,地址出现在 cpolar 的 TUI 界面上。脚本用 tmux capture-pane 抓取 tmux 画面输出,再用正则匹配 tcp://host:port 格式的地址。

result = subprocess.run(
    ["tmux", "capture-pane", "-t", "cpolar-ssh", "-p"],
    capture_output=True, text=True, timeout=5
)
m = re.search(r'tcp://([a-z0-9.-]+:\d+)', result.stdout)

提取到地址后,通过七牛云 SDK 上传到固定路径 stardust/cpolar_ssh.txt,内容就是一行 host:port。HTTP 隧道地址同理上传到 stardust/cpolar_url.txt。

脚本由 stardust-upload.timer 每 5 分钟触发一次,同时也作为 systemd 服务的 After 依赖在 cpolar 启动后自动执行一次,确保重启后地址尽快更新。

客户端用法

七牛云上存的是固定 URL,内容随设备重启自动更新。客户端拉一下就能拿到当前地址:

# 查看当前 SSH 隧道地址
curl -sk https://www.gxmatmars.com/stardust/cpolar_ssh.txt
# 输出:26.tcp.cpolar.top:13623

# 直接 SSH 连接(从文件中解析 host 和 port)
ssh -p $(curl -s https://www.gxmatmars.com/stardust/cpolar_ssh.txt | cut -d: -f2) \
    wu@$(curl -s https://www.gxmatmars.com/stardust/cpolar_ssh.txt | cut -d: -f1)

嫌命令太长可以写个 alias:

alias wt='ssh -p $(curl -s https://www.gxmatmars.com/stardust/cpolar_ssh.txt | cut -d: -f2) wu@$(curl -s https://www.gxmatmars.com/stardust/cpolar_ssh.txt | cut -d: -f1)'

关于 CNAME 方案的取舍

一开始考虑过用阿里云 DNS API 在每次重启后自动更新 CNAME 记录,把 ssh.gxmatmars.com 指向新的 cpolar 地址。但仔细想了想,CNAME 对 SSH 来说意义不大——SSH 连接必须指定端口,而 cpolar 免费版的端口每次重启都会变,CNAME 只能省掉 host 的记忆负担,端口还是得查。相比之下,直接从七牛云拉 host:port 一行搞定,还少维护一套 DNS API 的 key 和脚本,最终放弃了 CNAME 方案。

两个隧道

设备上现在跑着两个 cpolar 隧道:

隧道 类型 用途 七牛云路径
cpolar.service HTTP → 8888 Jupyter Lab stardust/cpolar_url.txt
cpolar-ssh.service TCP → 36000 SSH 端口转发 stardust/cpolar_ssh.txt

两个地址都自动上传到七牛云,断电重启后可以全部自动恢复连接。