jupyter notebook默认仅监听localhost,远程访问需通过ssh隧道安全映射端口;直接绑定0.0.0.0并开放防火墙存在严重安全隐患。

jupyter notebook 本身不直接支持“远程连接”——它默认只监听 localhost,本地浏览器能访问纯属巧合。真要从本地电脑用浏览器操作远程服务器上的 Notebook,核心不是“连上 Notebook”,而是**把远程的 Notebook 端口安全地映射到本地**。最可靠、零配置依赖的方式是 SSH 隧道,不是改 IP 或开防火墙裸奔。
为什么不能直接访问 http://server_ip:8888?
因为默认配置下 jupyter notebook 启动时绑定的是 127.0.0.1:8888,只响应本机请求;即使你手动改成 0.0.0.0 并开放防火墙端口,也会暴露未加密的 HTTP 接口在公网,极易被爆破或中间人劫持。这不是“能不能”,而是“绝对不该”。
SSH 隧道:本地 8888 → 远程 8888(最简且安全)
这是唯一推荐给绝大多数人的方案,不需要改服务器防火墙、不暴露端口、不依赖 Nginx 或反向代理。
- 先确保远程服务器已运行
jupyter notebook --no-browser --port=8888(或jupyter lab),且已设置密码(jupyter server password) - 本地终端执行:
ssh -N -L 8888:localhost:8888 user@server_ip - 保持该终端不关闭(或加
-f后台运行),然后在本地浏览器打开http://localhost:8888 - 输入你在服务器上设置的密码即可登录
注意:localhost 在命令中指“服务器本机”,不是你本地电脑;-N 表示不执行远程命令,纯粹做端口转发。
服务器端必须改的三个配置项(仅当需直连或配合反向代理)
如果你确实要用 Nginx 或云厂商负载均衡,才需要动服务器配置。否则跳过这步。
-
c.ServerApp.allow_remote_access = True(旧版是c.NotebookApp.allow_remote_access) -
c.ServerApp.ip = "0.0.0.0"(绑定所有网卡,不是*) -
c.ServerApp.open_browser = False(避免在服务器上弹浏览器失败报错)
这些写入 ~/.jupyter/jupyter_server_config.py(新版 Jupyter 使用 ServerApp,不是 NotebookApp)。改完必须重启服务,且务必配好防火墙(如 ufw allow 8888)和 HTTPS(否则浏览器会标记不安全)。
常见错误:明明连上了却提示 “Invalid credentials” 或空白页
这不是密码错,而是 token 或认证机制不匹配:
- 用
jupyter server password设置的密码,只对jupyter server(即 JupyterLab 3+ / Notebook 7+)生效;老版本用jupyter notebook password,两者互不兼容 - 如果启动命令里带
--token=xxx,优先级高于密码,会忽略你设的密码 - 浏览器缓存了旧 session,强制刷新(
Cmd+Shift+R)或换隐身窗口再试 - SSH 隧道转发目标写成
server_ip:8888而不是localhost:8888,会导致连接被拒绝
真正麻烦的从来不是“怎么连上”,而是连上之后发现内核死活不启动、文件路径错乱、或者一关终端就断——这些都源于没区分清楚“谁在执行代码”(本地?远程?)、“当前工作目录在哪”(服务器上启动时的路径才是真实路径)。











