防火墙(英文:firewall)是一项协助确保信息安全的设备,会依照包头特定的规则,允许或是限制传输的数据通过。防火墙可以是一台专属的硬件也可以是架设在一般硬件上的一套软件。
防火墙可以分为两类:
1、应用层网关防火墙,顾名思义在应用层上实现
2、包过滤型防火墙,工作在网络层
今天主要为大家说明一下包过滤防火墙的简单应用。
包过滤防火墙是用一个软件查看所流经的数据包的(header),由此决定整个包的命运。根据我们自己制定的规则,它可能会决定丢弃(DROP)这个包,可能会接受(ACCEPT)这个包(让这个包通过),也可能执行其它更复杂的动作。
通过对概念的了解,我们所做的工作就是制定规则和让规则执行,我们用户本身是无法和内核打交道的,如何来实现呢,这里就要提到一个工具,iptables。
iptables 是与最新的 2.6.x 版本Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
因此Iptabbles的实现需要两个组件,netfilter和iptables
netfilter 组件也称为内核空间(kernelspace:即 内核态),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种操作工具,也称为用户空间(userspace:即 用户态),是用户与内核态的一个接口,是防火墙规则编辑器。它使插入、修改和除去信息包过滤表中的规则变得容易。
netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
下面我们就具体说明一下:
Iptables一共有4个表:raw,mangle,nat,filter,优先级从左到右,所谓的优先级,就是表在链中执行的顺序。
Raw:设置raw 一般是为了不让iptables做跟踪链接处理,提高性能
Mangle:用于对数据包的包头头信息的更改
Nat:地址转换
Filter:包过滤
Iptables的5个链
PERROUTING 在路由决策前
INLUT 数据是通往本机
OUTPUT 从本机出去的数据
FORWARD 不进入本机,只是通过本机转发的数据
POSTROUTING 在路由协议后,发送到网卡接口之前
其中表和链的对应关系如下图
了解了这些,我们就开始配置吧
Iptables命令的使用规则
iptables [-t Table] COMMAND CHAINS [creteria] -j ACTION
-t 用来指定我们所要指定规则的表,默认是filter
COMMAND:管理链用到的选项
-A 追加
-I 插入
-D 删除
-R 修改替换
-F 清空链
-N 新建链
-X 删除自定义的空链
-E 重命名自定义的链
-P 定义链的默认策略
-Z 清空计数器
每条规则(包括默认策略)都有两个计数器
一个是被某个规则匹配到的说有数据包的个数
一个是被此规则匹配到的所有数据包的大小之和
-L 查看,又分下面几个子选项
-n 以纯数字的方式显示
-v 详细信息
-x exactly 精确显示计算大小
--line-numbers 编号显示规则
CHAINS 我们要进行操作的链
Creteria:匹配条件,匹配条件又可以分为基本匹配和扩展匹配
基本匹配:
-s SOURCE:IP,NETWORK 源地址,特定ip地址掩码32位,ip地址不能连续
!source 对地址取反
-d 目标地址
-p 协议(tcp|udp|icmp)
-i interface 数据从哪个接口进来
-o interface 数据从哪个接口出去
扩展匹配:(调用iptables的模块,以扩展iptables的匹配扩展,使用 -m) 扩展匹配又分为两项:隐含匹配和显示匹配
隐含匹配,-m 可省略:
-p (tcp|udp|icmp) 指定协议,tcp和udp可以通过指定端口,来转移对某个服务进行控制
-p tcp --sport PORT 源端口 可以指定连续的一段端口
--dport PORT 目标端口
--tcp-flags 根据tcp标志位匹配
-p udp --sport PORT 源端口
--dport PORT 目标端口
-p icmp --icmp-type 8 允许请求
0 允许响应
显示扩展,需要加-m
-m state --state iptables状态检测
-m multiport 多端口单独指定
--source-ports 源端口
--destination-ports 目标端口
-m iprange 一段ip匹配
--src-range 源ip
--dst-range 目标ip
-m connlimit 限定访问次数
--connlimit-above
-m limit 限定速率
--limit 每单位时间访问的次数
--linit-burst 峰值速率,并不使用所有的空闲令牌
-m string 字符限定
--algo bm|kmp (任意都可以,字符串算法)
--string 匹配16进制的字符串-m time
--timestart xx:xx 开始时间 默认00:00
--timestop 停止时间 默认23:59
--days 指定在哪些天限定
--datestart 开始日期
--datestop 结束日期
-j ACTION 处理方法
ACCEPT 接受
DROP 悄悄丢弃
REJECT 强势拒绝
SNAT 源地址转换
DNAT 目标地址转换
下面我们就来就来为大家说明一些实例
我们首先要明白的是规则的定义,我们首先要明白规则定义的数据要经过哪个链,这是很重要的一点。
首先是包过滤
一、包过滤要在filter上实现,不指定表的时候,默认是filter。从图中我们了解到filter包含3个链,分别是INPUT、OUTPUT、FORWARD,我们只需要在这3个链中定义就可以了。
简单的包过滤:
1)定义默认策略
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
将3个包过滤的链默认策略都设为拒绝
2)允许别人访问我们或通过我们访问,假设本机为192.168.0.4
1、允许0.3的地址访问本机,同时我们可以响应,要注意的时候,当我们的默认策略为接收,而拒绝某个主机的时候,在INPUT和OUTPUT上都能实现,根据数据的流程,显然在INPUT上拒绝更快速有效,和节约性能
Iptables -A INPUT -s 192.168.0.3 -d 192.168.0.4 -j ACCEPT
Iptable -A OUTPUT -s 192.168.0.4 -d 192.168.0.3 -j ACCEPT
2.拒绝任何人对任何地址的访问,当我们不指定源地址和目标地址的时候,默认为所有
Iptables -A FARWARD -j DROP
3、在INPUT链第一条规则前插入,允许172.16网段地址的访问
Iptables -I INPUT 1 -s 172.16.0.0/16 -j ACCEPT
4、更改INPUT链中的第一条为拒绝
Iptables -R INNPUT 1 -s 172.16.0.0/16 -j DROP
5、删除INPUT链中的第一条
Iptables -D INPUT 1
6、清空链中所以的规则
Iptables -F INPUT
7、允许某段ip地址对末端ip地址的访问
Iptable -A FARWARD -m iprange -src--range 192.168.0.3-192.168.0.98 -m iprange --dst-range 191.168.1.1-191.168.1.198 -j ACCEPT
3)当客户端通过我们进行服务的访问
1、客户端通过我们访问外网的web服务
Iptables -A FORWARD -s 192.168.0.3-p tcp --tport 80 -j ACCEPT
Iptables -A FORWARD -d 192.168.0.3 -p tcp --sport 80 -j ACCEPT
2、允许客户端使用web服务和ssh服务,ftp服务有其特殊性,我们再下面将会提到
Iptables -A FORWARD -s 192.168.0.3 -m multiport --source-ports 22,80 -j ACCEPT
Iptables -A FORWARD -d192.168.0.3 -m multiport --destination-ports 22,80 -j ACCEPT
4)限定访问的次数、时间和频率,以及请求的内容
1、允许172.16.0.1的主句,访问web服务,每秒一次,最多不超过5次
iptables -A INPUT -d 172.16.0.1 -p tcp --dport 80 -m limit --limit 1/second --limit-brush 5 -j ACCEPT
2、超过2次对ssh的请求就拒绝
iptables -A FORWARD -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
3、限定在早上8点到晚上10点拒绝访问web服务
Iptables -A INPUT -p tcp --dport -m time --timestart 8:00 -m time --stoptime 22:00 -j DROP
4、拒绝用户访问我们网页中带有games字样的内容,注意string只能在对返回的网页数据进行检查
Iptables -A FORWARD -p tcp --sport 80 -m string --algo kmp --string "games" -j DROP
5)自定义链的管理
1、新建链
Iptables -N input-1
2、应用新建链
Iptables -A INPUT -j input-1
3、删除链,在删除自定义的链的时候,一定要先清空链中的规则,如果自定链被使用,也要先删除使用
Iptables -X input-1
6)基于tcp包头标识为进行控制
1、允许tcp协议的请求信息
Iptables -A INPUT -p tcp --tcp-flags ACK,SYN,RST,FIN SYN -j ACCEPT
2、对与那些不符合tcp状态的包拒绝
Iptables -A INOUT -p tcp --tcp-flags ACK,SYN,RST,FIN FIN,SYN -j ACCEPT
7)基于状态的包过滤
有简单的就有相对复杂的,iptables将数据链接不同的时刻定义成不同的状态,我们可以根据这些状态,来进行过滤:
NEW:新的请求
ESTABLISHED:数据正常传送 ,断开也处于此状态
INVALID:tcp中不具备的功能状态
RELATED:数据连接和命令连接相关连的数据传输
我一个们以ftp服务为例,我们知道ftp服务,分为主动和被动,主动的时候有2个端口20数据传输端口,21命令端口,而被动模式下,21命令端口不变,数据传输端口则是大于1023的随机端口,ftp的服务状态是取决与用户命令的输入而决定的,前面提到的规则设定并不能实现对ftp服务的控制,这就使用到基于状态的包过滤。
Iptables -A INPUT -p tcp --dport 21 -m state --state NEW,RELATED
2、nat地址的转换,随着互联网用户的增多,原有的ipv4的地址已经无法满足我们的使用,就引入了私有地址,在自己内部使用的地址,而私有地址是无法再公共网络中进行使用的,这就需要让私有地址可以使用共有地址的身份对网络进行访问,也就是地址转换
8)源地址的转换,在POSTROUTING上实现
Iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT 192.168.0.3
9)目标地址的转换
Iptables -t nat -A PERROUTING -p tcp --sport 80 -j DNAT 192.168.0.4
3、规则的查看
规则的执行过程,从上到下的逐个匹配,匹配到就不再往下匹配,对有交集的规则,我们要注意的是越严谨的越要放在前面
将链中的规则编号显示,方便我们再对链中规则添加、删除以及更改
Iptables -L --line-numbers
iptables基本就这些啦,但是我们看到我们都是通过命令来实现的,我们应该知道凡是立即生效的不会永久有效,如何永久有效呢,iptables模仿服务的启动,在/etc/rc.d/init.d/下有一个iptables 的脚本,这个脚本通过读取/etc/sysconfig/iptables文件中内容即规则,来启用这些规则,当我们配置好规则后,就可以使用 service iptables save 将规则覆盖保存在这个文件中了,然后将iptables添加到开机启动,下一次开机我们制定的规则就可以自动运行了。