UFW

UFW(Uncomplicated Firewall),是用于管理Linux内核netfilter防火墙的程序。传统使用强大的iptables操作netfilter, 但ufw提供少量简单命令管理,并基于iptables进行配置,更易于使用。从Ubuntu 8.04 LTS开始,ufw作为系统上默认的防火墙组件。

简介

时间轴

快速入门

sudo ufw allow 80
sudo ufw allow 22   # 开启ssh端口,如果是其他修改为相应
# sudo ufw default deny incoming  # 默认关闭所有进入端口,默认是deny incoming
# sudo ufw default deny outgoing  # 默认关闭所有出去端口,默认是allow outgoing 

sudo ufw enable   # 开启ufw 
sudo ufw status verbose  # 查看ufw状态和默认策略
# sudo ufw reload  # 重启ufw

列出规则

名称 描述 示例
status 检查UFW的状态,并列出所有规则 sudo ufw status
status verbose 获取更详细信息,包含有关日志记录状态,默认策略等。 sudo ufw status verbose
status numbered 获取所有规则和其编号 sudo ufw status numbered


删除规则

名称 描述 示例
delete allow/deny 端口号 根据端口号,删除相应规则。 sudo ufw delete allow 2222
sudo ufw delete deny 80
delete 编号 按规则编号删除。先使用sudo ufw status numbered查看规则编号。
# 查看编号
sudo ufw status numbered  
# 删除编号为4的规则
sudo ufw delete 4
reset 重置删除所有规则,重置后默认是禁用ufw的。 sudo ufw reset

docker失效

ufw对docker容器不起作用,因为Docker和ufw使用iptables的方式使它们彼此不兼容。使用 Docker 开发的容器的端口时,进出该容器的流量在通过ufw防火墙设置之前被转移。

了解更多 >> Docker文档:网络/数据包过滤和防火墙 GitHub:chaifeng/ufw-docker


修改 UFW 配置文件

一种方法是,修改 UFW 的配置文件 sudo vim /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

然后重启 UFW, sudo ufw reloadsudo systemctl restart ufw,如果还是不生效,重启服务器。

如果容器端口80,注意这个端口不是对应的主机端口。那就可以用以下命令来允许外部网络访问这个服务:

ufw route allow proto tcp from any to any port 80

如果有多个容器的服务端口为 80,但只希望外部网络访问某个特定的容器。比如该容器的私有地址为 172.17.0.2,就用类似下面的命令:

ufw route allow proto tcp from any to 172.17.0.2 port 80

了解更多 >> GitHub:chaifeng/ufw-docker


资源

官网

网站