Linux防火墙
一、防火墙基础
Linux防火墙主要工作在网络层,属于典型的包过滤防火墙。
1、iptables的表、链结构
Iptables采用了表和链的分层结构,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表,raw表,mangle表,nat表,filter表,每个表容器内包括不同的规则链,根据处理数据包的不同时机划分为五种链,而决定是否过滤或处理数据包的各种规则,按先后顺序存放在各规则链中。
规则表分为以下4种
1)filter表:用来对数据包进行过滤,表内包含三个链,即:INPUT,FORWARD,OUTPUT
2)Nat表:nat表主要用来修改数据包的ip地址、端口号等信息。包含三个链,即PREROUTING,POSTROUTING,OUTPUT
3)Mangle表:用来修改数据包的TOS、TTL,或者为数据包设置MARL标记,实现流量×××,策略路由等高级应用,包含五个链,PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD
4)Raw表:用来决定是否对数据包进行状态跟踪,包含两个链:即OUTPUT,PREROUTING
规则链分为以下5种
1)INPUT链:当收到访问防火墙本机地址的数据包(入站),应用此链中的规则。
2)OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
3)FORWARD链:当收到需要通过防火墙中转发送给其他地址的数据包(转发)时,应用此链中的规则。
4)PREROUTING链:在对数据包做路由选择之前,应用此链中的规则。
5)POSTROUTING链:在对数据包做路由选择之后,应用此链中的规则。
2、数据包过滤的匹配流程
1)规则表的顺序
当数据包抵达防火墙时,将依次应用raw表,mangle表,nat表和filter表中对应链内的规则,应用顺序为raw-mangle-nat-filter
2)规则链之间的顺序
入站数据流向:来自外界的数据包到达防火墙后,首先被PRETOUTING链处理,然后进行路由选择,如果数据包的目标地址是防火墙本机,那么内核将其传递给INPUT链进行处理,通过以后再讲给系统的上层应用程序进行响应。
转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理,然后再进行路由选择,如果数据包的目的地址是其他外部的地址,则内核将其传递给FORWARD链进行处理,最后交给POSTROUTING链进行处理。
出站数据流向:防火墙本机向外部地址发送的数据包,首先被OUTOUT处理,然后进行路由选择,再交给POSTROUTING链进行处理。
3)规则链内部各条防火墙规则之间的顺序
当数据包经过每条规则链时,依次按第一条规则,第二条规则......的顺序进行匹配和处理,链内的过滤遵循“匹配即停止”的原则,一旦找到一条相匹配的规则,则不再检查本链内后续的其它规则,如果比对完整个链,也找不到与数据包相匹配的规则,就按照规则链的默认策略进行处理。
二、编写防火墙规则
实验环境:
网站服务器ip地址是192.168.1.5,网关服务器的内网地址是192.168.1.254,外网地址是172.16.16.254,internter测试机是172.16.16.172。
Vim /etc/sysctl.conf
使用internet测试机172.16.16.172可以ping通192.168.1.5
1、例如:在网站服务器的filter表的INPUT链中插入一条规则,拒绝发送给本机使用的ICMP协议的数据包。
执行:Iptables -t filter -I INPUT -p icmp -j REJECT
查看规则:iptables -L INPUT --line-numbers
然后再次使用172.16.16.172ping192.168.1.5,出现目标端口不可到达,无法ping通
2、添加新的规则
例如:1)在filter表INPUT链的末尾添加一条规则,接受tcp协议(实验之前在网站服务器上搭建ftp服务,使用internet测试机可以访问ftp服务器)
在internet测试机上访问
默认网站服务器的防火墙开启,所以不能访问,然后执行:
iptables -t filter -A INPUT -p tcp -j ACCEPT
发现依然不能访问,因为-A是在末尾添加一条新的规则
所以执行:Iptables -I INPUT -p udp -j ACCEPT(-I默认是添加在第一条)
例:2)添加规则允许udp数据包通过,默认位于filter的第一条
Iptables -I INPUT -p udp -j ACCEPT
例:3)指定顺序号,添加规则允许icmp数据包通过,位于第2条
Iptables -I INPUT 2 -p icmp -j ACCEPT
查看规则列表:
3、以数字形式显示规则列表,加快执行速度
4、删除,清空规则
1)若要删除filter表INPUT链中的第三条规则,执行:
Iptables -D INPUT 3
2)清空指定链或表中的所有防火墙规则,使用-F
Iptables -F INPUT
3)清空filter表,nat表,mangle表
Iptables -F
Iptables -t nat -F
Iptables -t mangle -F
5、设置默认策略:当找不到任何一条能够匹配数据包规则时,则执行默认策略
例如1)将filter表中FORWARD链的默认策略设置为丢弃,OUTPUT链的默认策略设置为允许(默认策略不参与规则的顺序编排,因此在前后并无区别。)
三、规则的匹配条件
对于同一条防火墙规则,可以指定多个匹配条件,这些条件必须都满足规则才能生效。
1、通用匹配:分为三种类型,协议匹配,地址匹配,网络接口匹配。
1)协议匹配
如果在网关服务器上开启防火墙,那么internet测试机是不能访问网站服务器的。
查看网关服务器的FORWARD链,发现只有一条拒绝all,如果想允许路由转发,执行下面的命令:iptables -I FORWARD -j ACCEPT,然后在internet测试机上可以访问网站服务器。
然后如果想丢弃通过icmp协议访问防火墙本机的数据包,允许转发经过防火墙的除icmp协议之外的数据包,可以执行:
Iptables -I INPUT -p icmp -j DROP
Iptables -A FORWARD ! -p icmp ACCEPT
执行之前先在internet测试机上ping网关服务器的172.16.16.254和192.168.1.5都是可以ping通的。执行完之后就不能ping通了,但是依然能够访问网站服务器的ftp。
先在internet测试机上ping,可以ping通
然后在网关服务器上执行以下命令
在internet测试机上ping192.168.1.5和172.16.16.254都不通了,但是ftp依然可以访问。
2)地址匹配
例1)例如:拒绝转发源地址为172.16.16.172的数据,允许转发源地址192.168.1.0的数据包
因为172.16.16.172就是internet测试机,所以internet测试机无法ping通192.168.1.5,也不能访问ftp
例2)如果检测到来自某网段的频繁扫描,登录等不良的企图,可以立即添加防火墙规则进行封锁。
Iptables -I INPUT -s 10.20.30.0/24 -j DROP
Iptables -I FORWARD -s 10.20.30.0/24-j DROP
3)网络接口匹配
例如:若要丢弃从外网接口访问防火墙本机且源地址为私有地址的数据包,执行以下操作:
首先:在172.16.16.172上ping172.16.16.254,使之可以ping通
然后执行以下命令:
再此在172.16.16.172上ping172.16.16.254,无法ping通,因为外网接口是eth1
2、隐含匹配:以指定的协议匹配作为前提条件,相当于子条件。
1)端口匹配
例如:允许网段192.168.1.0/24转发dns查询数据包。
首先在网站服务器上开启dns服务
为了实验效果,先在网关服务器上执行以下命令,阻止转发
然后在internet测试机上执行nslookup,不能解析
接下来在网关服务器上执行隐含匹配,允许为172.16.16.0网段转发dns查询包
再次在internet测试机上测试解析
2)ICMP类型匹配
若要禁止从其他主机ping本机,但是允许本机ping其他主机,可以执行以下操作
首先为了实验测试方便,在网关服务器上执行:(执行之前把其它的规则都删掉)
然后执行之后internet测试机和网站服务器之间可以互相ping通
执行:
如果实验不通,把上面的最后一条改为iptables -A INPUT -p icmp -j DROP
然后测试:
3、显示匹配
必须调用相应的模块,然后方可设置匹配条件
1)多端口匹配
例如:允许网站服务器本机开放25、80、110、143端口。
2)ip范围匹配
例如:禁止转发源地址位于192.168.4.21与192.168.4.28之间的tcp数据包。
3)mac地址匹配
例如:禁止以下mac地址的主机访问网站服务器的任何应用。
4)状态匹配
例如:禁止转发与正常tcp连接无关的非syn请求数据包(如伪造的网络***数据包)。
再例如:开放本机的web服务80端口,但对发给本机的tcp应答数据包予以放行,其他入站数据包均丢弃,对应的入站规则如下: