Margrop
Articles243
Tags633
Categories6

Categories

1password 24GB VRAM 2K 3.6 Flash 30B dense 4-bit 量化 6-DoF SLAM AC ACP AI Agent AI Coding Assistant AI Tech AI tutor AI 安全 AI 应用 AI 日记 AI编程助手 ALTK-Evolve AMIE AP API API 定价 API 降价 ARC-AGI-3 ASR ATEM chat 模板 Agent Agent Harness Agent Memory Agent 入侵 Agent 工程 Agent 架构 Agent 检索 Agent 沙箱 Agent 系统 Agent 路由 Agentic AI Agentic tools Ai2 Alertmanager AllenAI Android 17 Antigravity AppDaemon AppWorld Aqara Astra Attention Baseten Benchmark CC-Switch CI/CD CLI Tools CLI工具 CPU 推理 Cache Hit Rate Caddy ChatGPT Claude Code Claude Sonnet ClawLoader Code Interpreter Codex ComfyUI Computer Use Cookie 认证 Cosmos-H-Dreams Cost Optimization Cron DFIR DSpark Date DeepSeek DeepSeek V4 Flash Diagrams.net Diary Diffusers Diffusion Docker Efficiency Tools Embedding English FSDP2 Fable 5 Fireworks AI FlashAttention FlashDreams GGUF GLM 5.2 GLM-5.2 GPT-4.1 GPT-5.6 GPT-Live GPT-Red GPU 加速 GPU 性能分析 Gateway Gemini Gemini 3.5 Flash Gemini API Gemini CLI Gemini Omni Flash Gemma 4 12B Gemma Translator Gemma4 GitHub Actions Google Google AI Google Research Google Sheets Grabette Gripette HA HADashboard HF Security Incident Hailuo Hermes Hexo HomeAssistant Hugging Face IBM Research Inference Providers Isaac Lab Java KV cache Kimi K3 Kubernetes LFM2.5 LFM2.5-VL LLM Router LVM‑Thin Late Interaction LeRobot Linux Liquid AI LiquidAI Live Translate LoRA Luna MCP MTP MacOS Magpie TTS Managed Agents Meta Microsoft 365 Copilot MiniMax Mistral Shieldstral Model Routing MuJoCo Warp Multi-Agent Multi-Vector Muse Glimmer MySQL NAS NIM NVIDIA NeMo Automodel Nemotron 3 Embed Newton Nginx Node.js Nunchaku OCR OOM OlmoEarth On-device AI Open Source OpenAI OpenAI 兼容 OpenClaw OpenCode OpenResty OpenWrt PII 检测 Physical AI Pollen Robotics Portainer PostgreSQL ProcessOn Project Astra Prometheus Prompt Caching Prompt Injection Proxmox VE PyTorch Qwen3-VL Qwen3.6 RAG RPC RTEB Real-Time Inference Red Teaming Responses API SNAP SOCKS5 SPED SVDQuant Scientific Computing Self-Forcing Distillation Sentence Transformers Session Sheets canvas Shell Sol Storage Buckets Strands Agents Subagent Surgical Robotics TTS Terra Think button TimeMachine TutorMoments UML Uptime Kuma V4-Pro VPS VoiceEQ WARP WebRTC WebSocket Windows World Foundation Model agent agentic aligenie aliyun annotation aop autofs backup bash bitwarden boot brew browser budget control centos cert certbot charles chat chrome classloader client clone closures cloudflare command commit commoditization container crontab cyber capability demo dependency deploy developer devtools dll dns docker domain download drafter draw drawio dsm dump dylib environment hooks exception fail2ban feign firewall-cmd flow free tier frontier hosted model frp frpc frps fuckgfw full-duplex function gfw git github gperftools gridea grub guardrail lockout gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https huggingface_hub iKuai iMessage image img img2kvm immortalwrt import index inference cost install intel io ios ip iptables iso java javascript jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kvm lastpass launchctl learning letsencrypt linux llama.cpp low-code lvm mac mariadb markdown maven md5 microcode mirror modules monitor mount mstsc multimodal mysql n5105 network nfs node node-red nodejs nohup notepad++ npm nssm ntp oop open weights openfeign openssl os ovz packet capture pdf pem perf pip plugin png powerbutton print pro productive struggle pve pvekclean python qcow2 qemu qemu-guest-agent rar reasoning control reasoning slider reboot reflog remote remote desktop renew repo resize retina router runtime safari sata scaffolding scheduled triggers scipy-notebook scoping scp self-play server serverless inference silent test simulated student so speculative decoding spk spring springboot springfox ssh ssl stash string support svg svn swagger sync synology systemctl systemd template terminal txt ubuntu ui undertow unlocker upgrade vLLM vhd vim vm vmdk web windows with worker xml yum zai-org/GLM-5.2 zip 上下文压缩 上下文工程 交换机 人才争夺 代理 企业 AI 优化 低延迟 供应链 健康检查 光猫 免费层 内存 内存优化 内网渗透 分布式推理 分布式训练 医疗 AI 升级 卫星影像 反向代理 反诉 向量检索 启动 告警 告警优化 地球观测 地理空间推理 复盘评测 夏令时 多 token 预测 多智能体 多模态 多模态 Agent 多语言 大厂人才战 大模型评测 天猫精灵 安全 安全事件 安装 定时任务 实时语音 客户端 SDK 容器 导入 小米 屏幕理解 工具审计 工具调用 工具调用拦截 工程团队 工程实践 工程笔记 常用软件 应用市场 延迟优化 开权重 开源权重 开源模型 异常 异步任务 异步委派 微信 心跳 性能优化 成本优化 成本控制 扩散模型 技术 抓包 按 provider 优先级 排查 推理加速 推理速度 推理预算 描述文件 提示词敏感性 故障排查 效率工具 教育数据开源 教育评测 数据工作流 数据流 数据集偏差 文本编码器 旁路由 日志分析 日记 时区 显卡虚拟化 智能家居 智能音箱 服务管理 本地 agent 机器人仿真 机器人学习 机器人数据采集 架构 模块 模型推理 模型评测 模型路由 残存访问 流式推理 流程 流程图 浏览器 漫游 火绒 电信 画图 监控 监控系统 监管 磁盘 稀疏注意力 立体声 端侧 AI 端侧推理 端口 端口冲突 端口扫描 续期 网关 网络 网络风暴 群晖 脚本 脚本优化 腾讯 自动化 自动恢复 自动攻击 自部署 苹果 虚拟机 视觉语言模型 视频生成 视频问诊 认证 证书 评测 评测基准 评测方法学 诉讼 语音 AI 语音 Agent 语音识别 超时 路由 路由器 软件管家 软路由 运维 运维监控 连接保活 连接问题 通信机制 通知 邮件漏发 部署 配置 量化 钉钉 镜像 镜像源 长上下文 长连接 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客 飞书

Hitokoto

Archive

Docker 端口绑定安全问题实战:从防火墙配置到 127.0.0.1 绑定

Docker 端口绑定安全问题实战:从防火墙配置到 127.0.0.1 绑定

前言

在部署 OpenClaw Gateway 到有公网 IP 的 VPS 时,遇到一个看似简单但隐藏风险的问题:即使防火墙已经配置了限制,公网仍然可以访问 Docker 映射的端口。本文将详细记录这个问题的排查和解决过程,并提供完整的安全配置指南。

问题背景

业务场景

我们有一台有公网 IP 的 VPS(简称某VPS),部署了 OpenClaw Gateway 服务。为了方便本地访问和管理,我们将 Gateway 的 18789 端口通过 Docker 映射了出来。

问题现象

配置了 iptables 防火墙规则,限制 18789 端口只能内网访问:

1
2
3
# 防火墙规则
iptables -A INPUT -p tcp --dport 18789 -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 18789 -j DROP

然而,从公网执行 curl http://<公网IP>:18789/ 仍然可以正常访问,这完全不符合预期。

环境信息

  • 操作系统:Ubuntu 24.04
  • 部署方式:Docker
  • 问题端口:18789(OpenClaw Gateway)
  • 网络类型:有公网 IP 的 VPS

问题分析

第一层:防火墙真的起作用了吗?

首先怀疑防火墙规则是否正确配置。检查现有规则:

1
2
3
4
5
# 查看当前 iptables 规则
iptables -L -n -v

# 查看 INPUT 链的具体规则
iptables -L INPUT -n --line-numbers

结果:防火墙规则是正确的,确实有限制 18789 端口的规则。

第二层:防火墙规则真的生效了吗?

进一步测试:

1
2
3
4
5
6
7
8
# 从本机测试(应该能访问)
curl http://127.0.0.1:18789/

# 从另一台内网机器测试(应该能访问)
curl http://192.168.160.xx:18789/

# 从公网测试(应该被阻止)
curl http://<公网IP>:18789/

结果:公网仍然可以访问!这就很奇怪了。

第三层:Docker 端口绑定机制

仔细回想 Docker 的端口映射行为:

1
2
# 常规的端口映射
docker run -p 18789:18789 ...

这个命令实际上会把容器的 18789 端口绑定到 所有网络接口(0.0.0.0),包括:

  • 127.0.0.1(本地回环)
  • 内网网卡(如 192.168.160.x)
  • 公网网卡(如 x.x.x.x)

这就解释了为什么即使防火墙限制了外面的人访问,流量仍然能进来——防火墙的规则是针对网卡的,但 Docker 直接在更底层绑定了所有接口,绕过了防火墙!

根因分析

问题的根本原因是:Docker 默认会把端口绑定到 0.0.0.0,这意味着所有网络接口都会监听这个端口,防火墙规则对 Docker 映射的端口基本无效。

解决方案

方案一:修改 Docker 端口绑定地址(推荐)

最直接的解决方案是修改 Docker 的端口绑定地址,只绑定到本地回环网络:

1
2
3
4
5
6
# 修改端口绑定到 127.0.0.1
docker run -p 127.0.0.1:18789:18789 ...

# 或者使用 docker-compose
ports:
- "127.0.0.1:18789:18789"

这样只有本地可以访问 Docker 映射的端口,公网自然就进不来了。

方案二:使用 iptables 禁止 Docker 绑定公网网卡(高级)

如果需要保留 0.0.0.0 绑定,可以通过 iptables 规则阻止:

1
2
# 阻止 Docker 容器端口被公网访问
iptables -I FORWARD -i <公网网卡> -p tcp --dport 18789 -j DROP

但这个方案比较复杂,不推荐新手使用。

方案三:使用 Docker 的 –network=host 模式(不推荐)

如果不需要 Docker 网络层,可以考虑 host 模式:

1
docker run --network=host ...

这样容器直接使用宿主机的网络栈,端口映射由宿主机防火墙控制。但这个方案会影响其他 Docker 功能,不推荐。

完整配置步骤

以下是完整的安全配置步骤,确保 18789 端口只能内网访问:

步骤 1:修改 Docker 端口绑定

1
2
3
4
5
6
7
8
9
10
11
12
# 停止现有容器
docker stop openclaw-gateway

# 删除旧容器
docker rm openclaw-gateway

# 重新启动,只绑定到 127.0.0.1
docker run -d \
--name openclaw-gateway \
-p 127.0.0.1:18789:18789 \
-v /opt/openclaw:/app/data \
openclaw/gateway:latest

步骤 2:验证配置

1
2
3
4
5
6
# 从本机测试(应该能访问)
curl http://127.0.0.1:18789/

# 从公网测试(应该失败)
curl http://<公网IP>:18789/
# 应该返回:curl: (7) Failed to connect to <IP> port 18789: Connection refused

步骤 3:配置防火墙(双重保险)

即使 Docker 已经绑定了 127.0.0.1,再加一层防火墙更加安全:

1
2
3
4
5
6
7
8
# 允许内网访问
iptables -A INPUT -p tcp --dport 18789 -s 192.168.0.0/16 -j ACCEPT

# 拒绝其他访问
iptables -A INPUT -p tcp --dport 18789 -j DROP

# 保存规则
iptables-save > /etc/iptables/rules.v4

一键解决方案

如果你遇到了类似问题,可以使用以下一键修复脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
# Docker 端口安全绑定修复脚本

# 参数检查
if [ -z "$1" ]; then
echo "用法: $0 <容器名> <宿端口>"
echo "示例: $0 openclaw-gateway 18789"
exit 1
fi

CONTAINER_NAME=$1
HOST_PORT=$2

echo "正在修复容器 $CONTAINER_NAME 的端口绑定..."

# 停止容器
docker stop $CONTAINER_NAME

# 删除容器
docker rm $CONTAINER_NAME

# 重新启动,绑定到 127.0.0.1
# 注意:这里需要你根据自己的启动命令修改
echo "请手动启动容器,使用以下端口映射格式:"
echo " -p 127.0.0.1:${HOST_PORT}:${HOST_PORT}"

echo "修复完成!"

常见问题解答

Q:为什么防火墙规则对 Docker 端口映射无效?

A:因为 Docker 默认把端口绑定到 0.0.0.0(所有网络接口),这意味着流量直接到达 Docker 的网桥,不经过宿主机的 iptables 规则。

Q:如何查看 Docker 端口绑定到了哪些地址?

A:使用以下命令:

1
2
3
4
5
# 查看端口映射详情
docker port <容器名>

# 或者查看 Docker 的 iptables 规则
iptables -L -n -v -t nat | grep DOCKER

Q:是否可以只修改防火墙而不改 Docker 配置?

A:理论上可以通过 iptables 规则阻止 FORWARD 链的流量,但这需要比较复杂的配置,且容易出错。建议直接修改 Docker 绑定地址,更加简单直接。

Q:还有其他需要注意的 Docker 安全问题吗?

A:以下是几个常见的安全建议:

  1. 不要使用 --privileged 模式
  2. 限制容器资源(CPU、内存)
  3. 使用只读文件系统
  4. 定期更新 Docker 版本
  5. 避免在容器中存储敏感信息

总结

本文记录了一次 Docker 端口绑定安全问题的完整排查和解决过程。核心要点:

  1. Docker 默认端口绑定到 0.0.0.0,会绕过防火墙规则
  2. 解决方案是显式绑定到 127.0.0.1,只允许本地访问
  3. 安全问题是不能心存侥幸的,宁可多做不能少做

希望这篇文章能帮到你。如果有问题,欢迎在评论区讨论。


作者:小六,一个在上海努力搬砖的程序员

本文阅读量 --
Author:Margrop
Link:https://blog.margrop.com/post/2026-03-10-docker-port-security/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可