本文主要阐述防火墙的基本原理及应用,以及各种常用防火墙的用法,如 Windows 的高级防火墙,Linux 中常用的iptables和firewalld等
原理
实现
Windows 防火墙
Linux 防火墙
Linux 防火墙基于 netfilter/iptables 框架,该框架是集成于 Linux 2.4.X 版本内核中的包过滤防火墙系统,可以实现数据包过滤、网络地址转换以及数据包管理功能。
Linux 系统中的防火墙分为两部分: netfilter 和 iptables。
netfilter 位于内核空间,目前是 Linux 内核的组成部分。netfilter 可以对本机所有流入、流出、转发的数据包进行查看、修改、丢弃、拒绝等等操作。
由于 netfilter 在内核空间中,用户通常无法接触内核和修改内核,此时就需要一个命令行工具。这种命令行工具有很多,比如 iptables, firewalld 等工具。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着四个表和五个链,所有的防火墙策略规则都将被分别写入这些表与链中。
Linux 防火墙因为已经集成在内核中,所以相对于应用层防火墙产品而言,基于内核的 Linux 防火墙更加快捷、高效。
CentOS 7 系统中的防火墙模块放在
/lib/modules/3.10.0-862.el7.x86_64/kernel/net/netfilter/
目录下,当需要某个模块功能时,可以通过modprobe
加载该模块功能。CentOS 7 在原有的 netfilter/iptables 架构基础上又增加了 firewalld。iptables 工具是一个比较低级别的工具,她仅可以调整 IPv4 的防火墙规则,所以在 CentOS 7 系统中使用了 firewalld 作为默认的用户防火墙工具,但当用户使用 firewalld 编写 IPv4 防火墙规则时,firewalld 依然是调用了底层的 iptables 实现具体的功能,只是这个调用过程对用户是透明的。
——引用自 丁明一.Linux运维之道第2版[M].北京: 电子工业出版社,2016: 322-323
iptables
简介
默认的 iptables 规则表有: filter 表(过滤规则表)、 nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表)。
每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和 POSTROUTING(路由后过滤)。防火墙规则需要写入到这些具体的数据链中。
图 6-1 展示了 Linux 防火墙的过滤框架,从图中可以看出,如果是外部主机发送数据包给防火墙本机,数据将会经过 PREROUTING 链与 INPUT 链;如果是防火墙本机发送数据包到外部主机,数据将会经过 OUTPUT 链与 POSTROUTING 链;如果防火墙作为路由负责转发数据,则数据将经过 PREROUTING 链、FORWARD 链以及 POSTROUTING 链。
——引用自 丁明一.Linux运维之道第2版[M].北京: 电子工业出版社,2016: 323
用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Usage: iptables [-t 表名] {-A|-D|-I|-F|-L|-Z|-P} 链名 rule-specification
表名:
filter
nat
mangle
raw
Options:
-A Append
-D Delete
-I Insert
-F Flush
-L List
-R Replace
-Z Zero
-P Preference
链名:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
rule-specification:=([!] 匹配参数)* -j 触发动作
匹配参数:
-p Protocol
-s Source
-d Destination
-i Input interface
-o Output interface
--sport
--dport
--src-range
--dst-range
--limit
--mac-source
--sports
--sports
--state
--string
触发动作:
ACCEPT
DROP
REJECT
LOG
DNAT
SNAT
MASPUERADE 地址欺骗
REDIRECT
iptables 防火墙规则的顺序非常重要,内核按顺序检查这些规则,如果发现有匹配的规则条目,则立刻执行相关动作,停止继续向下查找规则条目,如果所有的防火墙规则都未能匹配成功,则按照默认策略处理
——引用自 丁明一.Linux运维之道第2版[M].北京: 电子工业出版社,2016: 325
示例
1 2 3 4 5 6 7 8 9 10 11 iptables -nL iptables -t nat -nL iptables -F iptables -A INPUT -s 192.168.0.1 -j DROP iptables -I INPUT s 192.168.0.22 -p icmp -j REJECT iptables -nL --line-number iptables -D INPUT 1 iptables -R INPUT 2 ! -s 192.168.0.254 -j REJECT iptables -t filter -P INPUT ACCEPT iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG iptables -I INPUT -i eno16777736 -p tcp --dport 80 -j ACCEPT——引用自 丁明一.Linux运维之道第2版[M].北京: 电子工业出版社,2016: 325
案例
参见 丁明一.Linux运维之道第2版[M].北京: 电子工业出版社,2016: 326-328
备份与还原
默认的 iptables 防火墙规则会立刻生效,但如果不保存,当计算机重启后所有的规则都将丢失,所以对防火墙规则进行及时保存的操作是非常必要的。
iptables 软件包提供了两个非常有用的工具,我们可以使用该工具处理大量的防火墙规则。这个工具分别是 iptables-save 和 iptables-restore, 使用该工具实现防火墙规则的保存与还原。这两个工具的最大优势是处理庞大的规则集时速度非常快。
CentOS 7 系统中防火墙规则默认保存在 /etc/sysconfig/iptables 文件中,使用 iptables-save 将规则保存至该文件中可以实现保存防火墙规则的作用,计算机重启后会自动加载该文件中的规则。如果使用 iptables-save 将规则保存至其他位置,可以实现备份防火墙的作用。当防火墙规则需要做还原操作时,可以使用 iptables-restore 将备份文件直接导入当前防火墙规则。
1 2 3 iptables-save > /etc/sysconfig/iptables iptables-save > firewall.bak iptables-restore < firewall.bak——引用自 丁明一.Linux运维之道第2版[M].北京: 电子工业出版社,2016: 329
firewalld
简介
firewalld 将所有的网络流量分类汇集到 zones 中,firewalld 通过 zones 管理防火墙规则。每一个进入系统的数据包,都会首先检查她的源 IP 地址和接口(进出的网卡接口),如果地址与某个 zone 匹配,则该 zone 中的规则将生效。
而每个 zone 都会有开启或关闭的服务和端口的列表,以实现允许或拒绝连接服务和端口。如果数据包的源 IP 地址和网卡接口都不能和任何 zone 匹配,则该数据包将匹配默认 zone,一般情况下是一个名称为 public 的默认 zone。
firewalld 会提供 block、dmz、drop、external、home、internal、public、trusted、work 这九个 zone。比如,有一个数据包从 eno16777736 网卡进入本机,根据规则该数据包被导向到了 work 这个 zone,而在 work 这个 zone 中有允许访问 http 服务的规则,则最后该数据包将可以进入本机并访问 http 服务。
大部分 zone 都定义有自己的允许规则,规则通过端口/协议(631/udp)或者预定义的服务(ssh)这种形式设置,如果数据包没有匹配这些允许的规则,则该数据包一般会被防火墙拒绝。但有一个名称为 trusted 的 zone,默认会允许所有的数据流量,如果有一个数据包进入了该 zone,则被允许访问所有的资源。
——引用自 丁明一.Linux运维之道第2版[M].北京: 电子工业出版社,2016: 330
官方文档: Firewalld - Fedora Project Wiki
用法
对于 firewalld 这个软件包而言,最常用的命令莫过于firewall-cmd
了,其语法格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Usage: firewall-cmd [OPTIONS...]
OPTIONS:
--get-default-zone
--set-default-zone=<zone>
--get-active-zones
--get-zones
--get-services
--get-zone-of-interface=<interface>
--get-zone-of-source=<source>[/<mask>]
--list-all-zones
--add-service=<service>
--add-port=<portid>[-<portid>]/<protocol>
--add-interface=<interface>
--add-source=<source>[/<mask>]
--list-all
--remove-service=<service>
--remove-port=<portid>[-<portid>]/<protocol>
--remove-source=<source>/[/<mask>]
--remove-interface=<interface>
--permanent
--reload
参见firewall-cmd -h
和man firewall-cmd
获取更多帮助
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=trusted
firewall-cmd --get-active-zones
firewall-cmd --get-zones
firewall-cmd --get-services
firewall-cmd --get-zone-of-interface=eno16777736
firewall-cmd --list-all-zones
firewall-cmd --add-service=ftp --zone=public
firewall-cmd --remove-service=ftp --zone=public
firewall-cmd --add-port=3306/tcp --zone=public
firewall-cmd --remove-port=3306/tcp --zone=public
firewall-cmd --add-interface=eno16777736 --zone=public
firewall-cmd --remove-interface=eno16777736 --zone=trusted
firewall-cmd --add-source=1.1.1.1 --zone=public
firewall-cmd --list-all
firewall-cmd --list-all --zone=public
firewall-cmd --permanent --add-port=3306/tcp --zone=public
firewall-cmd --reload
链接
下面总结了本文中使用的所有链接: