上一篇解决了 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 |
两个地址都自动上传到七牛云,断电重启后可以全部自动恢复连接。