最可靠方式是SSH隧道:本地localhost:8888→远程localhost:8888,加密转发且不暴露端口;直接公网访问因默认监听127.0.0.1、无HTTPS/认证/IP限制而极不安全。

直接连远程服务器的 jupyter notebook 不安全,也容易被防火墙拦截。最可靠、最常用的方式是走 SSH 隧道,本地浏览器或 VS Code 通过 localhost 访问,实际流量全部加密转发到远程服务器。
为什么不能直接用公网 IP + 端口访问?
因为默认配置下 jupyter notebook 只监听 127.0.0.1,即使你改了 c.NotebookApp.ip = '0.0.0.0',裸露端口在公网等于把登录入口直接交给扫描器——没配 HTTPS、没开认证绕过、没限制来源 IP,几小时内就可能被爆破或植入恶意 notebook。
- 哪怕开了密码,
http://协议下密码也是明文传输(除非配了 SSL) - 很多云服务器默认关闭所有非 22/80/443 端口,
ufw或安全组不放行8888就连不通 -
jupyter notebook password生成的是服务端校验凭证,但没绑定 IP 或设备,单点密码泄露即失守
SSH 隧道连接:本地 localhost:8888 → 远程 localhost:8888
这是目前最轻量、最普适、零额外依赖的方案,不需要改服务器防火墙、不暴露 Jupyter 端口、不用配 Nginx 或反向代理。
在本地终端执行:
ssh -N -L 8888:localhost:8888 user@your-server-ip
说明:
-
-N:不执行远程命令,只做端口转发 -
-L 8888:localhost:8888:把本地 8888 端口的请求,转发到远程服务器的localhost:8888(注意不是0.0.0.0:8888) - 必须确保远程服务器上
jupyter notebook是以--no-browser --port=8888启动的,且监听地址为127.0.0.1(默认行为,最安全) - 连接后,本地浏览器打开
http://localhost:8888,输入你用jupyter notebook password设置的密码即可
VS Code 直连远程内核(比浏览器更进一步)
如果你用 VS Code 写 Python,不只想看 notebook 页面,而是想在编辑器里直接运行 cell、调试变量、用 Pylance 补全——那就跳过浏览器,让 VS Code 的 Jupyter 插件直连远程内核。
操作路径:
- 本地安装官方
Jupyter插件(Microsoft 出品) - 新建或打开
.ipynb文件 - 右上角点击「Select Kernel」→「Existing Jupyter Server」→ 输入
http://localhost:8888 - 它会自动读取远程 Jupyter 的 token 或密码提示(如果配置了 password,会弹窗要你输)
- 关键点:
jupyter notebook必须已启动,且c.NotebookApp.password_required = True(默认开启),否则 VS Code 无法完成身份校验
容易被忽略的三个细节
很多人卡在这几步上,不是配置错,而是漏掉隐含前提:
- 远程服务器上
jupyter notebook启动时,必须带--no-browser,否则会尝试在服务器本地开浏览器(失败但不报错,进程卡住) -
jupyter notebook password生成的密文存进~/.jupyter/jupyter_server_config.json,不是jupyter_notebook_config.py;如果两个文件里都写了password字段,优先用 json 文件里的 - SSH 隧道断开后,本地
localhost:8888立即不可访问——这不是 Jupyter 挂了,只是隧道断了;重连 SSH 即可,不用重启 Jupyter


















