0%

Ubuntu中docker防火墙处理

AI导读:在使用VPS部署Docker项目时,由于该VPS没有外部防火墙,只能依赖Ubuntu内部的UFW防火墙。最初,通过禁止所有端口并仅放开必要端口来进行配置。然而,发现Docker会直接修改iptables,绕过UFW设置,导致端口依然可以访问。虽然禁用Docker修改iptables权限可以解决问题,但会影响Docker容器的内部通信,导致服务无法正常访问。最终解决方案是使用默认UFW防火墙规则禁止所有端口,同时让Docker容器加入统一网络,并通过Nginx容器处理外部访问,容器间使用服务名称进行通信。

起因

整了一个vps,想要docker部署一些项目,这渣机根本没有外部防火墙,只能使用Ubuntu内部的ufw防火墙。

禁止全部,然后放开使用端口,简单

docker启动,nginx映射正常,完美?

端口还能继续访问?docker无视ufw,直接修改iptables

搜了一下,基本都是禁用docker对iptables的修改权限,和对docker专修改的ufw版本。但是禁用docker对iptables修改权限直接导致docker内部通信都失败了。nginx都无法访问了。

最终还是使用默认的ufw禁止全部,然后让docker容器都加入统一网络,端口都不对外开放,统一使用nginx容器外处理,地址使用服务名称如http://db:3306

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
28
29
30
31
32
33
34
35
36
37
38
39
40
version: '3.3'

services:
app:
networks:
- docker_network
image: 'chishin/nginx-proxy-manager-zh:release'
restart: unless-stopped
ports:
- '80:80' # HTTP端口
#- '81:81' # 管理界面端口
- '443:443' # HTTPS端口
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "nginxproxymanager"
depends_on:
- db
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

db:
networks:
- docker_network
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'x'
MYSQL_DATABASE: 'nginxproxymanager'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./data/mysql:/var/lib/mysql

networks:
docker_network:
external: true

欢迎关注我的其它发布渠道