🚨 紧急教程:彻底解决Docker隐式开放端口的安全隐患!


问题由来

今天我启动了一个 docker 服务,通过 ip:port 的方式可以正常访问服务,但是在我查看防火墙的时候发现没有这个端口哇,奇怪了!!防火墙没有配置为啥能访问进来呢???勾起了我的好奇心,探究了一番有了以下教程,这个小知识点估计大佬们都知道了,但是涉及到安全问题,我相信好多小白可能还是不清楚的,安全问题多提几次我觉得也不为过,尤其是部署到公网上的服务尤其要引起重视!!

:magnifying_glass_tilted_left: 问题根源:Docker 端口映射的 “隐藏炸弹”

当使用 docker run -p 3001:3001 时,**Docker 会自动在 iptables 中添加 NAT 规则 **,允许外部流量通过 3001 端口访问容器。然而,这些规则:

  1. ** 对防火墙工具不可见 **:如 firewalldufw 等工具无法直接管理这些规则;
  2. ** 绕过常规防火墙控制 **:Docker 的规则优先级高于用户自定义规则,导致安全策略失效;
  3. ** 暴露端口到公网 **:默认绑定 0.0.0.0(所有 IP),可能被扫描攻击。

**:light_bulb: 终极解决方案:显式绑定本地回环地址 **

通过 ** 限制端口仅允许本地访问 **,彻底规避 Docker 的隐式规则!

** 操作步骤 **

# 关键参数:将容器端口绑定到 127.0.0.1(仅本地访问)
docker run -d --name my_app \
  -p 127.0.0.1:3001:3001 \
  your_image:tag

** 效果对比 **

配置方式 外部访问风险 iptables 规则可见性 防火墙兼容性
-p 3001:3001(默认) :warning: 高危 :cross_mark: 隐藏 冲突
-p 127.0.0.1:3001:3001 :white_check_mark: 零风险 :white_check_mark: 可控 无冲突

补充说明

评论里大家提到了可以在安全组里面来控制端口是否放行,如果云厂商提供了安全组是可以的,比如国内的阿里、腾讯等大型的云服务厂商是提供了的,但是好多人购买服务器为了便宜或者是免备案等考虑是在其他平台买的,不一定有安全组这个功能

从互联网到容器会经过如下几层过滤到达你的容器

  1. 互联网
    → 2. 云平台安全组(第一层过滤)
    → 3. 宿主机本地防火墙(UFW等防火墙)(第二层过滤)
    → 4. 宿主机iptables(包括 Docker 添加的规则)(第三层转发)
    → 5. 容器
74 Likes

感谢分享,难怪我没开端口,内网还能访问呢 :tieba_087:

2 Likes

对 指向本地 然后需要的服务 再用nginx代理一下 我都是这么搞得。。

network host 防火墙兼容性好

如果有用 ufw 的话,可以搭配这个

3 Likes

我是菜鸡 :sob:还以为自己发现新大陆呢

用的VPS一般还有一层安全组,要在安全组允许端口才能从外部访问

1 Like

这么搞的话 如果和NG不在同一台服务器不是很麻烦

1 Like

基本都是这样,127.0.0.1:xxx:xxx 然后nginx反代。

1 Like

嗯,这个可以,或者是用cloudflare tunnel来访问也是一种安全可控的方案,好处是自己不用配置nginx了,另外cf大善人在外层给你加了安全防护

1 Like

走内网穿透方案

谢谢,我学习下你发的这个

长知识了

我的生产compose带了一个nginx, 所有的服务都得往nginx跑
nginx通过 container_name:PORT映射, 所有服务都不往外开端口, 得经过nginx才行, 这也是个便于管理的方法

你这个是通过docker部署了nginx,但是并没有阻止服务的端口对外暴露,你可以查询下iptales,或者是直接访问下这个端口,没做类似我说的配置依然是通的

插眼学习一下佬们的做法

1 Like

这是显式,不是隐式,有点危言耸听了

1 Like

本质上还是治标不治本,你都绑定了localhost那还要防火墙有啥意义,防火墙就是方便我放行端口用的,再就是如果我随便从网上下一个docker compose没改绑定,那不就直接暴露到公网去了

目的就是防止别人通过ip和端口直接扫描到你源站的服务,现在好多人在公网上部署大模型等服务不都是被这么扫描出来的吧,增加一层nginx的转发,通过域名才能访问时,最起码避免掉了被机器扫描的风险,如果不走转发方案走内网穿透那么限制了可访问的客服端会更加安全,毕竟大多数部署的服务是给自己用的,我是这么理解的

1 Like

感谢大佬!