UFW介绍

UFW全称为Uncomplicated Firewall,是Ubuntu系统默认的防火墙配置工具,开发者可以使用它轻松的配置iptables,UFW提供了友好的方式来创建ipv4和ipv6的host-based firewall。默认情况下UFW是禁用状态。

UFW in Ubuntu

Ubuntu 8.04 LTS开始引入ufw,之后的版本也默认安装了ufw。

Ubuntu各版本中可用的ufw版本

  • Ubuntu 12.04 LTS: 0.31.1-1
  • Ubuntu 14.04 LTS: 0.34~rc-0ubuntu2
  • Ubuntu 16.04 LTS: 0.35-0ubuntu2
  • Ubuntu 16.10: 0.35-2
  • Ubuntu Core: 0.35pre

UFW基本语法及示例

默认规则

当你启用UFW后,默认规则会很好的应付普通用户的需求,对于开发者来说这个只是最基本的需求。总而言之,启用UFW后所有的'incoming'都会被拒绝,只有一些针对普通用户的规则例外。

默认规则ssh服务的22端口是deny的,远程操作时候一定要先添加允许22端口进入的规则ufw allow 22/tcp

启用禁用UFW

启用UFW

启用ufw并使用默认规则:

sudo ufw enable

查看ufw的status(状态):

sudo ufw status verbose   ##verbose表示详细输出

上面的命令输出应如下所示:

ubuntu@qd-140:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
ubuntu@qd-140:~$

可以观察出,incoming应用的是deny规则。但是有一些例外的规则,我们可以通过下面的命令找到:

sudo ufw show raw # raw会显示详细的firewall规则 

也可以查看直接查看规则文件,规则文件存放在==/etc/ufw==目录,后缀名为.rules。

禁用UFW

下面的命令可以禁用ufw:

sudo ufw disable

Allow and Deny (定制规则)

sudo ufw allow <port>/<optional: protocol> #允许流入
sudo ufw deny <port>/<optional: protocol> #拒绝流入

示例一:允许/拒绝使用tcp和udp协议的数据包流入53端口

sudo ufw allow 53 #允许流入
sudo ufw deny 53 #拒绝流入

示例二:只允许/拒绝使用tcp协议的数据包流入53端口

sudo ufw allow 53/tcp  #tcp修改为udp,即只对udp协议起效
sudo ufw deny 53/tcp  #tcp修改为udp,即只对udp协议起效

删除已有规则

删除已有规则,只需要把原始规则名的前缀改成delete即可,如下面的例子:

sudo ufw deny 80/tcp

要删除该规则用下面的命令即可:

sudo ufw delete deny 80/tcp

Services

ufw可以通过位于==/etc/services==文件夹中的服务允许/拒绝该服务的端口通过防火墙,用下面的命令查看服务名:

less /etc/services

下面的示例是用ufw允许/拒绝ssh流入防火墙:

sudo ufw allow ssh  #允许ssh流入
sudo ufw deny ssh #禁止ssh流入

UFW状态

UFW状态可查看ufw当前是启用还是禁用状态,也可以查看当前已经应用到iptables的ufw规则。

检查ufw的状态:

ubuntu@qd-140:~$ sudo ufw status
Status: active  #如果显示inactive表示ufw未启用,同时也看不到下面的规则。

To                         Action  From
--                         ------  ----
22:tcp                     DENY    192.168.0.1
22:udp                     DENY    192.168.0.1
22:tcp                     DENY    192.168.0.7
22:udp                     DENY    192.168.0.7
22:tcp                     ALLOW   192.168.0.0/24
22:udp                     ALLOW   192.168.0.0/24

ufw日志

使用下面的命令禁用/启用日志记录:

sudo ufw logging on  #启用日志记录
sudo ufw logging off  #禁用日志记录

UFW高级语法

ufw也可以使用完整的语法格式,指定要限制的源地址,目标地址,端口号,协议等。

Allow/Deny Access 允许访问

完整的语法格式:

sudo ufw allow/deny from <target> to <destination> port <port number> proto <protocol name> 

示例,允许192.168.1.0/24这个网段通过TCP协议访问服务器的22端口:

sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp

Enable PING

Security by obscurity may be of very little actual benefit with modern cracker scripts.默认UFW允许ping请求,一般情况下需要允许ping请求以便检查网络质量及稳定性。

如果要禁用ping请求,需要编辑==/etc/ufw/before.rules==文件,删除下面几行:

# ok icmp codes
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

或者把"ACCEPT"修改为"DROP":

# ok icmp codes
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j DROP
-A ufw-before-input -p icmp --icmp-type source-quench -j DROP
-A ufw-before-input -p icmp --icmp-type time-exceeded -j DROP
-A ufw-before-input -p icmp --icmp-type parameter-problem -j DROP
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP

使用编号规则

在iptables中,如果有很多条记录的时候,我们根据规则的编号进行编辑会方便很多,ufw也支持这样的方式:

sudo ufw status numbered #编号1,2,3……会显示在每条规则前面
  • 删除规则

ufw可以使用规则的编号来进行删除操作,比如删除编号为1的规则后,其下面的规则将会上移填充被删规则的位置:

sudo ufw delete 1
  • 插入规则
sudo ufw insert 1 allow from <ip address>

ufw Log条目解释

下面是一条ufw的日志:

Feb  4 23:33:37 hostname kernel: [ 3529.289825] [UFW BLOCK] IN=eth0 OUT= MAC=00:1e:67:35:1f:f3:d4:6a:a8:7f:ee:ed:08:00 SRC=444.333.222.111 DST=111.222.333.444 LEN=103 TOS=0x00 PREC=0x00 TTL=52 ID=0 DF PROTO=UDP SPT=53 DPT=36427 LEN=83

各个字段的解释:

  • Date 时间这个字段能很直观的看出主机是否有没入侵,如时间顺序不对或者丢失了一段时间块,很有可能是攻击者删除了其入侵服务器的log。
  • Hostname 就是主机名
  • Uptime 服务器从启动到此条记录经过的时间。
  • Logged Event 简述该日志的时间类型,如==[UFW BLOCK] ==表示该数据包被block掉了。
  • IN 如该字段有值,则表示该数据包是流入服务器的。
  • OUT 如该字段有值,则表示该数据是流出服务器的。
  • MAC This provides a 14-byte combination of the Destination MAC, Source MAC, and EtherType fields, following the order found in the Ethernet II header. See Ethernet frame and EtherType for more information.

这段话的大概意思就是该字段的值包括目标MAC,源MAC及Etherype。如示例中的[00:1e:67:35:1f:f3]:[d4:6a:a8:7f:ee:ed]:[08:00],这里我拆成3段,第一个是目标MAC,第二个源MAC,第三个表示ipv4协议。

  • SRC 该字段表示由哪个IP发起了数据包请求。
  • DST 该字段表示由哪个IP收到了数据包请求。
  • LEN 该字段表示该数据库的长度。
  • TOS I believe this refers to the TOS field of the IPv4 header. See TCP Processing of the IPv4 Precedence Field for more information.

TOS和PREC,笔者表示完全不懂。

  • PREC I believe this refers to the Precedence field of the IPv4 header.
  • TTL 数据包最多可经过n跳路由的限制,在n次路由后如未到达目标主机,就会删除该数据包。更详细的解释请查看'Time to live'
  • ID Not sure what this one is, but it's not really important for reading logs. It might be ufw’s internal ID system, it might be the operating system’s ID.

官方不确定这个ID是干嘛,反正是没多大用……

  • PROTO 该字段表示该发送该数据库使用的协议TCP or UDP。
  • SPT 该字段表示源端口
  • DPT 该字段表示目标端口
  • WINDOW 该字段表示数据包发送者收到服务器返回的包大小
  • RES SYN indicates that this connection requires a three-way handshake, which is typical of TCP connections. URGP indicates whether the urgent pointer field is relevant. 0 means it's not. Doesn’t really matter for firewall log reading。