Dubbo 服务运行在 Docker 容器中,修复漏洞方法如下
结合你提供的截图信息,你的服务器 IP 是 169.169.39.135,且 Dubbo 服务运行在 Docker 容器中,端口映射为 0.0.0.0:20817->20817。
这意味着 20817 端口直接绑定在宿主机的所有网卡上(0.0.0.0)并暴露给了公网,这就是漏洞产生的原因。
以下是针对你当前环境(Docker + Linux)的具体修复步骤:
方法一:修改 Docker 端口绑定(最快修复,无需改代码)
既然 Dubbo 服务只需要内部调用,不需要从公网直接访问,我们可以修改 Docker 的端口映射,让 20817 端口只监听本地回环地址(127.0.0.1),或者直接不映射到宿主机。
操作步骤:
- 找到你的
docker-compose.yml文件。 - 找到
rurl-model-proxy-server这个服务的ports配置部分。 - 将
20817:20817修改为127.0.0.1:20817:20817。
修改前:
ports:
- "20817:20817"
- "8041:8090"
修改后:
ports:
- "127.0.0.1:20817:20817" # 加上 127.0.0.1 限制
- "8041:8090"
效果: 修改后,外部网络(包括你的公网 IP 169.169.39.135)将无法访问 20817 端口,只有服务器本机可以访问。
重启服务:
docker-compose down
docker-compose up -d
方法二:配置服务器防火墙(iptables)
如果你不想修改 Docker 配置,或者修改后仍希望特定内网 IP 能访问,可以使用防火墙策略。
目标: 禁止公网访问 20817,但允许本机或特定内网访问。
执行命令(在宿主机上执行):
-
拒绝外部访问 20817:
# 拒绝所有外部 IP 访问 TCP 20817 端口 iptables -I INPUT -p tcp --dport 20817 ! -s 127.0.0.1 -j DROP(注意:如果你的应用服务器在其他机器上,比如 192.168.x.x,需要把
! -s 127.0.0.1改为-s 192.168.x.x或者添加一条允许规则) -
保存规则(防止重启失效):
service iptables save # 或者根据你的系统 iptables-save > /etc/iptables/rules.v4
方法三:Dubbo 内部配置(彻底禁用 Telnet)
这是最安全的做法,即使端口暴露了,黑客也无法通过 Telnet 执行命令。
操作步骤:
- 进入容器内部或修改你的项目配置文件(
application.yml或dubbo.properties)。 - 禁用 Telnet 命令支持。
如果你使用的是 Spring Boot 配置 (application.yml),在 rurl-model-proxy-server 的配置中添加:
dubbo:
protocol:
name: dubbo
port: 20817
# 关键点:设置为 false 或空,禁用 telnet
telnet: false
或者在 dubbo.properties 中:
dubbo.protocol.telnet=false
修改后重启容器:
docker-compose restart rurl-model-proxy-server
验证修复结果
修复完成后,请在你的本地电脑(非服务器内部)使用 telnet 测试:
telnet 169.169.39.135 20817
- 修复成功: 连接超时(Connection timed out)或连接被拒绝(Connection refused)。
- 修复失败: 屏幕变黑或出现
Connected to...字样。
建议优先采用“方法一”或“方法二”,因为这是基础设施层面的防护,最快生效。
No Comments