解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题

docker直接映射端口会绕过宿主机的ufw防火墙,导致端口暴露在外网,不仅会被扫描,还会被别人通过IP:Port访问。

默认状态下的 Docker 并不遵守 ufw 的防火墙规则的原因分析:

  • Docker 默认自动创建 NAT 规则,这些规则在 iptables 的 PREROUTING 链中生效
  • 流量会直接通过 DOCKER 链转发到容器,​跳过常规的 INPUT 链​(系统防火墙通常监控 INPUT 链)
  • Docker 的规则在 PREROUTING 阶段完成转发,而传统防火墙(如 UFW)主要控制 INPUT 链

所以,只有直接使用host模式,容器的端口才会接受宿主机防火墙的管理

那么就考虑不在宿主机上直接绑定端口,而是只在容器内暴露端口,并使用反向代理来访问容器服务,从而增强安全性。

以alist为例,使用expose暴露了必要端口,使用反代访问。

一、容器名反代

##反代的时候直接使用容器名+端口即可,这样可以避免更新镜像或者重启容器时导致的端口变动

http://容器名:Port

二、容器IP反代

获取容器IP后,可通过反代容器IP:Port访问,

##获取指定容器IP

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名

三、仅本机访问

创建容器的时候,使用"本地回环地址",它只指向计算机自身。通过将端口映射绑定到这个地址,Docker会确保只有来自宿主机内部的连接请求会被转发到容器,来自外部网络(如局域网或互联网)的连接请求会被直接拒绝,此时再域名反代到127.0.0.1即可。

version: '3'
services:
  web-app:
    image: nginx:latest
    ports:
      - "127.0.0.1:8080:80"  # 宿主机只能通过本地8080端口访问Nginx
    depends_on:
      - database

  database:
    image: postgres:latest
    # 不配置ports,外部网络和宿主机都无法直接访问数据库端口。
    # 但web-app容器可以通过服务名"database"和容器内部端口(如5432)来连接。
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password

四、端口仅expose

仅expose的方式的话只能就使用前两种反代方式

version: '3.8'
services:
  alist:
    restart: always
    volumes:
      - '/www:/www'
      - '/opt/1panel:/opt/1panel'
      - './alist/data:/opt/alist/data'
      - './downloads/temp/aria2:/opt/alist/data/temp/aria2'
      - './downloads/temp/qbittorrent:/opt/alist/data/temp/qbittorrent'
    expose:
      - '5244'
    environment:
      - PUID=0
      - PGID=0
      - UMASK=022
    container_name: alist
    image: 'xhofe/alist:main'
    networks:
      - external_network

qbittorrent:
    container_name: qbittorrent
    image: linuxserver/qbittorrent
    environment:
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
      - UMASK_SET=022
    volumes:
      - './qbittorrent/config:/config'
      - './downloads:/downloads'
      - './downloads/temp/qbittorrent:/opt/alist/data/temp/qbittorrent'
    ports:
      - "6881:6881"
      - "6881:6881/udp"
    expose:
      - "8080"
    networks:
      - internal_network
      - external_network
    restart: unless-stopped



  ariang:
    container_name: ariang
    image: p3terx/ariang
    command: --port 6880 --ipv6
    expose:
      - "6880"
    networks:
      - internal_network
      - external_network
    restart: unless-stopped
    logging:
      driver: json-file
      options:
        max-size: 1m
        
  aria2-pro:
    container_name: aria2-pro
    image: p3terx/aria2-pro
    environment:
      - PUID=0
      - PGID=0
      - UMASK_SET=022
      - RPC_SECRET=zke.pub
      - RPC_PORT=6800
      - LISTEN_PORT=6880
      - DISK_CACHE=64M
      - IPV6_MODE=false
      - UPDATE_TRACKERS=true
      - CUSTOM_TRACKER_URL=
      - TZ=Asia/Shanghai
    volumes:
      - './aria2/config:/config'
      - './downloads:/downloads'
      - './downloads/temp/aria2:/opt/alist/data/temp/aria2'
    expose:
      - "6800"
    ports:
      - "6880:6880"
      - "6880:6880/udp"
    networks:
      - internal_network
      - external_network
    restart: unless-stopped
    logging:
      driver: json-file
      options:
        max-size: 1m

networks:
  internal_network:
    internal: true
  external_network:
    driver: bridge

 

本文作者:ZKCOI

文章名称:解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题

文章链接:https://www.zkcoi.com/365up/program/3739.html

本站资源仅供个人学习和交流,如若转载,请注明出处,详见《免责声明》

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZKCOIZKCOI
阿里云的香港轻量服务器,当日售出量已达上限怎么办?
上一篇 2024年6月25日 下午7:30
ColoCrossing,特价VPS低至$10/年,1Gbps带宽,不限流量,有Windows/Linux系统
下一篇 2024年7月17日 下午8:01

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系博主

立即联系
一般有空就回复

qrcode_web

微信扫码联系我

insert_link 友情链接
分享本页
返回顶部