You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.04服务器Docker容器24小时后无法外部访问问题

问题定位与解决方案

核心现象

Ubuntu 20.04服务器上运行Docker容器,重启后外部可正常访问,但约24小时后外部访问超时,主机本地访问容器映射端口(192.168.1.2:8001)正常,容器服务本身无异常。

排查方向与解决步骤

1. 清理流量控制链的阻断规则

从提供的iptables -L输出看,存在ts-input和ts-forward链,这类链通常和流量控制、第三方网络管理工具相关,24小时后可能自动更新规则阻断了外部流量。

  • 临时验证(问题复现时执行):

    iptables -F ts-input
    iptables -F ts-forward
    

    如果外部访问恢复,说明是ts链的规则导致阻断。

  • 永久放行目标端口:

    # 放行外部到主机8001端口的流量
    iptables -I ts-input -p tcp --dport 8001 -j ACCEPT
    # 放行主机到容器80端口的转发流量
    iptables -I ts-forward -p tcp --dport 80 -d 172.17.0.2 -j ACCEPT
    # 保存规则
    netfilter-persistent save
    

2. 防止Docker转发规则被UFW覆盖

若服务器启用了UFW,其默认规则可能会重置Docker的端口转发规则:

  • 允许8001端口流量:
    ufw allow 8001/tcp
    ufw reload
    
  • 禁止UFW干扰Docker规则:编辑/etc/ufw/after.rules,添加以下内容后重启UFW:
    # 保留Docker默认规则链
    *filter
    :DOCKER-USER - [0:0]
    :DOCKER-ISOLATION-STAGE-1 - [0:0]
    :DOCKER-ISOLATION-STAGE-2 - [0:0]
    :DOCKER - [0:0]
    -A DOCKER-USER -j RETURN
    COMMIT
    
    ufw reload
    

3. 锁定Docker的iptables配置

修改Docker守护进程配置,确保其转发规则不会被其他服务篡改:

  • 编辑/etc/docker/daemon.json(不存在则创建):
    {
      "iptables": true,
      "ip-masq": true
    }
    
  • 重启Docker服务:
    systemctl restart docker
    

4. 扩大连接跟踪表容量

24小时后连接跟踪表(conntrack)可能被占满,导致新连接无法建立:

  • 查看当前连接数与最大限制:
    conntrack -L | wc -l
    sysctl net.netfilter.nf_conntrack_max
    
  • 临时调整最大值:
    sysctl -w net.netfilter.nf_conntrack_max=1048576
    
  • 永久生效:编辑/etc/sysctl.conf,添加net.netfilter.nf_conntrack_max=1048576,执行sysctl -p应用配置。

5. 用host网络模式验证

临时切换到host网络模式启动容器,排除bridge模式的转发问题:

docker run --name nginx_test_host --network host -d nginx

外部访问192.168.1.2:80,观察24小时后是否仍出现故障。若正常,说明问题集中在bridge模式的iptables转发规则上。


内容的提问来源于stack exchange,提问作者David Martinez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:15:57