onlyoffice關閉JWT后依然報錯如何解決?
一、部署方式
我是以docker方式部署的,直接通過環境變量禁用了JWT,命令如下:
docker run -d \--name onlyoffice-no-jwt \--restart=always \-p 8069:80 \-e JWT_ENABLED=false \onlyoffice/documentserver:8.3.3
二、問題描述
部署成功后能正常訪問,但是運行官方示例時,新建文件時報錯。
報錯內容如下:
第一個是 Warning
The document could not be saved. Please check connection settings or contact your administrator.
When you click the ‘OK’ button, you will be prompted to download the document.
第二個是 Error
Download failed.
Press “OK” to return to document list
三、問題原因
1.JWT 禁用與私有IP限制沖突
- 雖然通過 -e JWT_ENABLED=false禁用了JWT驗證,但OnlyOffice 8.3.3版本默認會阻止私有IP訪問。當測試頁面嘗試創建文件時,后端服務可能因私有IP限制而拒絕連接。
- 典型錯誤日志:Error: DNS lookup xxx.xxx.xxx.xx(family:undefined, host:undefined) is not allowed. Because, It is private IP address。
2. JWT 和私有IP限制的關系
- JWT 的作用:JWT 是 ONLYOFFICE 的安全機制,用于驗證請求的合法性,防止未經授權的訪問。
- 私有IP限制:ONLYOFFICE 默認會阻止私有IP(如192.168.x.x、172.16.x.x、10.x.x.x)的訪問,這是為了防止SSRF(服務器端請求偽造)攻擊。
關鍵點:
-
如果啟用 JWT:ONLYOFFICE 會信任經過 JWT 簽名的請求,即使目標地址是私有IP,也不會阻止訪問。
-
如果禁用 JWT:ONLYOFFICE 會嚴格檢查請求的目標IP,如果是私有IP,就會拒絕訪問,并報錯:
Error: DNS lookup 192.168.x.x is not allowed. Because, It is private IP address.
3. 為什么禁用 JWT 會導致私有IP被阻止?
ONLYOFFICE 的設計邏輯是:
- 啟用 JWT:認為請求是安全的(因為經過了簽名驗證),所以允許訪問私有IP。
- 禁用 JWT:認為請求可能不安全,因此強制啟用私有IP過濾,防止惡意請求。
換句話說:
- 不禁用 JWT → 私有IP 可以 訪問(因為請求受信任)。
- 禁用 JWT → 私有IP 不能 訪問(因為安全策略生效)。
四、解決方法
如果你 必須禁用 JWT,同時又要允許私有IP訪問,可以修改 default.json
配置文件:
"request-filtering-agent": {"allowPrivateIPAddress": true,"allowMetaIPAddress": true
}
修改方法
- 方法1:因為容器內沒有vim 所以使用 sed 命令直接修改容器內的配置文件default.json
docker exec -it 容器名 /bin/sh -c 'sed -i "s/\"allowPrivateIPAddress\": false/\"allowPrivateIPAddress\": true/g" /etc/onlyoffice/documentserver/default.json'
docker exec -it 容器名 /bin/sh -c 'sed -i "s/\"allowMetaIPAddress\": false/\"allowMetaIPAddress\": true/g" /etc/onlyoffice/documentserver/default.json'
- 方法2:通過宿主機修改后復制回容器
將配置文件復制到宿主機:
docker cp 容器名:/etc/onlyoffice/documentserver/default.json ./default.json
在宿主機用任意編輯器修改文件,添加或修改以下內容:
"request-filtering-agent": {"allowPrivateIPAddress": true,"allowMetaIPAddress": true
}
復制回容器并重啟ONLYOFFICE容器:
docker cp ./default.json 容器名:/etc/onlyoffice/documentserver/default.json
docker restart 容器名
或進入容器內執行下面的命令 。
supervisorctl restart all
這樣雖然能解決問題,但官方 不建議 這樣做,因為這會降低安全性 。更好的做法是:
內執行下面的命令 。
supervisorctl restart all
這樣雖然能解決問題,但官方 不建議 這樣做,因為這會降低安全性 。更好的做法是:
- 啟用 JWT(更安全)。
- 如果必須用私有IP,可以搭配域名解析(如修改/etc/hosts或使用內網DNS)。