本地Docker中Caddy反向代理访问checkip.amazonaws.com返回内网IP问题
问题原因与解决方案
核心原因
两个IP查询服务的客户端IP识别逻辑存在差异:
- icanhazip.com:仅依据TCP连接的源IP返回结果,也就是Caddy容器向外发起请求时的出口IP(即你的宿主机公网IP),因此能正常返回WAN IP。
- checkip.amazonaws.com:会优先读取请求中的
X-Forwarded-For头信息作为返回值;只有当该头不存在时,才会使用TCP连接的源IP。
你使用的Caddy反向代理命令(caddy reverse-proxy)默认会自动添加X-Forwarded-For头,值为客户端访问代理时的IP——当你从宿主机访问localhost:7002时,Caddy容器接收到的客户端IP是Docker桥接网络的内网IP(比如172.17.0.1这类网关IP,或是容器自身的内网IP),因此AWS服务返回了这个内网IP。
解决方案
要让AWS的checkip服务返回你的公网IP,需要让Caddy在转发请求时移除X-Forwarded-For头。由于命令行方式无法直接修改这个默认行为,改用Caddyfile配置:
- 创建一个
Caddyfile文件,内容如下:
:80 { reverse_proxy http://checkip.amazonaws.com:80 { # 移除请求中的X-Forwarded-For头 header_up -X-Forwarded-For # 替换Host头为目标服务的Host(等价于命令行的--change-host-header) header_up Host {upstream_hostport} } }
- 运行Docker容器时挂载这个Caddyfile:
docker run -it --rm -p 7002:80 -v $(pwd)/Caddyfile:/etc/caddy/Caddyfile caddy
此时再访问localhost:7002,就能得到正确的公网IP了。
内容的提问来源于stack exchange,提问作者Xavi Montero
相关产品推荐
相关产品推荐

