防火墙拦截Docker云手机外网访问怎么解决|Redroid容器端口不通排查方案

作者:六边云     发布于:2026-10-16 11:16:09

很多人搭建Redroid这Docker云手机的时候,会遇到一个很迷惑的现象:在宿主机本机、局域网里面访问云手机投屏、ADB端口一切正常,换到外网连接直接超时或者拒绝连接。反复核对docker run的端口映射,容器状态也正常,折腾半天最后才发现,流量被防火墙拦截。

这里要区分两层防护:Linux 系统自带的 firewalld/ufw 本地防火墙,还有云服务器后台的安全组。两个地方任意一处没放行端口,外网都无法接入。

如果不想手动折腾防火墙、端口转发、内核模块这些繁杂配置,六边云手机本身就是 Docker 架构成品云手机,网络策略提前配置完成,开箱即可远程访问,省去大量网络排错时间。

下面从定位问题、分步修复,再到长期安全方案完整梳理。

一、先定位:确认是不是防火墙导致的拦截

先做一个快速验证,判断故障来源。临时关闭防火墙,测试外网能否访问(仅用于测试,测试完成务必重新开启防火墙)

```

# CentOS/RHEL firewalld

systemctl stop firewalld

# Ubuntu ufw

ufw disable

```

关闭防火墙之后,外网能够正常连接云手机,说明问题锁定在防火墙规则;依旧无法访问,需要检查云厂商安全组、容器监听地址(是否绑定 127.0.0.1)、容器内部 adbd / 投屏服务状态。

高频踩坑:容器内部服务监听地址写死`127.0.0.1`,就算防火墙全开,外网依旧连不上。Redroid 容器内服务必须监听`0.0.0.0`。

```

查看宿主机端口监听状态,替换成你的映射端口

ss -lntp | grep 15555

```

二、firewalld(CentOS/RHEL 系统)配置放行

firewalld 和 Docker 的 iptables 机制存在冲突,单纯开放端口经常无效,不仅要放行端口,还需要开启 IP 转发,把 docker0 网卡加入可信区域。

以 Redroid 常用 ADB 端口 15555 为例:

```

1.放行宿主机映射端口,永久生效

firewall-cmd --permanent --add-port=15555/tcp

2.开启IP伪装,允许NAT流量转发

firewall-cmd --permanent --add-masquerade

3.将docker0网卡加入信任域

firewall-cmd --permanent --zone=trusted --change-interface=docker0

重载防火墙,使规则生效

firewall-cmd --reload

```

修改完成,重启 Docker 服务,让网络规则加载:

```

systemctl restart docker

```

补充说明:Docker会直接操作 iptables,firewalld 重启之后会覆盖 Docker 转发规则,导致外网突然断连。如果频繁出现这个问题,可以修改 docker daemon 配置`/etc/docker/daemon.json`,设置`"iptables":false`,让 Docker 不再自动修改 iptables,全部交给 firewalld 统一管控。

缺点:需要手动维护全部转发规则,运维复杂度更高,适合熟悉 Linux 网络的用户。

三、UFW 防火墙(Ubuntu/debian 系统)放行方案

UFW 默认会阻断 Docker 转发流量,简单执行`ufw allow 端口`经常无效。因为 Docker 的 NAT 转发数据包,经过 DNAT 转换之后目标 IP 变成容器内网 IP,ufw INPUT 规则无法匹配,需要配置 route 转发规则。

```

# 放行到容器子网的路由转发,示例容器网段172.17.0.0/16

ufw route allow proto tcp from any to 172.17.0.0/16 port 5555

ufw reload

```

简单方案推荐使用 ufw-docker 工具,自动适配 ufw 和 Docker 的转发逻辑,不用手动写复杂 route 规则。

四、云服务器安全组,别忽略这一层

很多新手只配置宿主机防火墙,忘记云厂商控制台的安全组。阿里云、腾讯云、华为云 VPS,安全组是外层第一道防火墙,即使宿主机防火墙全开,安全组没放行 TCP 端口,外网流量依旧被拦截。

操作要点:

1. 登录云服务器控制台,进入安全组配置页面;

2. 添加入站规则,协议 TCP,填写宿主机对外映射端口;

3. 限制源 IP(推荐),不要开放 0.0.0.0/0 全网访问,降低被扫描爆破风险,尤其是 ADB 端口。

安全提醒:ADB 端口强烈不建议直接对公网开放。ADB 协议缺少强认证,暴露公网很容易被扫描入侵。远程调试优先使用 Tailscale 异地组网、FRP 隧道。

五、安全替代方案,不直接暴露端口到公网

直接开放端口公网存在安全隐患,有两种更稳妥的远程访问方案,适合Docker云手机:

1. 异地组网Tailscale

宿主机安装 Tailscale,加入虚拟局域网,外网设备通过虚拟内网IP访问Docker云手机。不需要在防火墙开放端口,流量加密,安全性高。适合个人 APP 测试,少量远程接入。

2. 自建FRP内网穿透

有一台带公网 IP 中转 VPS,部署 frps,内网宿主机 frpc 主动建立TCP隧道,不需要在本地防火墙开放端口,适合长期多实例运行。

如果你不想折腾宿主机防火墙、安全组、隧道全套网络配置,六边云手机底层基于Docker容器,云端环境网络策略预先配置,远程投屏、ADB 调试开箱即用,不用自己处理防火墙拦截、端口转发这类网络故障。

六、完整排查顺序(推荐按这个顺序定位)

1. 检查容器内部服务监听地址,确认是 0.0.0.0,不是 127.0.0.1;

2. 宿主机本地访问`localhost:端口`,验证容器服务正常运行;

3. 临时关闭宿主机防火墙,外网测试,确认是否是防火墙拦截;

4. 配置 firewalld/ufw 放行端口、IP 转发;

5. 登录云厂商后台,安全组添加入站端口规则;

6. 重启 docker,重新启动云手机容器;

7. 依旧不通,检查 SELinux,部分系统 SELinux 策略会拦截转发流量。

七、常见踩坑总结

1. 只放行 INPUT 链端口,没有开启 IP 转发。Docker 流量走 FORWARD 转发链,单纯放行 INPUT 不生效;

2. 重启 firewalld 之后 Docker 外网直接失效,是 firewalld 覆盖 iptables 导致;

3. 端口映射宿主机端口和容器端口混淆,开放了容器内部端口,没有开放宿主机映射端口;

4. 开放端口之后,忘记 reload 防火墙,规则不会加载;

5. ADB 直接公网暴露,带来服务器安全风险。

总结

Docker 云手机外网访问被防火墙拦截,不是单一的端口放行问题,核心是 Docker NAT 转发和系统防火墙的工作机制冲突。内网正常外网不通,优先排查宿主机防火墙 IP 转发、云平台安全组两层防护。

自建 Redroid 虽然自由度高,但是防火墙、网络转发、内核模块整套运维工作繁琐。如果你的需求只是稳定的 Docker 安卓容器用于 APP 兼容性测试,可以考虑成品方案,省去网络排错的大量时间。