Docker Compose中Django应用遭Docker IP暴力URL请求排查求助
预发布环境大量绕开Traefik的404请求排查分析
问题背景
- 基于cookiecutter-django搭建Docker Compose部署环境,部署在Vultr VPS作为预发布环境
- 采用Traefik做反向代理,Mailjet+Anymail提供邮件告警服务
- 异常表现:近3天每日收到数百条404错误邮件,请求路径均为通用框架默认路径(如/login、/Home/Login、/static/style.css);请求来源IP为172.19.0.8,而项目容器使用172.20.0.X网段;这些请求未经过Traefik,导致Traefik配置的RateLimit中间件完全无效;Django默认DEBUG级别日志未记录此类请求
可能的原因及排查方向
1. Docker网络跨网段访问
- VPS上可能存在其他Docker项目/独立容器使用了172.19.0.0/16网段,这些容器可通过Docker默认网桥或自定义网桥直接访问你的Django容器端口(如8000),完全绕开Traefik。
- 排查命令:
- 列出所有Docker网桥:
docker network ls - 查看指定网桥的网段和关联容器:
docker inspect <网桥名称> - 定位172.19.0.8所属容器:
docker ps --filter "ip=172.19.0.8"
- 列出所有Docker网桥:
2. Django容器端口错误暴露
- 检查Docker Compose配置中,Django服务是否直接将端口映射到VPS公网IP(如
ports: - "8000:8000"),而非仅在Traefik专属网桥内暴露。若直接映射公网端口,外部扫描器/爬虫可直接访问该端口,无需经过Traefik。 - 正确配置应该是:Django服务仅加入Traefik的自定义网桥,不配置
ports字段对外暴露端口,仅允许Traefik转发请求。
3. VPS防火墙规则漏洞
- 检查VPS防火墙(如ufw、iptables)是否未限制外部对Django容器端口(如8000)的访问,仅开放了Traefik的80/443端口。若防火墙规则疏漏,外部请求可直接绕过Traefik访问Django端口。
- 排查命令(以ufw为例):
ufw status,确认是否有允许8000端口的规则,若有则删除。
4. 内部容器异常扫描行为
- 172.19.0.8属于VPS本地的其他容器,可能是该容器被植入恶意扫描程序,或是你之前部署的测试/监控工具在自动扫描通用Web路径。
- 定位到该容器后,检查其镜像来源、运行命令、日志,确认是否存在异常行为,必要时停止或删除该容器。
5. Django日志配置缺失
- Django默认在
DEBUG=False时不会记录完整的访问日志,导致你无法看到这些请求的详细信息。可修改settings.py中的LOGGING配置,开启访问日志记录:
配置后可在日志中看到请求的来源IP、路径、状态码等关键信息,进一步定位问题。LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'access_file': { 'level': 'INFO', 'class': 'logging.FileHandler', 'filename': '/var/log/django/access.log', 'formatter': 'verbose', }, }, 'formatters': { 'verbose': { 'format': '{levelname} {asctime} {module} {remote_addr} {path_info} {status_code}', 'style': '{', }, }, 'loggers': { 'django.request': { 'handlers': ['access_file'], 'level': 'INFO', 'propagate': False, }, }, }
内容的提问来源于stack exchange,提问作者Mikhail Skorikov
相关产品推荐
相关产品推荐

