这是因为 VS Code 的 Remote-SSH 自动为你建立了SSH 端口转发(Port Forwarding),把远程主机上的 127.0.0.1:9091 "隧道"到了你本地电脑的 127.0.0.1:9091


原理图解

你的电脑(本地)                远程主机(通过 SSH 连接)
├─ 浏览器访问                    ├─ transmission-daemon
│  127.0.0.1:9091  ─────┐       │  监听 127.0.0.1:9091
│                        │       │  (仅本机可访问)
│                        ▼       │
│              VS Code SSH 隧道  │
│              (自动建立)       │
│                        │       │
└────────────────────────┘───────┘

关键点:transmission-daemon 默认只监听 127.0.0.1(localhost),这意味着:

  • 它只接受来自远程主机自己的连接
  • 外网、局域网其他设备、甚至你的本地电脑都不能直接访问

为什么 VS Code 连接后才能访问

场景 能否访问 原因
未连接 SSH ❌ 不能 远程的 9091 端口只绑在远程的 127.0.0.1 上,你的电脑和它是两个独立的 “localhost”
VS Code Remote-SSH 连接后 ✅ 能访问 VS Code 检测到远程有服务在 9091,自动把远程端口转发到本地
手动 SSH 隧道 ✅ 能访问 ssh -L 9091:127.0.0.1:9091 user@host 做同样的映射

VS Code 的自动转发机制

当你连上 Remote-SSH 后:

  1. VS Code 会扫描远程主机上正在监听的端口
  2. 发现 127.0.0.1:9091 有服务(transmission)
  3. 自动弹窗提示:“Port 9091 is available. See all forwarded ports.”
  4. 或者在左侧 “Ports” 面板里显示转发的端口

此时:

  • 你本地浏览器访问 127.0.0.1:9091
  • 请求被 VS Code 截获,通过 SSH 隧道送到远程主机
  • 远程主机把请求转给 127.0.0.1:9091 的 transmission

如果没有 VS Code 自动转发怎么办?

手动建立隧道:

# 在本地终端执行(不要进远程主机)
ssh -L 9091:127.0.0.1:9091 x@192.168.3.12

# 或者后台运行
ssh -fN -L 9091:127.0.0.1:9091 x@192.168.3.12

然后本地浏览器访问 127.0.0.1:9091,效果完全一样。


为什么 transmission 要绑 127.0.0.1 而不是 0.0.0.0

这是安全设计:

  • 127.0.0.1 = 只有本机能访问,外网黑客扫不到
  • 0.0.0.0 = 全网可访问,如果设了弱密码,任何人都能进你的 transmission 面板删种子

如果你确实想不连 SSH 直接访问,需要:

  1. 改 transmission 配置 rpc-bind-address0.0.0.0
  2. 防火墙开放 9091 端口
  3. 强烈建议设置 RPC 密码 + HTTPS,否则裸奔在互联网上极其危险

一句话

127.0.0.1 是每个机器独立的"本机地址"。远程 transmission 只监听自己的 127.0.0.1,外网无法访问。VS Code Remote-SSH 自动建立了 SSH 隧道,把你本地的 9091 端口映射到了远程的 9091,所以你才能在本地用 127.0.0.1:9091 访问到远程服务。

更多推荐