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

路由器开防火墙是不是就可以防止外部乱连了,在路由器本身也不使用docker的前提下

马克了 学习到了

一个端口也不开放。http服务通过nginx转发,tcp服务vpn访问。

还好吧,吓人一跳,以为出啥大bug了

1 Like

都是docker compose启动,和nginx-proxy-manager容器连接到一个外部网络,不需要暴露外部端口,连本地都不需要

不开放端口不就行了吗,

生产环境用 k8s 一定要docker只打洞 443 80 端口

我学到了

顺便一提 iptables -I INPUT 1 -m set --match-set example_ipset src -j DROP 是无法拦截访问 docker 的 IP:port 的外来 IP 的,需要在使用以上命令添加 iptables 规则的同时,再添加 iptables -I DOCKER-USER -m set --match-set example_ipset src -j DROP, 这样才能拦截 example_ipset 规则集里的 IP 访问你所有端口和 docker 开放的端口

常见的场景就是 fail2ban 的 iptables-ipset-proto6-allports 动作,只会给 INPUT 链添加规则,你还需要手动给 DOCKER-USER 也添加规则才能正常屏蔽包括 docker 开放的端口的访问

2 Likes

如果是阿里云之类的,可以web控制台控制端口开发

学习到了

不存在隐式显式的问题。如上图,实质上是因为如果数据包过 FORWARD 链就不会过 INPUT filter,所以如果要加对应端口的屏蔽规则就要加在 FORWARD 链上。但这比较麻烦,因为 docker 会自己往上加规则,所以在部署容器的时候把暴露端口改到本地是一个比较好的解决方案。

很多项目给的 docker-compose 中都会有若干服务比如数据库啥的直接 port:port 暴露在 0.0.0.0 上,确实是一个隐患。其实很多时候这些服务连本地暴露端口都没必要,因为使用它们的服务在同一个 docker network 下,直接 container_name:port 就可以访问到。

4 Likes

什么服务需要外部访问,什么服务就需要开放端口。处在同一网络的容器不需要开放端口,直接不加开放端口的参数就可以了,同一个网络下的容器可以用container_name作为通信地址访问。nginx需要对外服务肯定要开放端口,其他容器仅接受nginx的访问,就不需要开放端口的参数,不开放端口就不会暴露。就像下面这样的例子,根本就不需要开放服务的端口。

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
       - 80:80
  app_1:
    container_name: app_1
    build: ./app_1/build
  app_2:
    container_name: app_2
    build: ./app_2/build
server {
  listen 80;
  server_name app_1;
  location / {
     include proxy_params;
     proxy_pass http://app_1/;
}
server {
  listen 80;
  server_name app_2;
  location / {
     include proxy_params;
     proxy_pass http://app_2/;
}
4 Likes

学习了!

好贴,学到了 :+1:

vps的安全组可以管理出站入站 没必要用ufw-docker之类的了

之前一直都只有本地访问,最近都懒得弄了,无所谓,反正有备份

这句话一股 Deepseek 味 :laughing:

这个图好专业,iptables的底层逻辑了,学习了

好方案,学习了