第十三章 iptables 防火墙(一)
13.1 防火墙简介
防火墙(firewall)一词本是建筑用于,本意是为了保护建筑物不受火灾侵害的。被借鉴到了在网络通信领域中,表示保护局域网或主机不受网络攻击的侵害。
网络中的防火墙设备,可分为三种:代理防火墙、包过滤防火墙、状态监测防火墙。
其中:代理防火墙是代理内网主机上网的设备,可以是路由器,也可以是一台主机两块网卡,一连内网、一连公网,以代替内网主机访问公网资源,又被称为nat(网络地址转换服务器、或nat堡垒服务器);包过滤防火墙是检测所通过数据包,可监测到数据包中源ip、目的ip、源端口、目的端口、标记位等信息,并根据事先制定的通信规则决定数据包是否转发;状态监测防火墙除了可以监测数据包中的内容外,还可以跟踪每个客户的每次通信,当有攻击数据在开始时伪装成正常访问,之后突然开始做攻击时,会被状态监测防火墙监测到并加以屏蔽。
在Linux系统中,防火墙工具使用的是iptables,可实现代理防火墙、包过滤防火墙的功能,而状态监测防火墙一般是企业购买专用的防火墙设备完成的。
tips:本章iptables部分,可以说是本书中最难的一章,需要读者有良好网络通信原理的基础,并且之后的每个案例,都需要认真思考,明白其中的原理与功能。一定要耐心练习,切不可贪速冒进。
13.2 iptables配置
13.2.1 原理介绍
在RHEL7.X之后的系统,默认使用的都是firewall防火墙工具,但其实质上还是基于iptables工作的,可以说,iptables是firewall的核心,firewall只不过是iptables的外壳而已。
iptables采用规则集的方式工作。所谓规则集,就是多个规则的集合,如,我们对内部局域网指定如下规则:
那么这些规则合起来,我们就称之为规则集,因为在审核时,是由上至下逐条审核的,类似于链式结构,所以规则集又称为规则链。
在iptables中,为了应付不同场景,定义了多个链,不同的链会在不同的时机使用,最常用的链共有三个:INPUT、FORWARD、OUTPUT。
iptables因为其包过滤性,可以被应用在路由器上,用以对进出子网或局域网的数据做审核,路由器每做一次通信,都会审核一次相应的规则链。当然,我们也可以把给规则指定在哪一个网络接口(即网卡)上使用,则这条规则仅针对该网卡生效了。
下面我们来介绍一下常规三链的审核时机:
INPUT链:当通信的目的方为本设备时审核INPUT链。即ip数据包中的目的ip为本路由器某网卡ip时。
FORWARD链:当路由器做转发时,审核FORWARD链。
OUTPUT链:当通信的发送方为本设备时审核INPUT链。即ip数据包中的源ip为本路由器某网卡ip时。
tips:关于iptables的具体工作原理,市面或网络上有很多相关教材,但由于iptables的原理比较深奥,不太建议初学者直接参看这些资料。本人不想直接讲解这些内容,容易扰乱大家的思路,所以在这里只简单介绍一下iptbales的基本原理,大家可以在学习完毕本章,对iptables有了一定了解之后再自行去看这些资料,应该会更容易理解一些。
13.2.2 启动iptables
先来看实验图:
图中由路由器连接内网与公网,路由器双网卡,内网卡ip:192.168.10.1,公网卡ip:202.0.0.2。因为我们只做了三台主机的简单实验环境,所以主机A与主B各自的网关都指向所连的路由器网卡。
路由器用一台Linux主机代替,配置双网卡及ip,并开启路由功能。下面我们来看一下具体的iptables命令。
首先,CentOS7.X中默认使用的是firewall防火墙,它是iptables的外壳,或者可以说iptables是被firewall掩盖在之下的,所以要使用iptables必须先关闭firewall,显露出iptables才可以,具体命令如下:
yum -y install iptables iptables-services ---安装相关软件包
systemctl unmask iptables ---解覆盖,即显现iptables
systemctl mask firewalld ---覆盖firewalld
systemctl stop firewalld
systemctl restart iptables
以上是临时启用iptables,关闭firewall,而要让本机重启后直接启用iptables、关闭firewall,则可使用下面的命令:
systemctl enable iptables
systemctl disable firewalld
服务启动后,便可以使用iptables命令了。
13.2.3 默认规则配置
iptables -L ---查看三个链中的规则
图中,可见链中有很多自带的规则,每一行代表一条规则,其中各列的意义如下:
target 列表示操作决定,ACCEPT表示允许,REJECT或DROP表示拒绝
prot 列表示本规则针对的协议
opt 列表示参数、选项
source 列表示针对的源ip
destination 列表示针对的目的ip
最后一列表示 相关参数、状态等介绍,相当于备注
我们可以清除掉然后写入自定义规则
iptables -F ---清空三个链,再次iptables -L 可查看到规则被清空了
下面来演示一下手动定义规则,首先我们看到上图中,每个链后面的()中都有一个policy设置,这是该链的默认规则,表示当某个通信来审核链时,若链中没有匹配的规则,该如何操作,ACCEPT表示默认允许,DROP表示默认拒绝。配置命令如下:
iptables -P INPUT DROP ---设定INPUT链的默认规则为拒绝
那么当我们用ApingR或BpingR时,都会不通了,因为INPUT链把它们拒绝了,注意:此时数据通信的目的方都是路由器,则会审核INPUT链。但是我们可以思考一下,此时ApingB是否通呢?答案是通的,原因是,当ApingB时,路由器的功能是转发数据,转发时审核的是FORWARD链,与INPUT链无关,而FORWARD链的默认规则我们没有改动,仍旧是ACCEPT,所以ApingB通。
为了后面的实验,我们恢复一下默认规则:
iptables -P INPUT ACCEPT
说明:命令中是严格区分大小写的,所以读者一定注意大小写的准确。