正文共:3999 字 41 图,预估阅读时间:4 分钟
我们之前在CentOS系统中研究了iptables命令的使用方法(iptables命令简介),还做了简单的应用实验(如何通过iptables配置URL过滤黑名单?、如何通过iptables配置URL过滤白名单?)。
等到CentOS一停服(CentOS 7停服之后该怎么安装软件呢?),切换到Ubuntu发现系统有个用于管理Linux防火墙netfilter的程序ufw,ufw旨在为用户提供易于使用的界面。ufw并不打算通过其命令界面提供完整的防火墙功能,而是提供了一种添加或删除简单规则的简单方法。
接下来,让我们了解一下ufw命令的相关用法。
USAGE/命令
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] [prepend] allow|deny|reject|limit [in|out] [log|log-all] [ PORT[/PROTOCOL] | APPNAME ] [comment COMMENT]
ufw [--dry-run] [rule] [delete] [insert NUM] [prepend] allow|deny|reject|limit [in|out [on INTERFACE]] [log|log-all] [proto PROTOCOL] [from ADDRESS [port PORT | app APPNAME ]] [to ADDRESS [port PORT | app APPNAME ]] [comment COMMENT]
ufw [--dry-run] route [delete] [insert NUM] [prepend] allow|deny|reject|limit [in|out on INTERFACE] [log|log-all] [proto PROTOCOL] [from ADDRESS [port PORT | app APPNAME]] [to ADDRESS [port PORT | app APPNAME]] [comment COMMENT]
ufw [--dry-run] [--force] delete NUM
ufw [--dry-run] app list|info|default|update
OPTIONS/选项
--version
显示程序的版本号并退出。
-h, --help
显示帮助信息并退出。
--dry-run
不修改任何内容,只显示更改。
enable
重新加载防火墙并在启动时启用防火墙。
disable
卸载防火墙并在启动时禁用防火墙。
reload
重新加载防火墙。
default allow|deny|reject DIRECTION
更改DIRECTION流向流量的默认策略,其中DIRECTION是传入、传出或路由之一。请注意,在更改默认策略时,必须手动迁移现有规则。有关deny和reject的详细信息,请参阅“RULE SYNTAX/规则语法”章节。
logging on|off|LEVEL
切换日志记录。记录的数据包使用LOG_KERN系统日志功能。支持rsyslog配置的系统也可以记录到/var/log/ufw.log。指定LEVEL将打开指定LEVEL的日志。默认日志级别为“low/低”。有关详细信息,请参阅“LOGGING/日志”章节。
reset
禁用防火墙并将其重置为安装默认值。还可以提供--force选项来执行重置,而无需确认。
status
显示防火墙和ufw管理规则的状态。使用status verbose命令可以获取额外信息。在状态输出中,“Anywhere”与“any”、0.0.0.0/0(IPv4)和::/0(IPv6)同义。请注意,在使用status命令时,在报告接口时会有细微的差异。例如,如果添加了以下规则:
ufw allow in on ens33 from 192.168.0.0/16
ufw allow out on ens37 to 10.0.0.0/8
ufw route allow in on ens33 out on ens37 to 10.0.0.0/8 from 192.168.0.0/16
ufw limit 2222/tcp comment 'SSH port'
对于输入和输出规则,接口是相对于将防火墙系统作为端点来报告的;而对于路由规则,接口则是相对于数据包流经防火墙的方向来报告的。
show REPORT
显示有关正在运行的防火墙的信息。参见“REPORTS/报告”章节。
allow ARGS
添加允许规则。参见“RULE SYNTAX/规则语法”章节。
deny ARGS
添加拒绝规则。参见“RULE SYNTAX/规则语法”章节。
reject ARGS
添加拒绝规则。参见“RULE SYNTAX/规则语法”章节。
limit ARGS
添加限制规则。参见“RULE SYNTAX/规则语法”章节。
delete RULE|NUM
删除RULE相应的规则。
insert NUM RULE
使用规则编号NUM插入相应的RULE规则
prepend RULE
在规则集的顶部预先添加相应的RULE规则。
RULE SYNTAX/规则语法
用户可以使用简单语法或完整语法指定规则。简单的语法仅指定端口,以及在主机上允许或拒绝的协议(可选)。
这两种语法都支持为规则指定注释。对于现有规则,指定不同的注释将更新注释,指定''将删除注释。
使用简单语法的规则示例:
ufw allow 53
此规则将允许tcp和udp端口53到此主机上的任何地址。若要指定协议,请将“/protocol”附加到端口。例如:
ufw allow 25/tcp
这将允许tcp端口25连接到此主机上的任何地址。如果按名称指定服务,ufw还将检查/etc/services的端口和协议。如:
ufw allow smtp
ufw支持入方向和出方向过滤,用户可以选择为传入或传出流量指定入口或出口方向。如果没有提供方向,则该规则适用于传入流量。如:
ufw allow in http
ufw reject out smtp
ufw reject telnet comment 'telnet is unencrypted'
用户还可以使用更完整的语法,指定源、目的的地址和端口。此语法松散地基于OpenBSD的PF语法。例如
ufw deny proto tcp to any port 80
这将拒绝此主机上TCP端口80的所有流量。另一个例子:
ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 25
这将拒绝从RFC1918(私有互联网的地址分配)定义的A类网络(10.0.0.0/8)到IP地址192.168.0.1的TCP端口25的所有流量。
ufw deny proto tcp from 2001:db8::/32 to any port 25
这将拒绝从IPv6地址2001:db8::/32到此主机上的TCP端口25的所有流量。必须在/etc/default/ufw中启用IPv6才能使IPv6防火墙工作。
ufw deny in on eth0 to 224.0.0.1 proto igmp
这将拒绝eth0接口上去往224.0.0.1的所有IGMP流量。
ufw allow in on eth0 to 192.168.0.1 proto gre
这将允许eth0接口上的所有去往192.168.0.1的GRE流量。
ufw allow proto tcp from any to any port 80,443,8080:8090 comment 'web app'
上述内容将允许所有访问TCP端口80、443和8080-8090的流量,并为规则添加注释。指定多个端口时,端口列表必须是数字的,不能包含空格,并且必须作为一个整体进行修改。例如,在上述示例中,您后续不能仅尝试删除“443”端口。您不能指定超过15个端口(范围计为2个端口,因此上述示例中的端口计数为4)。
ufw支持多种不同的协议。以下内容在任何规则中都有效,并在未指定协议时启用:
tcp、udp
ufw allow proto tcp from any to any
ufw allow proto udp from any to any
以下内容有一定的限制,未指定协议时无法启用:
ah:无端口号有效
esp:无端口号有效
gre:无端口号有效
ipv6:适用于IPv4地址,无端口号
igmp:适用于IPv4地址,无端口号
对于不是发往本主机,但应通过防火墙路由/转发的流量的规则,应在规则之前指定路由关键字(路由规则与PF语法有很大不同,而是考虑了netfilter FORWARD链的约定)。例如:
ufw route allow in on eth1 out on eth2
这将允许所有从eth1流入并且路由到eth2流出的流量穿过防火墙。
ufw route allow in on eth0 out on eth1 to 12.34.45.67 port 80 proto tcp
此规则允许在eth0流入的、在eth1流出的去往任何12.34.45.67的TCP端口80的数据包穿过防火墙。
除了路由规则和策略外,您还必须设置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通常会允许连接,但如果IP地址试图在30秒内发起6个或更多连接,则会拒绝连接。典型用法是:
ufw limit ssh/tcp
有时,最好让发件人知道流量何时被拒绝,而不是简单地忽略它。在这种情况下,使用reject而不是deny。例如:
ufw reject auth
默认情况下,ufw将对所有可用接口应用规则。为了限制这一点,请在INTERFACE上指定DIRECTION,其中DIRECTION是in或out之一(不支持接口别名)。例如,要允许eth0上的所有新传入HTTP连接,请使用:
ufw allow in on eth0 to any port 80 proto tcp
要删除规则,只需在原始规则前加上delete,可以添加或不添加规则注释。例如,如果原始规则是:
ufw deny 80/tcp
使用此选项删除它:
ufw delete deny 80/tcp
您还可以按NUM指定规则,如状态编号的输出所示。例如,如果要删除规则编号“3”,请使用:
ufw delete 3
如果您启用了IPv6,并且正在删除适用于IPv4和IPv6的通用规则(例如“ufw allow 22/tcp”),则按规则编号删除将仅删除指定的规则。要使用一个命令同时删除这两个,请在原始规则前加上delete。
要插入规则,请正常指定新规则,但在规则前加上要插入的规则编号。例如,如果您有四条规则,并且要插入一条新规则作为第三条规则,请使用:
ufw insert 3 deny to any port 22 from 10.0.0.135 proto tcp
同样,要在匹配规则IP类型的所有其他规则之前添加规则,请使用前缀规则:
ufw prepend deny from 1.2.3.4
这对于IPS中的动态防火墙特别有用。重要的是,如果指定的规则是IPv4规则,则它将在所有其他IPv4规则之前添加。如果它是IPv6规则,它将在任何IPv6规则之前添加。
要查看编号规则列表,请使用:
ufw status numbered
ufw支持按规则记录日志。默认情况下,当数据包与规则匹配时,不会执行日志记录。指定log级别将记录所有符合规则的新连接,而log-all将记录符合规则的所有数据包。例如,要允许并记录所有新的SSH连接,请使用:
ufw allow log 22/tcp
有关日志记录的更多信息,请参阅“LOGGING/日志”章节。
示例
拒绝所有对端口53的访问:
ufw deny 53
允许对TCP端口80的所有访问:
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访问UDP端口514:
ufw deny proto udp from 1.2.3.4 to any port 514
允许从1.2.3.5的端口5469访问1.2.3.4的UDP端口5469:
ufw allow proto udp from 1.2.3.5 port 5469 to 1.2.3.4 port 5469
远程管理
当运行ufw enable或通过其启动脚本启动ufw时,ufw将刷新其规则。这是必需的,这样ufw才能保持一致的状态,但它可能会删除现有的连接(例如SSH)。ufw确实支持在启用防火墙之前添加规则,因此管理员可以执行以下操作:
ufw allow proto tcp from any to any port 22
在运行“ufw enable”之前。规则仍将被刷新,但启用防火墙后SSH端口将打开。请注意,一旦ufw被“enabled”,ufw在添加或删除规则时不会刷新规则(但在修改规则或更改默认策略时会)。默认情况下,在SSH下运行时启用防火墙时,ufw将提示。这可以通过使用“ufw --force enable”来禁用。
应用程序集成
ufw通过读取/etc/ufw/applications.d中的配置文件来支持应用程序集成,要列出ufw已知的应用程序配置文件的名称,请使用:
ufw app list
用户可以在添加规则时指定应用程序名称(用空格引用任何配置文件名称)。例如,在使用简单语法时,用户可以使用:
ufw allow <name>
ufw allow OpenSSH
或者对于扩展语法:
ufw allow from 192.168.0.0/16 to any app <name>
ufw allow from 192.168.0.0/16 to any app CUPS
您不应使用任何一种语法指定协议,对于扩展语法,请使用app代替port子句。
可以通过以下方式查看给定应用程序的防火墙配置文件的详细信息:
ufw app info <name>
ufw app info CUPS
其中“<name>”是应用程序列表命令中看到的应用程序之一。用户还可以指定全部以查看所有已知应用程序的配置文件。
应用程序配置文件的语法是简单的.INI格式:
[<name>]
title=<title>
description=<description>
ports=<ports>
“ports”字段可以指定一个以“|”分隔的端口/协议列表,其中协议是可选的。逗号分隔的列表或范围(用“start:end”指定)也可用于指定多个端口,在这种情况下,需要指定协议。例如:
[SomeService]
title=Some title
description=Some description
ports=12/udp|34|56,78:90/tcp
在上述示例中,“SomeService”可用于应用内规则,它指定UDP端口12、TCP和UDP端口34、以及TCP端口56和78-90(包括端点)。
创建或编辑应用程序配置文件后,用户可以运行:
ufw app update <name>
此命令将使用更新的配置文件信息自动更新防火墙。如果为名称指定“all”,则所有配置文件都将被更新。要更新配置文件并自动向防火墙添加新规则,用户可以运行:
ufw app update --add-new <name>
update --add-new命令的行为可以使用以下命令配置:
ufw app default <policy>
默认的应用程序策略是skip,这意味着update --add-new命令将不会执行任何操作。用户还可以指定允许或拒绝的策略,以便update --add-new命令可以自动更新防火墙。警告:对应用程序配置文件使用默认允许策略可能存在安全风险。在使用默认允许策略之前,请仔细考虑安全后果。
LOGGING/日志
ufw支持多个日志级别。当未指定日志级别时,ufw默认为“low”日志级别。用户可以通过以下方式指定日志级别:
ufw logging LEVEL
级别可以是“off/关闭”、“low/低”、“medium/中”、“high/高”和“full/完整”。日志级别定义为:
off:关闭,禁用ufw管理的日志记录。
low:低,记录所有与定义的策略不匹配的阻塞数据包(具有速率限制),以及与记录的规则匹配的数据包。
medium:中,在日志级别低的基础上,加上所有允许的与定义的策略不匹配的数据包、所有无效数据包和所有新连接。所有日志记录都是在限速的情况下完成的。
high:高,在日志级别中的基础上(无速率限制),加上所有有速率限制的数据包。
full:完整,在日志级别高的基础上,取消速率限制。
中等以上的日志级别会产生大量日志输出,并可能很快填满您的磁盘。中等日志级别可能会在繁忙的系统上生成大量日志输出。
如果当前未启用日志记录,则指定“on”会启用日志,且记录日志级别为“low”。
REPORTS/报告
支持以下报告。每个都基于实时系统,除了监听报告外,都是原始iptables格式:
raw
builtins
before-rules
user-rules
after-rules
logging-rules
listening
added
raw原始报告显示了完整的防火墙,而其他报告显示了原始报告中的一个子集。
listening侦听报告将显示处于TCP侦听状态和UDP打开状态的实时系统上的端口,以及接口的地址和端口上侦听的可执行文件。当可执行文件绑定到该端口上的所有接口时,使用“*”代替接口的地址。此信息之后是可能影响此端口上连接的规则列表。这些规则按内核评估的顺序列出,优先匹配第一个。请注意,默认策略未列出,只有启用IPV6时才会显示tcp6和udp6。
added报告显示了在命令行上添加的规则列表。此报告不显示正在运行的防火墙的状态(请改用“ufw status”)。因为规则是由ufw规范化的,所以规则可能看起来与最初添加的规则不同。此外,ufw不记录命令顺序,因此使用等效顺序,在其他规则之后列出仅IPv6规则。
笔记
安装时,ufw被禁用,默认传入策略为拒绝,默认转发策略为否认,默认传出策略为允许,并对传入和转发连接的新连接进行有状态跟踪。除上述内容外,还设置了一个默认规则集,执行以下操作:
-DROP/丢弃带有RH0标头的数据包。
-DROP/丢弃无效数据包。
-ACCEPT/接受某些ICMP数据包(INPUT和FORWARD):IPv4的目标不可达、源抑制、超时、参数问题和回显请求。IPv6的目标不可达、数据包太大、超时、参数问题和回显请求。
-ACCEPT/接受ICMPv6数据包以进行无状态自动配置(INPUT)。
-ACCEPT/接受来自IPv6本地链路(ffe8::/10)地址的ping回复(INPUT)。
-ACCEPT/接受DHCP客户端流量(INPUT)
-DROP/丢弃非本地流量(INPUT)
-ACCEPT/接受mDNS(IPv4为zeroconf/bonjour/avahi 224.0.0.251,IPv6为ff02::fb)进行服务发现(INPUT)
-ACCEPT/接受UPnP(IPv4为239.255.255.250,IPv6为ff02::f)进行服务发现(INPUT)
规则排序很重要,优先匹配第一条规则。因此,在添加规则时,先添加更具体的规则,然后再添加更一般的规则。
ufw并不打算通过其命令界面提供完整的防火墙功能,而是提供了一种添加或删除简单规则的简单方法。
status命令显示有关防火墙状态的基本信息,以及通过ufw命令管理的规则。它不显示/etc/ufw中的规则文件中的规则。要查看防火墙的完整状态,用户可以ufw显示原始状态。这将使用以下命令显示filter、nat、mangle和raw表:
iptables -n -L -v -x -t <table>
ip6tables -n -L -v -x -t <table>
有关更多详细信息,请参阅iptables和ip6tables文档。
如果默认策略设置为REJECT,则ufw可能会干扰在ufw框架之外添加的规则。
默认情况下允许IPV6。要将此行为更改为仅接受环回接口上的IPv6流量,请在/etc/default/ufw中将IPv6设置为“no”,然后重新加载ufw。启用IPv6后,您可以按照与IPv4规则相同的方式指定规则,这些规则将显示为ufw状态。匹配IPv4和IPv6地址的规则适用于这两个IP版本。例如,当启用IPv6时,以下规则将允许IPv4和IPv6流量访问端口22:
ufw allow 22
使用“IPv6”协议(“41”)支持IPv4隧道上的IPv6和6to4。此协议只能使用完整的语法。例如:
ufw allow to 10.0.0.1 proto ipv6
ufw allow to 10.0.0.1 from 10.4.0.0/16 proto ipv6
IPSec通过使用“esp”(“50”)和“ah”(“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
除了命令行界面,ufw还提供了一个框架,允许管理员修改默认行为并充分利用netfilter。有关更多信息,请参阅ufw-framework手册页。
相关命令
ufw-framework、iptables、ip6tables、iptables-restore、ip6tables-restore、sysctl、sysctl.conf。
长按二维码
关注我们吧
在Ubuntu系统手撸一个自动创建SSL证书的SHELL脚本
将iStoreOS部署到VMware Workstation