1.1 防火墙的概念
Firewall(防火墙):组件,工作在网络边缘(主机边缘),对进出网络数据包基于一定的规则检查,并在匹配某规则定义的处理进行处理的一组功能的组件。
防火墙类型:根据工作层次的不同来划分,常见的防火墙工作在 OSI 第三层,即网络层防火墙,工作在 OSI 第七层的称为应用防火墙,或者代理服务器(代理网关)。
网络层防火墙又称包过滤防火墙,在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。优点:对用户来说透明,处理速度快且易于维护。缺点:一旦黑客突破防火墙,就可以轻易地伪造数据包的源地址,目的地址和 IP 的端口号,即 “IP 地址伪造”。
1.2 防火墙分类
硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现;
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;
主机防火墙:服务范围为当前主机;
网络防火墙:服务于防火墙背后的本地局域网,往往处于网络入口或边缘。
1.3 Iptables 的基本认识
Netfilter 组件称为内核空间,它被集成在 linux 内核中。netfilter 是一种内核中用于扩展各种网络服务的结构化底层框架。它是在内核中选取五个位置放了五个 hook function,而这五个 hook function 向用户开放,用户可以通过一个工具(iptables)向其写入规则。
Netfilter 主要由信息过滤表(table)组成,包含了控制 IP 包处理的规则集 (rules)。根据规则所处理的 IP 包的类型,规则被分组放在链(chain)中,从而使内核对来自某些源,前往某些目的地或具有某些协议类型的信息包处置方法,如完成信息包的处理、控制和过滤等工作。
Iptables 也称为用户空间,是一个工作在用户层用来写入规则的工作,写好的规则被送往 netfilter。这些规则告诉内核中的 netfilter 组件如何去处理信息包。
1.4 Iptables 的组成
iptables 有四个表和五个链以及一些规则组成:
- 四个表: filter、nat、mangle、raw
filter 表(过滤规则表,该表根据管理员预设定义的一组规则过滤符合条件的数据包)
nat 表 (地址转换规则表)
mangle (修改数据标记位规则表)
raw (跟踪数据表规则表)
其中最常用的是 filter 表以及 nat 表
- 五个链: INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING 表和链的对应关系:
Filter:INPUT,FORWARD,OUTPUT
Mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
Nat:PREROUTING,OUTPUT,POSTROUTING
Raw:PREROUTING,OUTPUT
添加规则时的考量点:
(1)要实现哪种功能:判断添加在哪张表上;
(2)报文流经的路径:判断添加在哪个链上;
链:链上规则的次序,即为检查的次序;因此隐含一定的法则
(1)同类规则(访问同一应用),匹配范围小的放上面;
(2)不同类规则(访问不同应用),匹配到报文频率较大的放上面;
(3)将那些可由一条规则描述的多个规则合并为一个;
(4)设置默认策略;
2.1 基本命令参数
参数 | 作用 |
---|---|
-p | 设置默认策略:iptables -P INPUT (DROP |ACCEPT) |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I num | 在规则链的头部加入新规则 |
-D num | 删除某一条规则 |
-s | 配置来源地址IP/MASK,加叹号“!”表示除这个IP外 |
-d | 匹配目标地址 |
-i 网卡名称 | 匹配从这块网卡流入的数据 |
-o 网卡名称 | 匹配从这块网卡流出的数据 |
--dport num | 匹配目标端口号 |
--sport num | 匹配来源端口号 |
使用iptables命令-L参数查看已有的防火墙策略:
[root@CentOS7 ~]#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
LOG tcp -- anywhere anywhere tcp dpt:ssh state NEW LOG level warning prefix "want-in-from-port-22"
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
使用iptables命令-F参数清空已有的防火墙策略:
[root@CentOS7 ~]#iptables -F
[root@CentOS7 ~]#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
可以使用-v选项,查看更多的、更详细的详细
[root@CentOS7 ~]#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
解释各字段的含义:
pkts:对应规则匹配到的报文的个数;
bytes:对应匹配到的报文包的大小总和;
target:规则对应的target,往往表示规则对应的“动作”,即规则匹配成功后需要采取的措施;
prot:表示规则对应的协议,是否只针对某些协议应用此规则;
opt:表示规则对应的选项;
in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则;
out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则;
source:表示规则对应的源地址,可以是一个IP,也可以是一个网段;
destination:表示规则对应的目标地址,可以是一个IP,可以是一个网段。
上例中的源地址与目标地址都为anywhere,在iptables默认为我们进行了名称解析,在设置非常多的规则下,如果进行名称解析,效率会比较低,所以,我们可以使用-n选项,表示将不对IP地址进行名称反解,直接显示IP地址
[root@CentOS7 ~]#iptables -nvL -t filter
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
324 37064 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
208 21787 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
可以使用--line-number显示规则编号,也可缩写成--line
[root@CentOS7 ~]#iptables --line-number -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 409 46144 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 381 42675 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
2.2 增加规则
[root@CentOS7 ~]#iptables -t filter -I INPUT -s 192.168.1.106 -j DROP
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 41 packets, 4725 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 192.168.1.106 0.0.0.0/0
上例中,-t指定了要操作的表,此外指定了操作filter表,不使用-t选项指定表时,默认为操作filter表;
使用-I选项,指明将“规则”插入至哪个链中,-I表示insert,即插入的意思,所以-I INPUT表示将规则插入于INPUT链中,即添加规则;
使用-s选项,指明“匹配条件”中的“源地址”,即如果报文的源地址属于-s对应的地址,那么报文则满足条件,-s为source,表示源地址;
使用-j选项,指明当“匹配条件”被满足时,所对应的动作,指定的动作为DROP,当报文的源地址为192.168.1.106时,报文则被DROP(丢弃);
查看filter表中的INPUT链,可以看到规则已经被添加,动作被称之为“target”,“target”字段对应的动作为DROP。
通过192.168.1.106去ping主机107,PING一直没得到回应,iptables规则设置生效
[root@CentOS6 ~]#ping 192.168.1.107
PING 192.168.1.107 (192.168.1.107) 56(84) bytes of data.
可以查看iptables中的规则,已经有92个包被对应的规则匹配到,总计大小8760bytes
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 884 packets, 97171 bytes)
pkts bytes target prot opt in out source destination
92 8760 DROP all -- * * 192.168.1.106 0.0.0.0/0
在filter表的INPUT链中追加一条规则
[root@CentOS7 ~]#iptables -A INPUT -s 192.168.1.106 -j ACCEPT
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 40 packets, 4054 bytes)
pkts bytes target prot opt in out source destination
1235 105K DROP all -- * * 192.168.1.106 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
上例中,-A为append之意,所以,-A INPUT则表示在INPUT链中追加规则,而-I选项则表示在链中“插入规则”,直白的说就是-A表示在链的尾部追加规则,-I表示在链的首部插入规则
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 230 packets, 29536 bytes)
pkts bytes target prot opt in out source destination
1420 120K DROP all -- * * 192.168.1.106 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
通过规则从上自下的匹配的原则,第二条规则并没有生效,所以当前主机仍然无法ping通,此时我们只需将新规则添加添加至INPUT链的最前面就能够ping通主机
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 26 packets, 2904 bytes)
pkts bytes target prot opt in out source destination
5 420 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
192.168.1.106已经可以正常收到响应报文
[root@CentOS6 ~]#ping -c 3 192.168.1.107
PING 192.168.1.107 (192.168.1.107) 56(84) bytes of data.
64 bytes from 192.168.1.107: icmp_seq=1 ttl=64 time=0.349 ms
64 bytes from 192.168.1.107: icmp_seq=2 ttl=64 time=0.317 ms
64 bytes from 192.168.1.107: icmp_seq=3 ttl=64 time=0.290 ms
--- 192.168.1.107 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.290/0.318/0.349/0.031 ms
2.3 删除规则
删除规则有两种方法
- 根据规则的编号去删除规则
- 根据具体的匹配条件与动作删除规则
[root@CentOS7 ~]#iptables --line -vnL INPUT
Chain INPUT (policy ACCEPT 771 packets, 84094 bytes)
num pkts bytes target prot opt in out source destination
1 62 5208 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
2 1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
[root@CentOS7 ~]#iptables -t filter -D INPUT 3
[root@CentOS7 ~]#iptables --line -vnL INPUT
Chain INPUT (policy ACCEPT 10 packets, 1128 bytes)
num pkts bytes target prot opt in out source destination
1 62 5208 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
2 1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
上例中,使用-t选项指定要操作的表,使用-D选项表示删除指定链中的某条规则,-D INPUT 3 表示删除INPUT链中的第3条规则
我们也可以根据具体的匹配条件与动作去删除规则
[root@CentOS7 ~]#iptables -vnL INPUT
Chain INPUT (policy ACCEPT 390 packets, 40752 bytes)
pkts bytes target prot opt in out source destination
62 5208 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
[root@CentOS7 ~]#iptables -D INPUT -s 192.168.1.106 -j ACCEPT
[root@CentOS7 ~]#iptables -vnL INPUT
Chain INPUT (policy ACCEPT 9 packets, 755 bytes)
pkts bytes target prot opt in out source destination
1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
上例中,-D INPUT表示删除INPUT链中的规则,-s表示以对应的源地址作为匹配条件,-j ACCEPT表示对应的动作为接受,上述命令表示删除INPUT链中源地址为192.168.1.106,动作为ACCPET的规则
删除所有的规则可以使用“iptables -t 表名 -F 链名
[root@CentOS6 ~]#iptables -t filter -F INPUT
-F选项为flush之意,即删除指定链中的所有规则,如果不指定链名,只指定表名删除表中的所有规则
强调,在没有保存iptables规则时,请勿随便清空链或者表中的规则
2.4 修改规则
当报文没有被链中的任何规则匹配到时,或者,当链中没有任何规则时,防火墙会按照默认动作处理报文,我们可以修改指定链的默认策略
[root@CentOS7 ~]#iptables -t filter -P FORWARD DROP
Chain FORWARD (policy DROP 0 packets, 0 bytes)
上例使用-t指定要操作的表,使用-P选项指定要修改的链,-P FORWARD DROP表示将表中FORWRD链的默认策略改为DROP
2.5 保存规则
在默认情况下,对防火墙所做出的修改都是”临时的”,但重启iptables服务或者重启服务器以后,我们平常添加的规则或者所作做出的修改将丢失。
centos6中,使用“service iptables save”命令保存规则,规则默认保存在/etc/sysconfig/iptables文件中。
[root@CentOS6 ~]#service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@CentOS6 ~]#cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Mon Oct 23 08:46:46 2017
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [8:1328]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Oct 23 08:46:46 2017
上例,文件中保存了filter表中每条链的默认策略,以及每条链中的规则
centos7中,使用firewall替代了原来的iptables service,但我么也可以通过yum源安装iptables与iptables-service即可,在centos7中安装完成iptables-services后,即可像centos6中一样,通过service iptables save命令保存规则,规则同样保存在/etc/sysconfig/iptables文件中
其他保存方法
使用iptables-save并不能保存当前的iptables规则,但我么可以将当前的iptables规则以“保存后的格式”输出到屏幕上,在配合使用重定向,将规则重定向到/etc/sysconfig/iptables文件中即可
iptables-save > /etc/sysconfig/iptables
我们也可将/etc/sysconfig/iptables中的规则重新载入为当前的iptables规则,但留心,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖
使用iptables-restore命令可以从指定文件中重载规则
iptables-restore < /etc/sysconfig/iptables
重载规则时,现有规则将被覆盖