使用Traefik与nip.io暴露应用时出现404错误的求助
我来帮你分析下这个问题——从你给出的curl输出和环境差异来看,核心问题大概率出在IPv4/IPv6的监听配置或者Fedora系统的网络/防火墙设置上,咱们一步步拆解:
先看关键差异点
对比两次curl的输出,你会发现一个容易忽略的细节:
- 直接请求
whoami.127.0.0.1.nip.io时,curl连接的是IPv4地址127.0.0.1 - 手动指定Host头请求
localhost时,curl连接的是IPv6地址::1
而Traefik的路由规则本身是正常的(不然第二次请求不会成功),所以问题出在「IPv4请求到达Traefik时的处理逻辑」上。
排查步骤与解决方案
1. 查看Traefik Debug日志,确认请求细节
你已经给Traefik开了logLevel=DEBUG,先启动容器后实时查看日志:
docker-compose logs -f traefik
然后执行curl -vvv whoami.127.0.0.1.nip.io,重点看日志里是否显示了正确的Host头,以及是否匹配到了whoami服务的frontend规则。如果Host头正确但没匹配,那大概率是Traefik的监听范围有问题。
2. 强制用IPv6测试域名访问
试试让curl强制走IPv6访问你的nip.io域名:
curl -vvv -6 whoami.127.0.0.1.nip.io
如果这次能返回200,说明Traefik默认只监听了IPv6,没正确处理IPv4请求。这时候需要调整Traefik的entrypoint配置,让它明确监听所有IP地址:
修改docker-compose里Traefik的command字段:
command: --web --docker --docker.domain=app.test --logLevel=DEBUG --entrypoints='Name:http Address:::80'
:::80表示同时监听所有IPv4和IPv6的80端口,然后重启容器:
docker-compose down && docker-compose up -d
再测试IPv4的请求应该就能正常工作了。
3. 检查Docker的IPv6配置
Fedora的Docker默认可能没启用IPv6,导致容器无法正确处理跨协议的请求?可以检查/etc/docker/daemon.json文件,如果没有就新建,添加以下内容:
{ "ipv6": true, "fixed-cidr-v6": "fd00::/80" }
然后重启Docker服务:
sudo systemctl restart docker
再重启你的Traefik容器测试。
4. 检查Firewalld的Masquerade设置
Docker的端口转发依赖firewalld的masquerade规则,Fedora默认可能没开这个?执行以下命令检查:
sudo firewall-cmd --query-masquerade
如果返回no,就开启它:
sudo firewall-cmd --add-masquerade --permanent sudo firewall-cmd --reload
这一步能解决很多Docker端口转发的隐性问题。
5. 临时切换到Host网络模式测试
如果上面的步骤都没解决,可以临时给Traefik加上network_mode: host,让它直接使用主机网络:
traefik: image: traefik:1.7-alpine command: --web --docker --docker.domain=app.test --logLevel=DEBUG ports: - 80:80 - 8080:8080 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro network_mode: host
重启容器后测试,如果能正常访问,说明是Docker桥接网络在Fedora上的配置问题,你可以再针对性调整桥接网络的设置。
为什么其他系统没问题?
Mac和Ubuntu的Docker默认配置(比如IPv6启用、防火墙规则)和Fedora不一样:Ubuntu默认用ufw而非firewalld,Mac的Docker网络栈本身做了更多兼容处理,所以不会遇到这个问题。
内容的提问来源于stack exchange,提问作者user672009




