UFW 防火墙简介
ufw - program for managing a netfilter firewall This program is for managing a Linux firewall and aims to provide an easy to use interface for the user.
ufw 是一个 iptables 类网络过滤式防火墙管理程序,比较容易上手。一般桌面应用使用 ufw 已经可以满足要求了。
安装方法
新版的 Ubuntu 系统默认都安装了 ufw,如果没有,可以使用 apt 安装:
sudo apt-get install ufw
快速入门
# 开启了防火墙并随系统启动
sudo ufw enable
# 关闭所有外部对本机的访问
sudo ufw default deny
# 关闭
sudo ufw disable
# 查看防火墙状态
sudo ufw status
# 开启/禁用相应端口或服务举例
sudo ufw allow 80 # 允许外部访问80端口
sudo ufw delete allow 80 # 禁止外部访问80 端口
sudo ufw allow from 192.168.1.1 # 允许此IP访问所有的本机端口
sudo ufw deny smtp # 禁止外部访问smtp服务
sudo ufw delete allow smtp # 删除上面建立的某条规则
sudo ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 22 # 拒绝所有从 10.0.0.0/8 到 192.168.0.1 地址的 22 端口的 TCP 流量
# 允许所有 RFC1918 网络(局域网/无线局域网的)访问这个主机
sudo ufw allow from 10.0.0.0/8
sudo ufw allow from 172.16.0.0/12
sudo ufw allow from 192.168.0.0/16
# 封 IP
ufw deny in on eth0 from 15.15.15.51
# rsync
ufw allow from 15.15.15.0/24 to any port 873
详细用法
# [--dry-run]选项 : 仅显示运行结果而不实际运行
# 启动 \ 关闭 \ 重启
ufw [--dry-run] enable | disable | reload
# 默认策略 允许 \ 拒绝 \ 拒绝并提示 [进入 \ 发出 \ 路由 的数据]
ufw [--dry-run] default allow | deny | reject [incoming | outgoing | routed]
# 日志 启动 \ 关闭 \ 级别
ufw [--dry-run] logging on | off | LEVEL
# 重置
ufw [--dry-run] reset
# 规则、状态 [详细 \ 序号]
ufw [--dry-run] status [verbose|numbered]
# 显示“报告”
ufw [--dry-run] show REPORT
# [删除][插入 第 行] 允许\拒绝\拒绝并提示\限制 [数据 进入\发出][记录\全记录] 端口[/协议]
ufw [--dry-run] [delete] [insert NUM] allow|deny|reject|limit [in|out] [log|log-all] PORT[/PROTOCOL]
# [规则][删除][插入 第 行] 允许\拒绝\拒绝并提示\限制 [数据 进入\发出[网络接口]][记录\全记录] [协议 **][来自**[端口 **]][指向**[端口**]
ufw [--dry-run] [rule] [delete] [insert NUM] allow|deny|reject|limit [in|out [on INTERFACE]] [log|log-all] [proto PROTOCOL] [from ADDRESS [port PORT]] [to ADDRESS [port PORT]]
# 路由[删除][插入 第 行] 允许\拒绝\拒绝并提示\限制 [数据 进入\发出[网络接口]][记录\全记录] [协议 **][来自**[端口 **]][指向**[端口**]
ufw [--dry-run] route [delete] [insert NUM] allow|deny|reject|limit [in|out on INTERFACE] [log|log-all] [proto PROTOCOL] [from ADDRESS [port PORT]] [to ADDRESS [port PORT]]
# 删除第 * 行规则
ufw [--dry-run] delete NUM
# 应用名 列表\信息\默认策略\更新
ufw [--dry-run] app list|info|default|update
选项
# 显示程序版本并退出
--version
# 显示帮助并退出
-h, --help
# 不进行更改,仅显示更改内容
--dry-run
# 重启防火墙,设置为开机启动
enable
# 停止防火墙,禁止开机启动
disable
# 重启防火墙
reload
# 改变传入 \ 传出 \ 路由的默认策略。
# 已存在的规则可能需要进行手动修改。
default allow | deny | reject DIRECTION
# 切换记录。日志记录使用的是 LOG_KERN 系统设备。
# 系统日志保存于 /var/log/ufw.log。
# LEVEL指定不同的级别,默认级别是‘低’。
logging on | off | LEVEL
# 关闭并重置防火墙至默认安装状态。使用 --force 选项,无需等待确认。
reset
# 显示防火墙状态及规则。使用 status verbose 显示额外信息。显示信息中 'Anywhere' 等同于 'any' 和 '0.0.0.0/0'。
status
# 进入 \ 发出 规则,(来自\指向)是以防火墙系统为终点的;
# 路由规则,(来自\指向)是相对于通过防火墙的流向。
# 需要注意的是报告有些微妙的差异。例如,加入以下规则:
# 允许来自 192.168.0.0-192.168.255.255 的数据通过 eth0 网卡进入主机
# ufw allow in on eth0 from 192.168.0.0/16
# 允许指向 10.0.0.0-10.255.255.255 的数据通过 eth1 网卡从本机发出
# ufw allow out on eth1 to 10.0.0.0/8
# 允许来自 192.168.0.0-192.168.255.255 通过 eth0 网卡收入的数据且指向 10.0.0.0-10.255.255.255 通过 eth1 网卡发出的数据经本机路由
# ufw route allow in on eth0 out on eth1 to 10.0.0.0/8 from 192.168.0.0/16
# ufw status 显示信息为:
# To Action From
# -- ------ ----
# Anywhere on eth0 ALLOW 192.168.0.0/16
# 10.0.0.0/8 ALLOW OUT Anywhere on eth1
# 10.0.0.0/8 on eth1 ALLOW FWD 192.168.0.0/16 on eth0
# 显示运行中的防火墙信息。
show REPORT
# 增加允许规则。参见 RULE SYNTAX
allow ARGS
# 增加拒绝规则。参见 RULE SYNTAX
deny ARGS
# 增加抵制规则。参见 RULE SYNTAX
reject ARGS
# 增加限制规则。目前仅适用于 IPv4。参见 RULE SYNTAX
limit ARGS
# 删除对应 RULE
delete RULE | NUM
# 以规则号 NUM 插入对应 RULE
insert NUM RULE
RULE SYNTAX (规则语法)
简略语法
简略语法仅指定端口、可选协议被主机允许 \ 拒绝。 例如:允许使用 53 端口
ufw allow 53
规则意为,允许本机通过 53 端口使用 tcp udp 协议指向任意地址的信息(一个物理网卡可以包含 1 或多个 IP 地址)。指定协议,在端口后加 / 即可。
例如:允许使用通过tcp协议使用25端口
ufw allow 25/tcp
规则意为,允许本机通过 25 端口使用 tcp 协议指向任意地址(进入)的信息。如果指定服务名称,ufw 会通过检查 /etc/services 文件获得端口、协议信息。
例如:允许 smtp 应用
ufw allow smtp
ufw 同时支持出、入过滤。用户可以使用 in \ out 规定任意方向进出的数据。如果未指定方向,规则将应用于进入的数据。
如:允许 http 应用数据进入本机
ufw allow in http
拒绝并告知:拒绝从本机发出 smtp 应用数据
ufw reject out smtp
完全语法
用户也可以使用完整语法,指明来源 \ 目标,地址,端口。该语法是 OpenBSD PF 语法的简约版。 例如:拒绝指向任意地址使用 80 端口 tcp 协议的数据进入本机
ufw deny proto tcp to any port 80
该规则:本机拒绝 80 端口使用 tcp 协议指向任意地址(进入)的信息。 再如:拒绝来自 10.0.0.0/8 域 tcp 协议指向 192.168.0.1 端口 25 的数据进入本机
ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 25
该规则将阻断(拒绝)所有来自 RFC1918 A 级网络(10.0.0.0-10.255.255.255)通过 25 端口使用 tcp 协议发送到 192.168.0.1 的信息。
拒绝来自 2001:db8::/32 域指向任意地址端口 25 的数据进入本机
ufw deny proto tcp from 2001:db8::/32 to any port 25
该规则将拒绝本机接收所有来自 IPv6 2001:db8::/32 通过 25 端口使用 tcp(进入)的信息。/etc/default/ufw 配置文件需开通 IPv6 功能。
允许来自任意地址使用 tcp 协议指向任意地址使用端口 80、443、8080-8090 的数据进入本机
ufw allow proto tcp from any to any port 80,443,8080:8090
该规则允许本机通过 80、443,8080 至 8090 端口使用 tcp 协议(进入)的信息。指定多个端口时,只能使用数字,且不能含空格。修改规则时需整条规则修改。在上面的例子中,你不能仅仅删除 443 端口。每次指定不能超过 15 个端口(端口区间视为 2 个端口,上面例子视为 4 个端口)
规则中数据目标不是本机,是经本机防火墙路由 \ 转发,规则前需加关键字 route(路由规则与 PF 语法有明显的不同,替之以 FORWARD 链转换)。
允许经eth1进入,eth2发出的数据经本机路由
ufw route allow in on eth1 out on eth2
该规则允许数据由 eth1 网卡进入路由至 eth2 网卡发出。
允许经 eth0 进入 eth1 发出指向 12.34.45.67 使用 80 端口 tcp 的数据经本机路由
ufw route allow in on eth0 out on eth1 to 12.34.45.67 port 80 proto tcp
该规则允许数据经 eth0 网卡进入路由至 eth1 网卡通过 80 端口使用 tcp 协议发送至 IP 12.34.45.67
增加路由规则前必需设置 IP 转发。该配置文件 /etc/ufw/sysctl.conf,配置内容应如下:
net/ipv4/ip_forward=1
net/ipv6/conf/default/forwarding=1
net/ipv6/conf/all/forwarding=1
再使用以下命令重启防火墙:
ufw disable
ufw enable
请小心,该操作系统内核可调参数设置会覆盖 ufw 内核(sysctl)设置。参见 sysctl 手册。
ufw 支持连接次数限制。可用于对抗暴力登录攻击。启用限制规则后,ufw 允许连接,但 30 秒内连接次数高于 6 次时拒绝该 IP 访问。 参见 http://www.debian-administration.org/articles/187。
典型用法如下:
限制 ssh tcp 协议连接本机次数
ufw limit ssh/tcp
有时需要让发送数据者知道数据被拒绝而不是失踪。在下面例子中,用户使用 reject 替换 deny。例如:
ufw reject auth
默认情况下,ufw 将规则应用于所有可用网络接口。也可把规则指定到特定的网络接口,包括网络接口数据进出方向(不支持网络接口别名)。 例如: 允许数据通过 eth0 网卡使用 http 协议进入主机,写法如下:
# 允许通过 eth0 指向任意地址端口 80 协议 tcp 的数据进入本机
ufw allow in on eth0 to any port 80 proto tcp
要删除一条规则,在原规则前加 delete 就可以了。例如:原规则是 ufw deny 80/tcp 删除时就写 ufw delete deny 80/tcp
你也可以使用 status numbered 参数查看规则序号。比如你想删除第 3 条规则,这样写 ufw delete 3
如果 IPv6 启用,你想删除一条同时适用于 IPv4、IPv6 的规则(如ufw allow 22/tcp),使用序号删除规则只会删除其中一条。 一次性删除干净就只能使用原规则前加 delete 的办法。
为使用规则正常,你可以使用序号的方式插入新规则。例如,你有 4 条规则了,但你想把新规则放到第 3 的位置,可以这样写: 把 拒绝来自 10.0.0.135 协议 tcp 指向任意地址端口 22 的数据进入本机 指条命令插入到第 3 的位置
ufw insert 3 deny to any port 22 from 10.0.0.135 proto tcp
查询规则序号,使用命令:
ufw status numbered
ufw 支持规则运行状态日志。默认情况下符合规则的数据日志不显示。指定日志会记录下所有符合规则的数据、新连接。 例如:允许并记录所有新 ssh 连接。命令如下
ufw allow log 22/tcp
例子
拒绝所有通过 53 端口的数据
ufw deny 53
允许所有通过 80 端口使用 tcp 的数据
ufw allow 80/tcp
允许所有来自 RFC1918 网络的数据进入本机
ufw allow from 10.0.0.0/8
ufw allow from 172.16.0.0/12
ufw allow from 192.168.0.0/16
拒绝来自 1.2.3.4 主机通过 514 端口使用 udp 协议的数据
ufw deny proto udp from 1.2.3.4 to any port 514
允许来自主机1.2.3.5端口5469的数据到达本机1.2.3.4使用端口5469协议udp
ufw allow proto udp from 1.2.3.5 port 5469 to 1.2.3.4 port 5469
远程管理
通过初始化脚本或命令启动 ufw 后,ufw 将刷新连接。这是为了让 ufw 运行正常。但可能导致现有连接中断(如ssh)。ufw 支持在启动前增加规则,在运行 ufw enable 命令前,管理者可以增加这个规则来进行远程管理:
ufw allow proto tcp from any to any port 22
所有规则将被激活,ssh 连接在启用防火墙时依然开通。请注意只要 ufw 处于 ‘enabled’ 状态,增加或删除规则,都不进行连接刷新(改变默认策略或修改规则时除外)。
默认情况,ufw 如果处于 ssh 远程连接下,规则影响到 ssh 连接时都需要确认。使用 ufw --force enable 命令时,就不需要确认了。
应用集成(强烈推荐此方法)
ufw 支持查询 /etc/ufw/applications.d 文件完成应用集成。查看 ufw 已知应用集成(其它端口,由 ubuntu 在安装软件时自动定义,一般不需要自己新建。具体端口参见 /etc/services),命令:
ufw app list
用户在增加规则时能使用应用名(引用带有空格的任何配置文件名称)。例如,使用如下简单语法:
ufw allow <name>
或完整语法:
ufw allow from 192.168.0.0/16 to any app <name>
使用应用名代替端口时,语法中不能指定协议 查看关于应用名的具体内容,使用如下命令。
ufw app info <name>
app list 命令可以显示有哪些应用名。使用 all 代替应用名时,上面的命令会例出所有已知程序详细情况。 增加或编辑了应用名相关内容,请使用下面命刷新:
ufw app update <name>
该命令将自动更新配置应用名。应用名为 all 时,会更新所有应用名。如果需要更新应用名配置且作为新规则加入防火墙,请使用下面的命令。
ufw app update --add-new <name>
–add-new 命令参数进行更新时,其行为方式可由下面的命令指定
ufw app default <policy>
默认应用策略是跳过,也就意味着 –add-new 命令参数实际上没设定策略。用户能指定策略为 allow 或 deny, 那之后 –add-new 参数将自动更新防火墙。 警告:使用 allow 策略作为应用策略将有安全风险。使用默认允许的政策之前,要仔细考虑的安全后果。
LOGGING(日志)
ufw 支持多种日志级别。默认为“低”。用户可使用下面的命令指定日志级别:
ufw logging LEVEL
级别分为 off / low / medium / high / full , 默认为 log。区别如下:
| 级别 | 说明 |
|---|---|
| off | 关闭日志记录 |
| low | 记录所有被默认策略阻止的数据(速率限制),以及符合规则的数据。 |
| medium | 低级别 + 不符合默认策略是数据 + 无效数据 + 所有新连接。所有记录在速率限制下进行。 |
| high | 中级(取消速率限制)+ 速率限制下的所有数据包 |
| full | 高级无速率限制。 |
中级别以可能产生大量日志,有可能快速填满硬盘。对繁忙的系统而言,中级别就会有大量日志产生。 on 参数在没启用日志时,默认指定为低级别。
REPORTS(报告)
支持如下报告。它们均基于活动系统排外的监听报告,属于原始的 iptable 形式。
raw
builtins
before-rules
user-rules
after-rules
logging-rules
listening
added
raw 显示完整报告。其它级别在此基础上精简。 报告显示活动系统监听下的 tcp upd 状态及地址 网络接口,以及可监听的端口。 * 号代表该端口绑定到网络接口。 该信息之下是所有能影响到该端口连接的规则。规则的监听由内核、第 1 匹配 wins 排序。 注意默认策略未被监听,tcp6 udp6 只有在 IPv6 启用的情况下有效。
新增报告将显示规则加入时的命令列表。报告不显示防火墙此时的运行状态(请使用 ufw status 命查询)。因为规则已被 ufw 标准化,看起来与加入时原规则不同了。此外,UFW 不记录命令排序,所以等效排序,仅 IPv6 的规则位于其他规则后。
NOTES 注意
安装后,ufw 不启动,默认策略:进入数据拒绝,转发拒绝,发出数据允许。默认策略跟踪进入 \ 转发的新连接。除此外还增加了下列默认规则集:
- 丢弃含 RH0 头的数据
- 丢弃无效数据
- 接受部分 ICMP 数据包(进入 \ 转发):IPv4:目的地不可达,源结束,超过时间,参数问题,回声请求。IPv6:目的地不可达,分组太大而,超过时间,参数问题,回声请求。
- 接受 ICMPv6 报文的无状态自动配置(INPUT)
- 接受 IPv6 链路本地地址(ffe8::/10)ping 应答(INPUT)
- 接受 DHCP 客户端数据(INPUT)
- 丢弃非本地通讯(INPUT)
- 接受 mDNS 服务(zeroconf/bonjour/avahi 等协议使用,IPv4 224.0.0.251,IPv6 ff02::fb)(INPUT)
- 接受 UPnP 服务(IPv4:239.255.255.250 ,IPv6:ff02::f ) (INPUT)
规则的顺序很重要,依次匹配执行。因此先添加针对性强的规则,再添加影响广泛的规则。 UFW 不打算通过自身命令提供完整的防火墙功能,而是提供了一种简单的方法来添加或删除简单的规则。
status 命令显示防火墙的状态及通过 UFW 命令管理的基本信息规则。
它不显示 /etc/ufw 文件的规则。要查看防火墙的完整状态,用户可以使用 ufw show raw。这将显示 filter, nat, mangle 和 raw 表,命令如下:
iptables -n -L -v -x -t <table>
ip6tables -n -L -v -x -t <table>
如果默认策略设置为 REJECT,UFW 可能会干扰 UFW 框架之外添加的规则。
IPv6 是默认允许。改变这种行为,只接受在回环接口上的 IPv6 数据,在 /etc/default/ufw 将 IPv6 设置为 no,并重新加载 UFW。 当启用 IPv6,则可以以相同的方式针对 IPv4 规则指定的规则,它们将在 ufw status 命令下被显示。同时匹配 IPv4 和 IPv6 地址的规则适用于两个 IP 版本。
IPv6 借用 IPv4 tunnels 时,需使用第 41 号协议。书写时使用 proto ipv6,并且使用完整语法。例如:
ufw allow to 10.0.0.1 proto ipv6
ufw allow to 10.0.0.1 from 10.4.0.0/16 proto ipv6
支持使用 “Internet 协议安全性 (IPSec)” 协议,协议书写为 esp \ ah(分别是 50 号 \ 51 号协议)。语法必需使用完整结构。例如:
ufw allow to 10.0.0.1 proto esp
ufw allow to 10.0.0.1 from 10.4.0.0/16 proto esp
ufw allow to 10.0.0.1 proto ah
ufw allow to 10.0.0.1 from 10.4.0.0/16 proto ah