以下給出一套可靠做法:通過 SSH 本地端口轉發 (-L) 把 Ubuntu 雲服務器上的 Jupyter 安全映射到你本地瀏覽器,僅暴露到 127.0.0.1,避免公網直連。核心要點:<span style="color:red">只監聽 127.0.0.1、只放通 22 端口、使用密鑰與密碼(或 token)雙保護</span>。🔒
一、在雲服務器啓動 Jupyter(僅本地迴環)
# 1) 基礎環境(Ubuntu)
sudo apt update && sudo apt -y install python3-venv python3-pip
# 2) 建虛擬環境並安裝 JupyterLab
python3 -m venv ~/py310 && source ~/py310/bin/activate
pip install --upgrade pip && pip install jupyterlab
# 3) 生成訪問密碼(可選,亦可用默認token)
python -c "from jupyter_server.auth import passwd; print(passwd())"
# 輸出形如:sha1:xxxx... 複製備用
# 4) 啓動(僅監聽迴環)
jupyter lab --no-browser --ip=127.0.0.1 --port=8888
解釋:
apt安裝 Python 組件;venv隔離環境,避免系統依賴污染。jupyterlab為新版界面;也兼容舊notebook。- 第 3 步得到的
sha1:...是密碼散列;啓動時也可用--ServerApp.password='sha1:...'顯式指定。 --ip=127.0.0.1表示 <span style="color:red">僅本機迴環</span>,外網無法直接訪問;--no-browser不在服務器彈瀏覽器。
生產更穩妥的啓動方式(替代第 4 步):
jupyter lab --no-browser --ip=127.0.0.1 --port=8888 \
--ServerApp.password='sha1:你的散列'
**解釋:**強制使用你設置的密碼;與一次性 token 並行存在更安全。🔑
二、從本地建立 SSH 隧道並訪問
macOS / Linux 終端
ssh -N -L 8888:127.0.0.1:8888 ubuntu@你的雲服務器IP -i ~/.ssh/id_rsa
解釋:
-L 8888:127.0.0.1:8888將 本地 8888 映射到 遠端 127.0.0.1:8888;-N僅建隧道不執行遠端命令;-i指定私鑰;用户一般為ubuntu或你自定義用户。- 成功後在本地瀏覽器打開
http://127.0.0.1:8888,輸入 token 或密碼即可。
Windows PowerShell(OpenSSH 同法)
ssh -N -L 8888:127.0.0.1:8888 ubuntu@你的雲服務器IP
**解釋:**Windows 10+ 自帶 OpenSSH 客户端,用法一致。若使用 GUI 工具,參數亦是“Source 8888 / Destination 127.0.0.1:8888”。
經跳板機(堡壘機)ProxyJump
ssh -J bastion_user@跳板機IP ubuntu@目標雲服務器IP -N -L 8888:127.0.0.1:8888
解釋:-J 表示通過跳板機轉發;<span style="color:red">無需在跳板機開放 8888</span>,安全邊界更清晰。
三、可選:systemd 常駐運行(雲服務器)
# 假設用户 ubuntu,虛擬環境在 /home/ubuntu/py310
sudo tee /etc/systemd/system/jupyter.service >/dev/null <<'UNIT'
[Unit]
Description=Jupyter Lab (local-only)
After=network-online.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/home/ubuntu/py310/bin/jupyter lab --no-browser --ip=127.0.0.1 --port=8888 \
--ServerApp.password='sha1:你的散列'
Restart=on-failure
[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable --now jupyter
sudo systemctl status jupyter --no-pager
解釋:
- 作為服務隨系統啓動;失敗自動重啓;仍然只監聽 <span style="color:red">127.0.0.1</span>。
- 請將
User、路徑與密碼散列替換為你的實際值。
四、安全與防火牆設置(雲服務器)
# UFW 示例:只放通 SSH
sudo ufw allow 22/tcp
sudo ufw deny 8888/tcp
sudo ufw enable
**解釋:**只開放 SSH 端口,<span style="color:red">拒絕直接對外開放 8888</span>;Jupyter 僅通過隧道訪問。
若使用 sshd_config:確保 AllowTcpForwarding yes(默認即為 yes),GatewayPorts no 以防外網綁定。
五、常見故障速查
| 現象 | 可能原因 | 處理 |
|---|---|---|
| 瀏覽器打不開 | 本地 8888 被佔用 | 改用 -L 8899:127.0.0.1:8888 並訪問 127.0.0.1:8899 |
| “connect failed: Connection refused” | 服務器未在 127.0.0.1:8888 監聽 | 重新啓動 Jupyter,確認 --ip=127.0.0.1 --port=8888 |
| 一直斷開 | SSH 會話被回收 | 增加 ServerAliveInterval 60;或保持終端前台運行 |
| 密碼無效 | 散列未生效/粘貼錯 | 用 token 登錄,登錄後在設置中重置密碼;或更新 systemd 配置並重啓 |
模式對比表(選型建議)
| 轉發模式 | 命令示例 | 特點 | 何時使用 |
|---|---|---|---|
| <span style="color:red">本地轉發 -L</span> | ssh -L 本地端口:127.0.0.1:遠端端口 |
僅本機可見,安全 | ⭐ Jupyter 常規訪問 |
| 遠程轉發 -R | ssh -R 遠端端口:127.0.0.1:本地端口 |
把你本地服務暴露給遠端 | 遠端需回訪你本地 |
| 動態代理 -D | ssh -D 本地端口 |
SOCKS5 代理,靈活 | 需要多站點代理時 |
工作流程(vditor/Markdown)
關鍵原則總結
- <span style="color:red">只監聽 127.0.0.1</span>、<span style="color:red">只開放 22</span>、<span style="color:red">使用密鑰 + 密碼/Token</span>;
- 隧道斷開即訪問失效,符合“最小可見面”安全原則 😊;
- 需要團隊訪問時,建議跳板機 + 細粒度賬號授權,切勿對公網直接放開 8888。🚀
以上步驟與命令均為當前環境通用做法,兼顧安全與可維護性;每段代碼均附有解釋,可直接按順序執行與驗證。