如何远程访问在WSL运行的Jupyter Notebook
远程访问在 WSL 中运行的 Jupyter Notebook 是一个非常常见的需求,比如你想用你的笔记本电脑或者平板来访问你台式机上运行的计算任务。
这比在本地访问要多几个步骤,主要是因为需要进行网络配置和安全设置。
我们将分为两大部分:
- 在局域网内远程访问 (例如,在同一个 WiFi 下的另一台电脑或平板访问)。
- (进阶)从外网访问 (通过互联网从任何地方访问,较专业)。
Part 1: 在局域网内远程访问
默认情况下,Jupyter 为了安全,只允许从本机(localhost
)访问。要实现远程访问,我们需要做三件事:
- 让 Jupyter 监听所有网络接口的请求,而不仅仅是
localhost
。 - 设置一个密码,而不是使用一次性的
token
,这样更安全也更方便。 - 配置 Windows 防火墙,允许外部设备访问 WSL 的端口。
步骤一:生成 Jupyter 配置文件
如果你还没有配置文件,需要先生成一个。在你的 WSL Ubuntu 终端中(确保你已经激活了虚拟环境 source venv/bin/activate
),运行:
jupyter notebook --generate-config
这会在你的 home 目录下的 .jupyter
文件夹中创建一个名为 jupyter_notebook_config.py
的文件。路径是 ~/.jupyter/jupyter_notebook_config.py
。
步骤二:设置访问密码
为了安全,我们不应该把一个带 token
的链接暴露在网络中。设置一个固定的密码是最好的方式。
在激活了虚拟环境的终端中运行:
jupyter notebook password
系统会提示你输入并确认密码。这个命令会生成一个加密后的密码,并保存在 ~/.jupyter/jupyter_server_config.json
文件中。Jupyter 启动时会自动读取这个密码。
步骤三:修改配置文件
现在,我们需要编辑第一步生成的配置文件,让 Jupyter 监听公网 IP。
-
用一个终端编辑器(如
nano
)打开配置文件:nano ~/.jupyter/jupyter_notebook_config.py
-
在文件中找到(可以使用
Ctrl + W
搜索)以下几行,取消它们的注释(删除行首的#
号)并修改它们的值:# 找到这一行: # c.NotebookApp.ip = 'localhost' # 修改为 '0.0.0.0',表示监听所有 IPv4 地址 c.NotebookApp.ip = '0.0.0.0'# (可选,但推荐) 阻止Jupyter在启动时自动打开浏览器 # 因为在WSL中它也打不开图形界面浏览器 # 找到这一行: # c.NotebookApp.open_browser = True # 修改为 False c.NotebookApp.open_browser = False# (可选) 如果你不想使用默认的 8888 端口,可以修改这里 # c.NotebookApp.port = 8888
-
修改完成后,按
Ctrl + X
,然后按Y
保存,最后按Enter
确认文件名退出nano
。
步骤四:配置 Windows 防火墙
这是最关键的一步,因为 WSL 的网络流量需要通过 Windows 主机。你需要告诉 Windows 防火墙,允许外部设备访问你为 Jupyter 设置的端口(默认为 8888)。
-
在 Windows 中(不是 WSL),打开 “开始” 菜单,搜索 “高级安全的 Windows Defender 防火墙” (Windows Defender Firewall with Advanced Security) 并打开它。
-
在左侧面板中,点击 “入站规则” (Inbound Rules)。
-
在右侧面板中,点击 “新建规则…” (New Rule…)。
-
规则类型: 选择 “端口” (Port),点击 “下一步”。
-
协议和端口: 选择 “TCP”,然后在 “特定本地端口” (Specific local ports) 中输入
8888
(或者你自定义的端口号),点击 “下一步”。 -
操作: 选择 “允许连接” (Allow the connection),点击 “下一步”。
-
配置文件:
- 私有 (Private): 必须勾选,这适用于你的家庭或工作局域网。
- 公用 (Public): 不要勾选,除非你明确知道你在公共网络(如咖啡店的WiFi)上需要这样做,这有安全风险。
- 域 (Domain): 如果你的电脑在公司域中,可以勾选。
- 通常只勾选 “私有” 即可。点击 “下一步”。
-
名称: 给规则起一个容易识别的名字,比如
Jupyter WSL Port
,然后点击 “完成”。
步骤五:启动 Jupyter 并从远程设备访问
-
获取 Windows 主机的 IP 地址:
- 在 Windows 中打开命令提示符 (
cmd
) 或 PowerShell。 - 运行
ipconfig
。 - 在输出中找到你当前连接的网络(比如 “无线局域网适配器 WLAN” 或 “以太网适配器 Ethernet”),记下它的 “IPv4 地址”,例如
192.168.1.105
。
- 在 Windows 中打开命令提示符 (
-
在 WSL 中启动 Jupyter:
回到你的 WSL 终端(确保虚拟环境已激活),像往常一样启动 Jupyter:jupyter notebook
或者启动 JupyterLab:
jupyter lab
因为你修改了配置,它现在会监听来自局域网的请求。
-
从远程设备访问:
在你的另一台电脑、笔记本或平板的浏览器中,输入以下地址:
http://<你Windows主机的IP地址>:8888
例如:
http://192.168.1.105:8888
浏览器会打开 Jupyter 的登录页面,输入你在 步骤二 中设置的密码即可访问。
Part 2: (进阶) 从外网访问
⚠️ 极大的安全警告: 将 Jupyter Notebook 直接暴露在公网上有很大的安全风险。任何人都有可能尝试破解你的密码。请确保你设置了极其复杂的密码,并考虑使用 SSH 隧道等更安全的方法。
如果你仍然想这样做,你需要进行端口转发 (Port Forwarding) 设置。
-
完成 Part 1 的所有步骤。
-
登录你的路由器管理界面。通常是在浏览器访问
192.168.1.1
或192.168.0.1
。 -
在路由器设置中找到 “端口转发”、“虚拟服务器” 或 “Port Forwarding” 等选项。
-
添加一条新的转发规则:
- 外部端口 (External Port): 你希望从外网访问的端口,比如
8888
。 - 内部端口 (Internal Port):
8888
(与 Jupyter 监听的端口一致)。 - 内部 IP 地址 (Internal IP Address): 填写你 Windows 主机的局域网 IP 地址 (例如
192.168.1.105
)。 - 协议 (Protocol):
TCP
。 - 保存规则。
- 外部端口 (External Port): 你希望从外网访问的端口,比如
-
获取你的公网 IP 地址。在浏览器中访问
whatismyip.com
或直接搜索 “my ip”。 -
现在,你可以从任何地方,通过
http://<你的公网IP地址>:8888
来访问你的 Jupyter Notebook了。
更安全的替代方案: 使用 SSH 隧道是比直接端口转发安全得多的方法。它会将远程端口安全地映射到你的本地机器上,所有流量都经过加密。这需要你在 Windows 上开启 SSH 服务器,配置稍微复杂一些,但安全性大大提高。