Featured image of post 使用 socat 讓 n8n 安全存取 Joplin API 並固定化設定

使用 socat 讓 n8n 安全存取 Joplin API 並固定化設定

說明為何使用 socat 作為本機端口轉發橋樑,讓 Docker 容器內的 n8n 能安全匯入 NocoDB 工作記錄至 Joplin,並設定為 Systemd 服務永久生效。

1. 背景說明

本文的目標是透過 n8n 自動化工作流,將 NocoDB 中的工作記錄定期匯入至 Joplin 筆記。

然而,Joplin 的 Web Clipper API 預設僅監聽本機(127.0.0.1),並未對外開放任何公開端點。若直接將 API 暴露至外部網路,將帶來資安風險。因此,採用 socat 作為本機端口轉發橋樑——讓跑在 Docker 容器內的 n8n 能夠安全地存取宿主機上的 Joplin API,同時不必對外開放任何防火牆規則。

joplin 開啟網頁擷取


2. 使用 socat 建立連線橋樑(推薦,維持 Bridge 模式)

這是在不犧牲安全性的前提下最標準的做法。在 Ubuntu 宿主機上建立一個轉發器,將來自 Docker 網路的連線請求橋接至 Joplin 本機監聽的端口。

2.1. 安裝並測試

在 Ubuntu 宿主機上執行以下指令,安裝 socat 並進行初步測試:

sudo apt update && sudo apt install socat -y

# 臨時啟動轉發:將宿主機的 41185 端口轉發至 Joplin 監聽的 41184
socat TCP-LISTEN:41185,reuseaddr,fork TCP:127.0.0.1:41184 &

此時可在 n8n 中試打 API,確認轉發是否正常運作。

2.2. 修改 n8n 工作流程

在 n8n 的 HTTP Request 節點中,將目標 URL 改為透過轉發端口存取:

http://host.docker.internal:41185/notes/186b21936e6a4ba29e700c5ad9865ac8

host.docker.internal 是 Docker 容器存取宿主機的特殊域名;端口改為 41185(socat 監聽的轉發端口)。

n8n 轉發埠口

2.3. 設定為系統服務(永久生效)

上述臨時指令在重開機後會失效。為確保服務持續運行,將其設定為 Systemd 系統服務:

sudo nano /etc/systemd/system/joplin-proxy.service

貼入以下內容:

[Unit]
Description=Joplin API Proxy for Docker
After=network.target

[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:41185,reuseaddr,fork TCP:127.0.0.1:41184
Restart=always
User=root

[Install]
WantedBy=multi-user.target

儲存後,啟用並啟動服務:

sudo systemctl enable --now joplin-proxy.service

2.4. 配置防火牆安全策略

2.4.1. 查詢 Docker 內部網路網段

在宿主機執行以下指令,確認 Docker 預設網橋(docker0)的 IP 位址:

ip addr show docker0 | grep "inet "

通常輸出的結果會類似 inet 172.17.0.1/16 ...,這代表 Docker 容器的內部網段是 172.17.0.0/16

2.4.2. 設定 UFW 規則

不建議直接使用 sudo ufw allow 41185,因為這會對全世界開放該埠口。請依照以下步驟精確授權:

# 變數設定:請根據上方查詢結果修改 DOCKER_NET 變數
DOCKER_NET="172.17.0.0/16" 

# 僅允許來自 Docker 內部網段的流量存取 41185 埠口
sudo ufw allow from $DOCKER_NET to any port 41185 comment 'Allow n8n Docker to Joplin Proxy'

# 重新載入防火牆設定
sudo ufw reload

2.4.3. 驗證防火牆狀態

執行以下指令確認規則是否生效:

sudo ufw status numbered

你應該會看到類似下方的輸出,確保 41185 埠口的來源(From)被限制在 Docker 的私有網段:

埠口動作來源
41185ALLOW IN172.17.0.0/16