UFW
UFW(Uncomplicated Firewall),是用于管理Linux内核netfilter防火墙的程序。传统使用强大的iptables操作netfilter, 但ufw提供少量简单命令管理,并基于iptables进行配置,更易于使用。从Ubuntu 8.04 LTS开始,ufw作为系统上默认的防火墙组件。
简介
时间轴
快速入门
sudo ufw enable # 开启ufw
sudo ufw default deny incoming
sudo ufw default deny outgoing
ufw allow 80
ufw allow 22 # 开启ssh端口,
sudo ufw status # 查看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防火墙设置之前被转移。
修改 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 reload
或sudo 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
资源
官网
- UFW 官网:https://launchpad.net/ufw
- UFW 源代码:https://git.launchpad.net/ufw