動態

詳情 返回 返回

藍易雲:使用SSH隧道將Ubuntu雲服務器Jupyter Notebook端口映射到本地 - 動態 詳情

以下給出一套可靠做法:通過 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)

flowchart LR
A[本地瀏覽器 http://127.0.0.1:8888]-->B(SSH 本地轉發 -L)
B-->C[雲服務器 127.0.0.1:8888]
C-->D[JupyterLab/Notebook 內核]

關鍵原則總結

  • <span style="color:red">只監聽 127.0.0.1</span>、<span style="color:red">只開放 22</span>、<span style="color:red">使用密鑰 + 密碼/Token</span>;
  • 隧道斷開即訪問失效,符合“最小可見面”安全原則 😊;
  • 需要團隊訪問時,建議跳板機 + 細粒度賬號授權,切勿對公網直接放開 8888。🚀

以上步驟與命令均為當前環境通用做法,兼顧安全與可維護性;每段代碼均附有解釋,可直接按順序執行與驗證。

user avatar greatsql 頭像 hzyopsfuture 頭像 wenzhibinbinderiguangdeng 頭像
點贊 3 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.