数字海洋上的Ubuntu系统中UFW防火墙无法工作

15

在我的DigitalOcean(DO)droplet上,我安装了这个镜像:Ubuntu Docker 17.12.0~ce on 16.04(可以在**DO网站 > droplet > 销毁 > 重建droplet**上找到),在ssh中(在用户配置后),我运行

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
sudo ufw status verbose

并获得:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), allow (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         LIMIT IN    Anywhere                  
2375/tcp                   ALLOW IN    Anywhere                  
2376/tcp                   ALLOW IN    Anywhere                  
22 (v6)                    LIMIT IN    Anywhere (v6)             
2375/tcp (v6)              ALLOW IN    Anywhere (v6)             
2376/tcp (v6)              ALLOW IN    Anywhere (v6) 

如您所见,我不允许在80号端口(http)上进行任何连接。为了测试防火墙是否真正起作用,我运行以下docker:

sudo docker run -d -p 80:80 -e ENABLE_IPV6=true -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy:alpine

但是,当我在Chrome中输入我的droplet IP时,我看到了nginx的响应(!!!)

我也尝试了Ubuntu 17镜像(手动安装docker),但仍然遇到了同样的问题。

结论:在Ubuntu中,ufw防火墙根本不起作用。

问题:如何配置ufw/Ubuntu以解决这个问题?


这里有一些相关信息链接 - Kamil Kiełczewski
3个回答

26

12
在我的情况下,我需要编辑/etc/docker/daemon.json文件,并将其修改为{"iptables": false}。在/etc/default/docker文件的上方有一个大警告:“此文件不适用于Systemd”。 - user1556435
@user1556435 我在自己的主机上没有找到 daemon.json 文件。我需要创建它吗? - DaviesTobi alex
1
DOCKER_OPTS="--iptables false" 去掉等号对我有用 - DaviesTobi alex
我尝试在DigitalOcean droplet上进行此操作,确实可以加快进程,但至少对我来说,这并不是一个完全的解决方案。防火墙仍然会定期阻止docker-compose所产生的大量连接。 - Matthew Setter
这对大多数用户来说不是合适的:https://docs.docker.com/network/iptables/#prevent-docker-from-manipulating-iptables(同一页顶部有更好的解决方案) - Morgy
显示剩余2条评论

13

对我来说这样做 DOCKER_OPTS="--iptables=false" 没有起作用。

我建议在/etc/ufw/after.rules的末尾添加以下几行:

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER

这里是源码


2

替代方案:放弃使用UFW,而使用数字海洋控制面板中提供的网络防火墙(位于网站上)。


3
DO防火墙无法区分公共和私有网络,而使用ufw可以轻松配置不同的公共和私有网络规则集。 - Kirill Titov
哇,这解决了我的问题。我认为他们应该默认在这种类型上放置一个基本的防火墙。 - Shankar Thyagarajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接