Linux实用工具总结之UFW

UFW,即Uncomplicated Firewall,是基于iptables实现的防火墙管理工具,所以实际上UFW修改的是iptables的规则。之所以不直接使用iptables,而要通过UFW进行管理是因为iptables的规则对于新手入门来说有点难,UFW做了很好的包装。
本文测试环境为Ubuntu 16.04,其他系统可做参考。

Ubuntu系统默认已经安装了UFW,如果没有ufw,可以手动安装:

$ sudo apt-get update
$ sudo apt-get install ufw

允许UFW管理IPV6

sudo vim /etc/default/ufw

确保你的IPV6选项为yes即可:

...
IPV6=yes
...

设置默认规则

UFW默认情况下允许所有的出站连接,拒绝所有的入站连接,所以这里首先将UFW设置为默认规则:

$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing

ufw default也允许使用reject参数

允许SSH连接

一旦启用UFW之后,如果没有允许SSH连接,将无法再通过SSH远程访问主机,所以在开启防火墙之后要确认SSH连接已经设置为允许:

$ sudo ufw allow ssh

这里创建一条规则,允许ssh连接,其实是允许22端口的连接,等价于:

$ sudo ufw allow 22

UFW通过/etc/services知道ssh服务使用的默认端口为22,如果你的SSH服务使用的端口不是22,则应该修改为相应 的端口号。

查看防火墙状态

通过以下命令查看防火墙状态:

$ sudo ufw status verbose

也可以不带verbose,当防火墙处于关闭状态时只会显示inactive
可以查看刚刚添加的防火墙规则:

$ sudo ufw show added

show后面还可以跟其他几项参数,可以通过man手册查看REPORTS

启用UFW命令:

$ sudo ufw enable

该命令默认会将UFW设置为开机启动,如果发现重启后UFW并没有自动启动,可以手动设置UFW服务开机自动启动:

$ sudo systemctl start ufw
$ sudo systemctl enable ufw

记得查看防火墙当前的状态:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)

禁用UFW:

$ sudo ufw disable

该命令会禁用防火墙并关闭其开机自动启动

启用防火墙日志:

$ sudo ufw logging on

可以指定日志级别sudo ufw logging low|medium|high
日志文件在/var/log/ufw.log
内容形如:

Sep 16 15:08:14 <hostname> kernel: [UFW BLOCK] IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=123.45.67.89 DST=987.65.43.21 LEN=40 TOS=0x00 PREC=0x00 TTL=249 ID=8475 PROTO=TCP SPT=48247 DPT=22 WINDOW=1024 RES=0x00 SYN URGP=0

其中前面列出了主机防火墙日志的日期、时间、主机名,后面的内容意思是:

  • [UFW BLOCK]:表示事件描述的开始以及是何种事件。在此例中,它表示阻止了连接。
  • IN:如果它包含一个值,那么代表该事件是传入事件
  • OUT:如果它包含一个值,那么代表事件是传出事件
  • MAC:目的地和源 MAC 地址的组合
  • SRC:IP数据包的源IP
  • DST:目的地的IP
  • LEN:数据包长度
  • TTL:数据 TTL,或称为time to live。
  • PROTO:数据包的协议
  • SPT:数据包的源端口
  • DPT:目标端口
  • WINDOW:发送方可以接收的数据包的大小
  • SYN URGP:指示是否需要三次握手。 0 表示不需要。

禁用防火墙日志:

$ sudo ufw logging off

默认情况下ufw的allow不加in允许连接是指允许入站连接,如果要指定允许出站,可以加上out,如:

$ sudo ufw allow in port #允许port入站
$ sudo ufw allow out port #允许port出站

允许指定端口的所有连接协议

通过刚才设置ssh的规则,可以知道直接allow就是允许连接
允许HTTP 80端口的所有连接:

$ sudo ufw allow http

等价于:

$ sudo ufw allow 80

同样可以允许https的连接:

$ sudo ufw allow https

等价于:

$ sudo ufw allow 443

允许指定端口的指定协议连接

FTP默认端口为21,连接协议为tcp,那么可以这样:

$ sudo ufw allow ftp

等价于:

$ sudo ufw allow 21/tcp

允许指定范围内的端口的指定协议的连接

例如,X11的连接端口范围是6000-6007:

$ sudo ufw allow 6000:6007/tcp
$ sudo ufw allow 6000:6007/udp

允许指定IP的连接

通过查看防火墙状态可以看出有个From:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                  
21/tcp                     ALLOW       Anywhere                  
22 (v6)                    ALLOW       Anywhere (v6)             
21/tcp (v6)                ALLOW       Anywhere (v6)

默认情况是相应端口允许所有IP的连接,可以通过后跟from指定允许某IP的所有连接:

$ sudo ufw allow from 15.15.15.51

允许15.15.15.51的所有入站连接,命令后面跟to any port 22允许端口22的所有连接:

$ sudo ufw allow from 15.15.15.51 to any port 22

允许子网的连接

如果要允许IP段15.15.15.1到15.15.15.254的所有连接:

$ sudo ufw allow from 15.15.15.0/24

并指定连接端口:

$ sudo ufw allow from 15.15.15.0/24 to any port 22

指定允许通过某个网卡的连接

通过命令中加入allow in on即可
首先查看系统中的所有网卡:

$ ip addr

或者:

$ ifconfig

假设这里允许eth0的80端口连接:

$ sudo ufw allow in on eth0 to any port 80

允许出站连接

允许相应端口的出站连接,直接allow后面跟out即可:

$ sudo ufw allow out 34

与允许连接一样,只需要将相应的allow换成deny即可,如拒绝http端口的所有连接:

$ sudo ufw deny http

等价于:

$ sudo ufw deny 80

拒绝指定ip的连接:

$ sudo ufw deny from 15.15.15.51

UFW有两种方式删除防火墙规则,既可以通过规则号删除,也可以通过实际规则删除,通过规则号删除更容易。

通过规则号删除

首先查看所有规则的规则号:

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere                  
[ 2] 21/tcp                     ALLOW IN    Anywhere                  
[ 3] 34                         ALLOW IN    Anywhere                  
[ 4] 34                         ALLOW OUT   Anywhere                   (out)
[ 5] 22                         ALLOW OUT   15.15.15.51                (out)
[ 6] 22 (v6)                    ALLOW IN    Anywhere (v6)             
[ 7] 21/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 8] 34 (v6)                    ALLOW IN    Anywhere (v6)             
[ 9] 34 (v6)                    ALLOW OUT   Anywhere (v6)              (out)

然后直接delete即可,例如删除ftp(21)的连接规则:

$ sudo ufw delete 2
$ sudo ufw delete 7

因为即有ipv6,又有ipv4,所以需要删除2个

通过规则删除

删除allow http规则:

$ sudo ufw delete allow http

等价于:

$ sudo ufw delete allow 80
$ sudo ufw reset

该命令将禁用UFW,并且删除所有已经定义的规则,不过默认该命令会对已经设置的规则进行备份

UFW的所有规则文件都在路径/etc/ufw/,其中before.rules规则为UFW在运行用户自定义的规则之前运行的规则,相应的before6.rules对应IPV6。after.rules为UFW启用用户自定义规则之后运行的规则。user.rules即为用户自定义的规则。
/etc/default/ufw文件为UFW的配置文件。
所以可以通过直接备份这些配置文件的方式来备份防火墙规则,需要备份的文件有:

/etc/ufw/*.rules
/lib/ufw/*.rules

/etc/default/ufw # 这个配置文件如果没有修改过,可以不备份
修改配置文件之后通过以下命令重新加载配置文件:

$ sudo ufw reload

批量禁止IP

$ while read line; do sudo ufw deny from $line; done < file.txt

file.txt里面是一个需要禁止的IP列表

ubuntu的ufw如何开放特定端口?

ufw是一个主机端的iptables类防火墙配置工具

安装:

sudo apt-get install ufw

开启,建议默认关闭所有外部访问

sudo ufw enable 
sudo ufw default deny

查看ufw现在已经开放的端口:

未分类

新增端口

sudo ufw allow 8080

删除端口

sudo ufw delete allow 8080

允许特定来源的ip地址访问

sudo ufw allow from 192.168.1.1

其他命令可以如此查看:

ubuntu@localhost:~$ sudo ufw –help
Usage: ufw COMMAND
Commands:

未分类

Ubuntu 防火墙 ufw

UbuntuHelp:UFW :http://wiki.ubuntu.org.cn/UbuntuHelp:UFW

Ufw使用指南:http://wiki.ubuntu.org.cn/Ufw使用指南

ubuntu ufw防火墙:

http://wap.dongnanshan.com/fn.php?s=ubuntu%20ufw%E9%98%B2%E7%81%AB%E5%A2%99

UFW要领:通用防火墙规则和命令:https://www.howtoing.com/ufw-essentials-common-firewall-rules-and-commands/

Linux 防火墙:https://blog.csdn.net/freeking101/article/details/70239637

自打2.4版本以后的Linux内核中, 提供了一个非常优秀的防火墙工具。这个工具可以对出入服务的网络数据进行分割、过滤、转发等等细微的控制,进而实现诸如防火墙、NAT等功能。

一般来说, 我们会使用名气比较的大iptables等程序对这个防火墙的规则进行管理。iptables可以灵活的定义防火墙规则, 功能非常强大。但是由此产生的副作用便是配置过于复杂。一向以简单易用著称Ubuntu在它的发行版中,附带了一个相对iptables简单很多的防火墙配置工具:ufw。

ufw防火墙 即uncomplicated firewall(不复杂的防火墙)是iptables的接口,旨在简化配置防火墙的过程。 繁琐部分的设置还是需要去到iptables。虽然iptables是一个坚实和灵活的工具,但是初学者可能很难学会如何使用它来正确配置防火墙。如果您希望开始保护网络安全,并且不确定使用哪种工具,UFW可能是您的最佳选择。

Ubuntu下使用UFW配置防火墙(简化iptables的操作)

UFW全称为Uncomplicated Firewall,是Ubuntu系统上配置iptables防火墙的工具,即ufw是一个iptables的前端应用程序。UFW提供一个非常友好的命令用于创建基于IPV4,IPV6的防火墙规则。但是,UFW是没有界面的,就是用命令的那一种,所以,操作起来就不是那么的方便,有人帮它写了个界面,名字就叫做“Gufw”。
由于Ubuntu下的iptables操作起来比较复杂,依赖关系比较多,所以使用UFW时可以简化很多操作。当然Debian同样适用。
无论是桌面版还是服务器版, UFW的命令行用法是一样的。

1. 安装

Ubuntu的防火墙默认已安装,若无意中卸载,执行以下命令安装

sudo apt-get install ufw

查看防火墙状态

sudo ufw status
sudo ufw status numbered  # 按编号显示

防火墙版本

sudo ufw version

2. 启动、禁用、重置UFW

sudo ufw enable    # 设置开机启动
sudo ufw deny       # 关闭所有外部对本机的访问,但本机访问外部正常。    
sudo ufw reset       # 重置防火墙

3.开启/禁用

用法:sudo ufw allow|deny [service]

高级规则:

除了基于端口的允许或阻止,UFW 还允许您按照 IP 地址、子网和 IP 地址/子网/端口的组合来允许/阻止。

ufw deny from {ip-address-here} to any port {port-number-here}
sudo ufw deny from 202.54.1.5 to any port 80    # 阻断或拒绝IP地址202.54.1.5访问80端口的请求

拦截特定IP、端口以及协议

sudo ufw deny proto {tcp|udp} from {ip-address-here} to any port {port-number-here}


例如,阻断IP地址202.54.1.1访问tcp 22端口(FTP协议),可以输入:

sudo ufw deny proto tcp from 202.54.1.1 to any port 22
sudo ufw status numbered



UFW拦截子网 语法是类似的:

sudo ufw deny proto tcp from sub/net to any port 22
sudo ufw deny proto tcp from 202.54.1.0/24 to any port 22


使用示例: 一般用户,只需如下设置:

sudo apt-get install ufw
sudo ufw enable
sudo default deny


以上三条命令已经足够安全了,如果你需要开放某些服务,再使用sudo ufw allow开启。

sudo ufw deny from 192.168.1.5 to any # 拦截或拒绝来自192.168.1.5的所有数据包
sudo ufw allow from 123.45.67.89 # 允许从一个 IP 地址连接:
sudo ufw allow from 123.45.67.89/24 # 允许特定子网的连接:


允许特定 IP/端口的组合:

sudo ufw allow from 123.45.67.89 to any port 22 proto tcp


proto tcp 可以删除或者根据你的需求改成 proto udp,所有例子的 allow 都可以根据需要变成 deny。 sudo ufw allow www 或 sudo ufw allow 80/tcp sudo ufw allow ftp 或 sudo ufw allow 21/tcp sudo ufw allow 22/tcp 允许所有的外部IP访问本机的22/tcp (ssh)端口 sudo ufw allow 53 # 允许外部访问53端口(tcp/udp) sudo ufw allow 80 # 允许外部访问80端口 等价 sudo ufw allow http sudo ufw delete allow 80 # 禁止外部访问80 端口 sudo ufw allow from 192.168.1.1 # 允许此IP访问所有的本机端口 sudo ufw allow from 111.111.111.111 to any port 22 # 允许特定IP特定端口的连接 sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53 sudo ufw deny smtp # 禁止外部访问smtp服务 sudo ufw allow smtp  允许所有的外部IP访问本机的25/tcp (smtp)端口 sudo ufw delete allow smtp # 删除上面建立的某条规则 sudo ufw deny http # 拒绝http连接 sudo ufw deny from 111.111.111.111 # 拒绝特定IP连接

允许特定端口范围连接

sudo ufw allow 1000:2000/tcp
sudo ufw allow 2001:3000/udp

# 拒绝所有的TCP流量从10.0.0.0/8 到192.168.0.1地址的22端口
sudo ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 22

# 可以允许所有RFC1918网络(局域网/无线局域网的)访问这个主机(/8,/16,/12是一种网络分级):
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

这样设置已经很安全,如果有特殊需要,可以使用sudo ufw allow开启相应服务

设置默认策略(默认策略即为拒绝所有传入连接,允许所有传出链接)

sudo ufw default deny incoming
sudo ufw default allow outgoing

允许SSH连接(重要!)否则你将无法连接云服务器…

# 以下两条命令效果是一样的
sudo ufw allow ssh
sudo ufw allow 22

4. 删除规则

有两种删除防火墙规则的方法,最直接的方法是:

sudo ufw delete allow ssh

如上,我们在 delete 指令后面输入要删除的规则即可。还可以这样:

sudo ufw delete allow 80/tcp

sudo ufw delete allow 1000:2000/tcp

如果规则又长又复杂,问题就比较棘手了。这里有一个更简单的方法,需要分成两个步骤:

sudo ufw status numbered    # 按规则来编号防火墙规则。命令会将所有防火墙规则以数字列表形式列出来
# 请将 [number] 替换成规则列表对应的数字序号。
sudo ufw delete 1           # 按规则编号删除防火墙规则 sudo ufw delete [number]
sudo ufw delete 4           # 删除编号为4的规则

5. 开启/关闭防火墙 (默认设置是’disable’)

sudo ufw enable|disable 

6. 编辑 UFW 的配置文件

虽然可以通过命令行添加简单的规则,但仍有可能需要添加或删除更高级或特定的规则。 在运行通过终端输入的规则之前,UFW 将运行一个文件 before.rules,它允许回环接口、ping 和 DHCP 等服务。要添加或改变这些规则,编辑 /etc/ufw/before.rules 这个文件。 同一目录中的 before6.rules 文件用于 IPv6 。

还存在一个 after.rule 和 after6.rule 文件,用于添加在 UFW 运行你通过命令行输入的规则之后需要添加的任何规则。
还有一个配置文件位于 /etc/default/ufw。 从此处可以禁用或启用 IPv6,可以设置默认规则,并可以设置 UFW 以管理内置防火墙链。

启用 IPv6 支持

如果你的云服务器启用了 IPv6,则需要配置 UFW 以启用支持,编辑 UFW 配置文件:

sudo nano /etc/default/ufw

在配置文件中将 IPV6 设置为 yes :

IPV6=yes

保存并退出编辑器,重启 UFW:

sudo ufw disable
sudo ufw enable

这样,UFW 就同时支持 IPv4 和 IPv6 两种协议了。

更详细的说明

[]是代表可选内容。可能需要root权限,如无法运行,请使用 sudo ufw……的命令结构。“”中的内容不能照抄,要按需要更改。
ufw [--dry-run] enable|disable|reload
命令[–试运行]激活|关闭|重新载入
ufw [--dry-run] default allow|deny|reject [incoming|outgoing]
命令[–试运行]默认 允许|阻止|拒绝 [访问本机的规则|向外访问的规则]
注:reject让访问者知道数据被拒绝(回馈拒绝信息)。deny则直接丢弃访问数据,访问者不知道是访问被拒绝还是不存在该主机。
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]
命令[–试运行][删除] [插到“x号规则”之前] 允许|阻止|拒绝|限制 [进|出] [记录新连接|记录所有数据包] “端口” [/“协议”]
ufw  [--dry-run]  [delete] [insert NUM] allow|deny|reject|limit [in|out on INTERFACE] [log|log-all] [proto protocol] [from ADDRESS [port PORT]] [to ADDRESS [port PORT]]
命令 [–试运行][删除][插到x号规则之前] 允许|阻止|拒绝|限制 [进|出 基于“什么网络设备”] [协议 “协议”] [来源 “地址” [端口 “端口”]] [目标 “地址” [端口 “端口”]]
ufw [--dry-run] delete NUM
命令[–试运行] 删除 “第X号规则”
ufw [--dry-run] app list|info|default|update
命令 [–试运行] 程序 清单|信息|默认|更新

参数
–version
显示程序版本号
-h , –help
显示帮助信息
–dry-run
不实际运行,只是把涉及的更改显示出来。
enable
激活防火墙,开机时自动启动
disable
关闭防火墙,开机时不启动
reload
重新载入防火墙
default allow|deny|reject 方向
方向是指:向内(incoming)|向外(outgoing)。如果更改了默认策略,一些已经存在的规则可能需要手动修改。更多内容看“规则示例”一节。
logging on|off|“级别”
切换日志状态。日志记录包使用的是系统日志。“级别”有好几个,默认是低级(low)。详细内容看“日志”一节。
reset [--force]
关闭防火墙,并复位至初始安装状态。如果使用–force选项,则忽略确认提示。
status
显示防火墙的状态和已经设定的规则。使用status verbose显示更详细的信息。‘anywhere’与‘any’、‘0.0.0.0/0’一个意思。
show “报告类型”
显示防火墙运行信息。详细内容看“报告类型”
limit “规则”
此命令目前只能用于IPv4。还不支持IPv6.

规则示例
    * 规则可以简写也可以完整表达。简写的规则只能指定端口和(或)协议被允许或阻止。默认是访问本机的规则(incoming)。例如:
ufw allow 53
允许其它机子访问本机53端口,协议包含tcp和udp。
    * 如果要控制协议,只要加入“/协议”在端口后面就行了。例如:
ufw allow 25/tcp
允许其它机子使用tcp协议访问25端口。
    * UFW也可以检查 /etc/services文件,明白服务的名字及对应的端口和协议。我们使用服务的名称即可。
ufw allow smtp
    * UFW同时支持出入口过滤。用户可以使用in或out来指定向内还是向外。如果未指定,默认是in。例如:
ufw allow in http
ufw reject out smtp
ufw deny out to 192.168.1.1
阻止向192.168.1.1发送信息
    * 用户也可使用完整的规则来指定来源与目的地,还有端口。书写规则基于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
This will deny all traffic from the RFC1918 Class A network to tcp port 25 with the address 192.168.0.1.(这条命令目前无法翻译 from 和 to的关系,希望后来者更改)
    * ufw也可以使用IPv6协议。但要事先在/etc/default/ufw 中设定IPv6为启动状态。举例:
ufw deny proto tcp from 2001:db8::/32 to any port 25
阻止IPv6为2001:db8::/32类型的地址,连接本机25端口
    * ufw可以连续例举端口号。端口号间必须使用逗号或分号,不能使用空格。“输入端口号”字符数最多不能超过15过(8080:8090算两个字符)。比如允许80,443,8080~8090这几个端口接受tcp传入连接。
ufw allow proto tcp from any to any port 80,443,8080:8090
此例,“输入端口号”字符数为4个。
    * ufw可以对连接数率进行限制,以防范暴力登录攻击。如果同一个IP地址在30秒之内进行了6次及6次以上的连接,ufw将阻止(deny)该连接。可以查看更多信息。
ufw limit ssh/tcp
    * 当然有些时候我们想让访问者知道他的访问被拒绝了,而不是保持沉默让他不知道哪出了问题。就使用reject代替deny
ufw reject auth
    * 默认情况下ufw的所有规则针对所有网络设备(比如网卡1,网卡2,无线网卡1,虚拟网卡1……)。但是我们可以特别指定,某规则在什么网络设备上生效。注意只能使用设备号,不能用别名。比如有线网卡:eth0(你可以使用ifconfig命令查看你现有的网络设备)
ufw allow in on eth0 to any port 80 proto tcp
    * 要删除规则,只要在命令中加入delete就行了。比如:
ufw deny 80/tcp
要删除条命令建立的规则,使用:
ufw delete deny 80/tcp
当然,也可以使用规则号来进行删除。比如要第3号规则
ufw delete 3
注意,如果你开启IPv6功能。要同时删除IPv4和IPv6的规则(比如:ufw allow 22/tcp),如果用规则号的方式删除可能只删除了一个。
    * 显示第几号规则,可以使用这样的命令
ufw status numbered(也就是规则号)
    * 日志功能。如果使用log将记录所有符合规则的新连接,如果使用log-all将记录所有符合规则的数据包。例如,要允许并记录shh(22/tcp)上的新连接:
ufw allow log 22/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
最后一条经过测试,范围大约是192.168.0.0~192.168.225.225。当然,涉及很多专业知识,希望有人补充。
远程管理
此章节还未被编辑
应用程序集成管理
* ufw能从 /etc/ufw/applications.d. 中读取应用程序清单。你可以使用命令查看:
ufw app list
 * 大家可以使用应用程序名字来增加规则。比如
ufw allow <程序名字>
ufw allow CUPS
ufw allow from 192.168.0.0/16 to any app <程序名字>
注意,端口号已经被程序名所对应的策略所包括,不要再重新列举端口号。
* 查看程序名所对应的策略内容,命令:
ufw app into <程序名字>
注意:程序名字是清单上有的才行。程序名字改用用all,可以看全部策略。
* 如果你编辑或者增加了程序清单,你可使用此命令更新防火墙:
ufw app update <程序名字>
程序名字改用用all,则更新整个清单。
* 更新清单同时增加规则可以使用如下命令:
ufw app update –add-new <程序名字>
注意:update –add-new参数的行为由此命令配置:
ufw app default skip|allow|deny
默认是skip,也就是没有设定。
警告:如果程序规则设定为default allow ,将会引起很大的风险。请三思而后行!
日志
ufw支持许多日志级别。默认是低级(low),用户也可以自己指定:
ufw logging on|off|low|medium|high|full
    * off 就是关闭日志
    * low 记录与默认策略冲突的封装数据包(记录速度被限制)。记录与规则符合的数据包(没有要求关闭记录的)
    * medium 记录与默认策略冲突的数据包(包括被规则允许的)、无效数据包、所有新连接。记录速度被限制。
    * high 同medium,只是没有记录速度限制。附加记录所有数据包(有记录速度限制)。
    * full 与high等同,只是取消记录限制。
medium级别及更上级会记录许多内容,有可能短时间内撑爆你的硬盘。特别是用在服务器一类的机器上。

配置ufw防火墙,守护你的Ubuntu

起因

  很久以来许许多多人催促着我赶快配置好防火墙规则以保护vps,但是。。。配置繁琐的iptables使我望而却步(其实就是懒

直到我发现了ufw这个神器

UFW 全称为 UncomplicatedFirewall[1],是 Ubuntu 系统上默认的防火墙组件, 为了轻量化配置 iptables 而开发的一款工具。UFW 提供一个非常友好的界面用于创建基于IPV4,IPV6的防火墙规则。
废话不多说,上教程

环境

Ubuntu 16.04

安装

apt install ufw

配置

首先先打开ssh端口

ufw allow ssh

如果你的ssh端口不是默认的22,就

ufw allow 你的ssh端口

打开53端口,使dns功能不受影响

ufw allow 53/tcp

ufw allow 53/udp

可选:打开80,443端口

ufw allow http/tcp

ufw allow https/tcp

然后

ufw default deny

阻断除上述规则外的外部连接(本机外发流量无影响)

ufw enable

启动防火墙,done!

操作指令

  • 启动防火墙 ufw enable
  • 关闭防火墙 ufw disable
  • 更新配置 ufw reload
  • 查看防火墙状态 ufw status

Ubuntu 的ufw 和iptables 的关系

ufw

Uncomplicated FireWall,不是 Ubuntu FireWall 哦,是 debian 系发行版中为了轻量化配置 iptables 而开发的一款工具。

UFW 和 iptables 一样都是匹配原则,匹配到了则忽略剩下的规则,这点就不废话了。

iptables

我们习惯性的会把 iptables 认为是 Linux 上的防火墙,自从 Linux 内核 2.4 之后就集成进主线内核。实际上准确是说,iptables 是一个通过控制 Linux 内核的 netfilter 模块来管理网络数据包的流动与转送的应用软件,其功能包括不仅仅包括防火墙的控制出入流量,还有端口转发等等。

iptables 内部有表 tables、链 chains、规则 rules 这三种概念。

iptables 的每一个 “表” 都和不同的数据包处理有关、决定数据包是否可以穿越的是 “链”、而一条 “规则” 在链里面则可以决定是否送往下一条链(或其它的动作)

那一个包到达网卡的时候,Linux 的如何处理的呢?

我们提到了 iptables 是可以控制 netfilter 模块的,netfilter 内部分为三个表,分别是 filter, nat, mangle,每个表又有不同的链(Chains),每个链下可以有不同的规则(rules)。

filter

在 filter(过滤)表中,也就是防火墙功能的表,定义了三个链。分别是 INPUT, FORWARD, OUTPUT。也就是对包的入、转发、出进行定义的三个过滤链。对于这个 filter 表的操作和控制也是我们实现防火墙功能的一个重要手段;

nat

在 nat(网络地址转换) 表中,也就是我们用以实现地址转换和端口转发功能的这个表,定义了 PREROUTING, POSTROUTING,OUTPUT 三个链;

mangle

netfilter 的 mangle 表则是一个自定义表,里面包括上面 的 filter 以及 nat 表中的各种 chains,它可以让我们进行一些自定义的操作,同时这个 mangle 表中的 chains 在 netfilter 对包 的处理流程中比较优先。

包在 Linux 中的前世今生

未分类

我们大致可以看出:包首先要由 bridge check 来判断属于链路层还是网络层,之后包都会遇到 NAT 或者 mangle 表的 PREROUTING 链,从这 pre 前缀咱能才出来,这是要在路由之前要过的链。

接着当包通过了 PREROUTING 之后,便到了 decision 这个分支点,这里有一个对目的地址的判断,如果包的目的地是本地, 那么包向上走,走入 INPUT 链处理,然后进入 LOCAL PROCESS,之后再进入对应的 OUTPUT、POSTROUTING;

如果非本地,那么就进入 FORWARD 链进行转发,之后再走 POSTROUTING,我们在这里就不说 FORWARD 链的事了。

我们可以看到,filter 表在包的处理流程中,处于中间的位置,这部分也就是防火墙的主要功能所在。

ufw 怎么和 iptables 一起合作的

在稍微理解了包是怎么走的之后,回到我们iptables -L的时候,我们看 filter 表,可以看到,ufw 在 INPUT、FORWARD、OUTPUT 添加了好些自定义规则,并且添加了好些自己的链和链的规则,还把把 INPUT、FORWARD 默认策略设置成 DROP
当你有这些 ufw 定义的链的时候,是能够匹配到 ufw 链和规则,也就是正常入网的。

当我们执行iptables -F的时候,会发生什么呢?

所有链的规则都被清空了!包括 ufw 的链!并且 INPUT、FORWARD 依旧是 DROP

再想想包的前世今生,OUTPUT 我们发出了 ping,但是却因为 INPUT 的 DROP 而永远无法收到 ICMP echo,只能往出发包而不能接收任何类型的包,毫无疑问自然就断网了。

此时ufw status还会告诉你在运行,但是当你使用ufw disable关闭 ufw 时,INPUT 会被设置成 ACCEPT,自然就恢复网络通信了;

当你使用ufw default allow把默认出网规则设置成 allow 时,INPUT 也会被设置成 ACCEPT,当然网络通信恢复了。

所以童鞋们自此应该理解了刚开始理解动图能够 ping 通和不通的原因吧!

使用 ufw 和 iptables 的警告

最后给大家一个警告,当你使用了 ufw 这类前端时,就最好不要再碰 iptables 了,尤其要慎重使用 iptables – 来清空所有链的规则。在不了解 iptables 的表、链、规则之前,盲目的清空 iptables”规则” 就是耍流氓!

试想,假如你在服务器上ufw enable,那么 INPUT 和 FORWARD 就是 DROP,那么当你iptables -F时,不仅仅是 SSH 的例外规则没了,所有出网的包也都出不去了!此时唯一能做的事情就是去 VNC、或者去机房插鼠标键盘显示器。

假如你是买的服务器,为了安全考虑使用密钥认证,并且把用户名设置成了从 openssl 生成的随机密码,并且你是由 Windows 重装成的 Linux,那么控制台也是没有用的…… 重装或者快照吧。

开启ufw防火墙的一些命令

UFW,即Uncomplicated Firewall,是基于iptables实现的防火墙管理工具,旨在简化配置防火墙的过程,所以实际上UFW修改的是iptables的规则。虽然iptables是一个坚实而灵活的工具,但初学者很难学习如何使用它来正确配置防火墙。如果您希望开始保护您的网络,并且您不确定使用哪种工具,UFW可能是您的正确选择。

本文测试环境为Ubuntu 16.04,其他系统可做参考。

0x01. 温馨提示

如果是远程操作的话,请做好定时防火墙失效,防止自己连接不上。

每10分钟关闭防火墙

$ crontab -e
#*/10 * * * * /data/shell/stop_ufw.sh

非常简单的代码

$ cat /data/shell/stop_ufw.sh 
#!/bin/bash
/usr/sbin/ufw disable

0x02. 环境要求

Ubuntu系统默认已经安装了UFW,如果没有ufw,可以手动安装:

$ sudo apt-get update
$ sudo apt-get install ufw

0x03. 基础配置

允许UFW管理IPV6

如果您的Ubuntu服务器网络支持IPv6,请确保UFW配置为支持IPv6,以便除了IPv4之外还将管理IPv6的防火墙规则。

sudo vim /etc/default/ufw
确保你的IPV6选项为yes即可:

IPV6=yes

设置默认规则

UFW默认情况下允许所有的出站连接,拒绝所有的入站连接,所以这里首先将UFW设置为默认规则:

$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing

ufw default也允许使用reject参数

允许SSH连接

一旦启用UFW之后,如果没有允许SSH连接,将无法再通过SSH远程访问主机,所以在开启防火墙之前要确认SSH连接已经设置为允许:

$ sudo ufw allow ssh

这里创建一条规则,允许ssh连接,其实是允许22端口的连接,等价于:

$ sudo ufw allow 22

UFW通过/etc/services知道ssh服务使用的默认端口为22,如果你的SSH服务使用的端口不是22,则应该修改为相应 的端口号。

查看防火墙状态

通过以下命令查看防火墙状态:

$ sudo ufw status verbose

也可以不带verbose,当防火墙处于关闭状态时只会显示inactive
可以查看刚刚添加的防火墙规则:

0x04. 启用/禁用UFW

启用UFW命令:

$ sudo ufw enable

该命令默认会将UFW设置为开机启动,如果发现重启后UFW并没有自动启动,可以手动设置UFW服务开机自动启动:

$ sudo systemctl start ufw
$ sudo systemctl enable ufw

记得查看防火墙当前的状态:

$ sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere

禁用UFW命令:(该命令会禁用防火墙并关闭其开机自动启动)

$ sudo ufw disable

0x05. 启用/禁用防火墙日志

启用防火墙日志:

$ sudo ufw logging on

禁用防火墙日志:

$ sudo ufw logging off

可以指定日志级别sudo ufw logging low|medium|high
日志文件在/var/log/ufw.log
内容形如:

Oct 11 11:51:31 store42 kernel: [45088.074036] [UFW BLOCK] IN=eno1 OUT= MAC=80:18:44:e1:ae:68:00:0f:e2:b1:01:01:08:00 SRC=60.169.78.143 DST=183.60.192.48 LEN=40 TOS=0x00 PREC=0x00 TTL=244 ID=1991 PROTO=TCP SPT=44007 DPT=8080 WINDOW=1024 RES=0x00 SYN URGP=0

其中前面列出了主机防火墙日志的日期、时间、主机名,后面的内容意思是
[UFW BLOCK]:表示事件描述的开始以及是何种事件。在此例中,它表示阻止了连接。
IN:如果它包含一个值,那么代表该事件是传入事件
OUT:如果它包含一个值,那么代表事件是传出事件
MAC:目的地和源 MAC 地址的组合
SRC:IP数据包的源IP
DST:目的地的IP
LEN:数据包长度
TTL:数据 TTL,或称为time to live。
PROTO:数据包的协议
SPT:数据包的源端口
DPT:目标端口
WINDOW:发送方可以接收的数据包的大小
SYN URGP:指示是否需要三次握手。 0 表示不需要。

0x06. 允许连接

默认情况下ufw的allow不加in允许连接是指允许入站连接,如果要指定允许出站,可以加上out,如:

$ sudo ufw allow in port #允许port入站
$ sudo ufw allow out port #允许port出站

允许指定端口的协议

通过刚才设置ssh的规则,可以知道直接allow就是允许连接
允许HTTP 80端口的所有连接:

$ sudo ufw allow http

等价于:

$ sudo ufw allow 80

允许指定范围内的端口协议

例如,X11的连接端口范围是6000-6007:

$ sudo ufw allow 6000:6007/tcp
$ sudo ufw allow 6000:6007/udp

允许指定IP的连接

$ sudo ufw allow from 192.168.1.100

允许192.168.1.100访问指定端口(22端口):

$ sudo ufw allow from 192.168.1.100 to any port 22

允许子网的连接

允许IP段192.168.1.1到192.168.1.254的所有连接

$ sudo ufw allow from 192.168.1.0/24

允许IP段192.168.1.0/24 访问指定端口(22端口)

$ sudo ufw allow from 192.168.1.0/24 to any port 22

指定允许通过某个网卡的连接

假设这里允许eth0的80端口连接:

$ sudo ufw allow in on eth0 to any port 80

0x07. 拒绝连接

与允许连接一样,只需要将相应的allow换成deny即可,如拒绝http端口的所有连接:

$ sudo ufw deny http

等价于:

$ sudo ufw deny 80

拒绝指定ip的连接:

$ sudo ufw deny from 192.168.1.100

0x08. 删除规则

UFW有两种方式删除防火墙规则,既可以通过规则号删除,也可以通过实际规则删除,通过规则号删除更容易。

通过规则号删除
首先查看所有规则的规则号:

$ sudo ufw status numbered
Status: active
     To                         Action      From
     --                         ------      ----
[ 1] 80/tcp                     ALLOW IN    Anywhere                  
[ 2] 443/tcp                    ALLOW IN    Anywhere                  
[ 3] 22/tcp                  ALLOW IN    Anywhere          
[ 4] Anywhere                   ALLOW IN    192.168.1.0/24

然后直接delete即可,例如删除https(443)的连接规则:

$ sudo ufw delete 2

通过规则删除
删除allow http规则:

$ sudo ufw delete allow 80

0x09. 重置防火墙规则

$ sudo ufw reset

该命令将禁用UFW,并且删除所有已经定义的规则,不过默认该命令会对已经设置的规则进行备份

0x10. 备份/还原规则

UFW的所有规则文件都在路径/etc/ufw/,其中before.rules规则为UFW在运行用户自定义的规则之前运行的规则,相应的before6.rules对应IPV6。after.rules为UFW启用用户自定义规则之后运行的规则。user.rules即为用户自定义的规则。
/etc/default/ufw文件为UFW的配置文件。
所以可以通过直接备份这些配置文件的方式来备份防火墙规则,需要备份的文件有:

/etc/ufw/.rules
/lib/ufw/.rules

/etc/default/ufw # 这个配置文件如果没有修改过,可以不备份
修改配置文件之后通过以下命令重新加载配置文件:

$ sudo ufw reload

0x11. 其他

批量禁止IP

$ while read line; do sudo ufw deny from $line; done < file.txt

file.txt里面是一个需要禁止的IP列表

参考:
1.How To Set Up a Firewall with UFW on Ubuntu
2.How to Configure a Firewall with UFW

http://notes.maxwi.com/2017/01/19/linux-command-tools-ufw/

让docker处于ufw防火墙的控制下

最近在使用docker时遇到了一个大坑:运行一个实例时,将宿主机的一个端口映射到docker的一个实例,也就是使用-p 8080:80命令运行后,端口呢是能在宿主机上直接访问了,但是我突然发现我在本地居然也能访问服务器上的8080端口号,这就不科学了,因为我通过ufw把8080禁止的呀!

查资料可知,dockerz直接在iptables上进行修改,ufw的设置对它没有作用。下面是解决办法。

修改ufw默认的配置

vim /etc/default/ufw

#把DEFAULT_FORWARD_POLICY修改为下面
DEFAULT_FORWARD_POLICY="ACCEPT"

修改docker的默认配置

取消注释DOCKER_OPTS这行,在参数后添加添加-iptables=false

vim /etc/default/docker

#修改文件
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -iptables=false"

修改/etc/ufw/before.rules

vim /etc/ufw/before.rules

在`*filter`前面添加下面内容
###########我是分割线############
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT
###########我是分割线############

新增文件/etc/docker/daemon.json

vim /etc/docker/daemon.json

###########我是分割线############
{
"iptables": false
}
###########我是分割线############

重启系统

reboot

如何使用UFW配置防火墙

安装UFW

UFW已经默认包含在Ubuntu中,不过Arch和Debian系统应该也是安装好了的。 Debian可以使用systemd启动UFW,并能够开机启动,Arch则没有设置。默认情况下,UFW的规则集为空,因此即使UFW守护程序在运行,也不会强制执行任何防火墙规则。

Arch Linux

1.安装UFW:

  1. sudo pacman -S ufw

2.启动和激活UFW systemd unit:

  1. sudo systemctl start ufw
  2. sudo systemctl enable ufw

Debian / Ubuntu

1.安装UFW:

  1. sudo apt-get install ufw

使用UFW管理防火墙规则

设置默认规则

大多数系统只需要打开少量的端口让连接进入,其余的端口则关闭。 从一个简单基础的规则开始,可以使用ufw default命令来设对入站和出站连接设置默认响应规则。 要拒绝所有入站连接并允许所有出站连接,运行:

  1. sudo ufw default allow outgoing
  2. sudo ufw default deny incoming

ufw default命令还允许使用reject参数。

添加规则

可以通过两种方式添加规则:通过端口号或使用服务名称。
例如,要允许ssh端口22上的入站和出站连接,可以运行:

  1. sudo ufw allow ssh

也可以运行:

  1. sudo ufw allow 22

同样,要拒绝某个端口(在本例中为111)上的流量,您只需运行:

  1. sudo ufw deny 111

要进一步微调规则,您还可以允许TCP或UDP的数据包。 以下将允许端口80上的TCP数据包:

  1. sudo ufw allow 80/tcp
  2. sudo ufw allow http/tcp

而这将允许1725的UDP数据包:

  1. sudo ufw allow 1725/udp

高级规则

除了基于端口的设置允许或拒绝规则,UFW还允许您通过IP地址,子网和IP地址/子网/端口组合设置允许/阻止规则。
允许一个IP地址的连接:

  1. sudo ufw allow from 123.45.67.89

允许一个特定子网的连接:

  1. sudo ufw allow from 123.45.67.89/24

允许一个特定IP地址/端口的组合连接:

  1. sudo ufw allow from 123.45.67.89 to any port 22 proto tcp

proto tcp可以删除或改为proto udp,并且allow可以根据需要更改为deny。

删除规则

要删除规则,在规则前添加delete。 如果您不再希望允许HTTP流量,您可以运行:

  1. sudo ufw delete allow 80

激活防火墙

你的规则设置完成后,ufw初始运行状态可能会输出Status:inactive。 启用UFW并强制执行防火墙规则:

  1. sudo ufw enable

同样的,禁用防火墙规则:

  1. sudo ufw disable