docker-compose跨容器HTTP RPC连接geth报403 Forbidden问题咨询
问题原因
跨容器访问报403和Docker网络连通性无关:
- 现有
docker-compose.yml的links配置已经能让web服务正常解析ethereum服务地址,宿主机能通过localhost:8545访问也证明Geth进程、端口映射都正常。 - 403是Geth默认的HTTP RPC安全拦截导致:
--http.addr 0.0.0.0仅控制Geth监听所有网卡地址,默认配置下Geth只允许Host头为localhost的请求访问RPC接口,跨容器访问时请求的Host头是ethereum:8545,来源IP也是Docker内网网段地址,不在默认白名单内,因此被拦截返回403。
修复方法
修改Geth启动参数,放开虚拟主机访问限制即可:
- 在启动命令中添加
--http.vhosts "*"参数,允许所有Host头的请求访问RPC接口 - 如果存在浏览器端直接调用RPC的场景,额外添加
--http.corsdomain "*"放开跨域限制,纯服务端调用可以不加。
修改后的Dockerfile CMD配置如下:
CMD ["geth", "--datadir", "node02", "--port", "30303", "--nodiscover", "--http", "--http.api", "eth,net,web3,admin", "--http.addr", "0.0.0.0", "--http.vhosts", "*", "--http.corsdomain", "*", "--networkid", "1900"]
额外配置建议
links是Docker早期版本的遗留配置,当前版本Compose默认会为所有服务创建共享网桥,服务名可直接做DNS解析,不需要额外配置links。- 如果不需要从宿主机以外的外部环境直接访问Geth RPC,可以删除
docker-compose.yml中ethereum服务的8545:8545端口映射,避免RPC端口暴露到公网引发安全风险。
修改完成后重新构建ethereum镜像、重启compose服务栈即可正常跨容器访问RPC接口。
内容的提问来源于stack exchange,提问作者Christophe Ramananjaona
相关产品推荐
相关产品推荐

