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)。