UFW 防火墙无法在 DigitalOcean 中的 Ubuntu 上运行
UFW firewall is not working on Ubuntu in DigitalOcean
在我的 DigitalOcean (DO) droplet 中,我安装了这个图像:Ubuntu Docker 17.12.0~ce on 16.04(可在 * * DO website > droplet> destroy> rebuild 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),但仍然遇到同样的问题。
结论:ufw防火墙在Ubuntu
中根本不起作用
问题:如何配置ufw/Ubuntu来解决这个问题?
Docker 和 UFW 不能很好地协同工作,因为它们都修改了 iptables,但有一种方法可以解决这个问题。
您需要将 Docker 配置为不使用 iptables。添加
DOCKER_OPTS="--iptables=false"
到 /etc/default/docker
并重新启动主机(或重新启动 Docker 守护程序和 UFW)。
这两个链接提供了有关此问题的更多信息:
https://blog.viktorpetersson.com/2014/11/03/the-dangers-of-ufw-docker.html
https://www.techrepublic.com/article/how-to-fix-the-docker-and-ufw-security-flaw/
替代解决方案:放弃 UFW,而是使用数字海洋控制面板(在网站上)中提供的网络防火墙。
这样做 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
在我的 DigitalOcean (DO) droplet 中,我安装了这个图像:Ubuntu Docker 17.12.0~ce on 16.04(可在 * * DO website > droplet> destroy> rebuild 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),但仍然遇到同样的问题。
结论:ufw防火墙在Ubuntu
中根本不起作用问题:如何配置ufw/Ubuntu来解决这个问题?
Docker 和 UFW 不能很好地协同工作,因为它们都修改了 iptables,但有一种方法可以解决这个问题。 您需要将 Docker 配置为不使用 iptables。添加
DOCKER_OPTS="--iptables=false"
到 /etc/default/docker
并重新启动主机(或重新启动 Docker 守护程序和 UFW)。
这两个链接提供了有关此问题的更多信息:
https://blog.viktorpetersson.com/2014/11/03/the-dangers-of-ufw-docker.html
https://www.techrepublic.com/article/how-to-fix-the-docker-and-ufw-security-flaw/
替代解决方案:放弃 UFW,而是使用数字海洋控制面板(在网站上)中提供的网络防火墙。
这样做 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