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
本站资源仅供个人学习和交流,如若转载,请注明出处,详见《免责声明》。
微信扫一扫
支付宝扫一扫
