You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法通过端口转发从外部主机访问Docker容器的8080端口

无法通过端口转发从外部主机访问Docker容器的8080端口

看起来你的问题有点棘手,不过咱们一步步拆解排查:

首先先明确已知条件:同内网主机能正常访问容器的8080端口,主机非容器端口的转发也没问题,说明路由器的转发配置本身大概率是正常的,问题应该出在Docker网络配置或者主机防火墙规则上。

下面是具体的排查步骤:

1. 检查容器内服务的监听地址

这是最容易踩的坑!如果容器里的SRS服务只绑定了127.0.0.1,那即使主机做了端口映射,也只能在容器内部或主机本地访问,外网/其他内网主机根本连不上。

你可以进入容器内部,执行命令查看端口监听情况:

docker exec -it srs2 netstat -tulpn | grep 8080

如果输出里的地址是127.0.0.1:8080,那就要修改SRS的配置文件,把监听地址改成0.0.0.0,然后重启容器。

2. 排查主机防火墙规则

Docker会自动添加iptables规则来允许端口映射的流量,但有时候主机的防火墙(比如ufw、firewalld)可能会拦截这些流量,或者规则顺序有问题。

  • 如果你用的是ufw,可以先临时关闭测试:
    sudo ufw disable
    
    要是能正常访问了,就说明是ufw的规则问题,需要添加允许8080端口的规则:
    sudo ufw allow 8080/tcp
    sudo ufw enable
    
  • 如果是firewalld,同样先临时关闭测试:
    sudo systemctl stop firewalld
    
    能通的话就添加规则并重启服务:
    sudo firewall-cmd --add-port=8080/tcp --permanent
    sudo firewall-cmd --reload
    sudo systemctl start firewalld
    

3. 验证Docker的端口绑定范围

你的启动命令里-p 8080:8080默认是绑定主机的所有网卡(0.0.0.0),但也可以手动确认一下:

netstat -tulpn | grep 8080

如果输出里的地址是0.0.0.0:8080,说明绑定没问题;如果是127.0.0.1:8080,那就要修改启动命令,明确指定绑定所有网卡:

docker run --restart always --name srs2 -d -p 0.0.0.0:1935:1935 -p 0.0.0.0:1985:1985 -p 0.0.0.0:8080:8080 -p 0.0.0.0:8000:8000/udp -p 0.0.0.0:10080:10080/udp ossrs/srs:5

4. 用tcpdump抓包确认流量走向

如果上面的步骤都没问题,那可以在主机上抓包,看看外部请求是否真的到达了主机的8080端口:

sudo tcpdump -i any port 8080 -n

然后从外部主机发起访问(比如用curl http://你的公网IP:28080),观察tcpdump是否捕获到SYN包:

  • 如果没有捕获到,那可能是路由器转发的目标IP有误(虽然你说其他端口正常,但可以再核对一下主机当前的内网IP是否和路由器配置一致);
  • 如果捕获到SYN包但没有回应,那就是主机内部的问题(比如防火墙规则冲突或Docker网络配置异常)。

5. 检查Docker的iptables规则

默认bridge模式下,Docker会自动配置NAT转发规则。你可以检查相关规则是否存在:

iptables -L DOCKER -n | grep 8080

正常应该能看到类似这样的规则:

ACCEPT     tcp  --  0.0.0.0/0            172.17.0.2           tcp dpt:8080

如果没有这条规则,那可能Docker的网络配置出了问题,可以尝试重启Docker服务:

sudo systemctl restart docker

备注:内容来源于stack exchange,提问作者I have 10 fingers

火山引擎 最新活动