防火墙(iptables)
第一季
-----------------------了解防火墙
netfilter 和iptables
什么是netfilter,其实它是防火墙的模块,而iptables是管理netfilter的软件,这里要弄清楚netfilter和iptables的关系;
防火墙里面有很多策略,里面可以定义,主要是为了安全,当防火墙开启的时候,是默认阻止很多服务的,下面可以用system-config-firewall来打开图形界面
从这里可以看到,我的防火墙是开启的,然后下面有很多关于服务的选项,默认情况下都没有打钩,也就是说,当你配置服务器后,默认是被防火墙挡住的,别人是无法访问你的服务的!
这里我们可以通过图形界面来“关闭“防火墙。
这里可以点disable,然后点apply里“关闭”,一定要点apply(应用)才生效的
注意:这里要注意了,上面的关闭是有引号的,为什么要加引号,是因为这里的关闭并不是像其他服务样的关闭,一般关闭某个服务后,这个服务就完全停止了,但是关闭防火墙其实只是清空了里面的所有策略,是防火墙变成允许所有了,但是防火墙的功能是没有关闭的!!因为iptables是基于内核的
第二季
---------------------进入iptables
下面来说iptables的组成,它是由3个表filter,nat,mangle组成的,当然 在每个表里面还有一些链,注意了表是包含链的,也就是说我们是在表里面来写链定义策略的。
filter
先说filter表,它是用来过滤数据包的
这个表中有3个链INPUT ,OUTPUT ,FORWARD(当然还有自定义链)
INPUT链:过滤数据包目的地是自己的。就是说当有发给自己的数据包时,我们可以通过定义INPUT链来写一些策略来对这些数据包采取一些动作。
OUTPUT链:过滤数据包源地址是自己的。就是说当有数据包从自己出去的时候,我们可以通过编写策略来对这些数据包采取一些动作。
FORWARD链:过滤通过自己的数据包。就是说对一些通过自己的数据包(数据包 源和目的都不是自己)来采取一些动作。
这里我们可以通过iptables –t filter –L来查看
注意这里查看时并没有指定表是filter,因为默认不指定表的时候就当做是filter表。
第三季
--------------------------理解3条链的关系
从图中我们可以看到,数据包过来的时候先经骨干菱形框,通过判断如果是FORWAD则走FORAD链,如果是INPUT则走INPUT链,这里图能说明很多问题就不详细说了,
这里主要要注意一个问题,这3条链就像3个门,如果一条链拒绝了就不能通过;但是有人对forwad和INPUT链有点困惑,他们会问如果我INPUT 都拒绝了,然后FORWAD是允许通过的,那么通过我的数据包还怎么能通过了?那不是在通过前就被INPUT 拒绝了么?其实并不是这样的,就像上面说的那样,3条链是3个独立的3个门,我关掉了INPUT 的门,但是FORWAD门没关啊,数据包如果匹配我的动作,那么数据包还是会经过FORWAD链的!
第四季
----------------------------链后的动作
这里对于我们每个策略的后面都会有动作的,比如走INPUT链的数据包,如果匹配上了,我们是把数据包丢弃还是放行了?这就是我们说的策略动作
这里有这样几个动作:ACCEPT,DROP,REJECT,LOG,自定义链
ACCEPT:对满足策略的数据包允许通过
DROP:丢弃数据包,且不返回任何信息
REJECT:丢弃数据包,但是会返回拒绝的信息
LOG:把通过的数据包写到日志中(相当于一个门卫对进去的人进行登记)
这里,我们先理解一下LOG这个动作吧,其实这个动作对数据包是没有任何影响的,只是记录到日志里面(/var/log/messages),如果在一个有LOG动作的链后还有另一个链,那么数据包通过有LOG链后还是会经过后面的链的,记住这里仅仅是为了记录到日志中。
第五季
----------------------------防火墙的配置命令
配置防火墙:
这里是有固定格式的
Iptables 表名 链名 匹配条件 动作
参数介绍:
-t (table) 指定表
对于链的参数
-A(append)追加,这里用这个参数后,会将写的策略添加到表中最后面
-I (insert)插入链,如果不加数字,默认是将写的策略添加到表中所有策略的前面,但是我们要指定插入到相应的行,我们可以这样
Iptables –t filter –I INPUT 2 …… 这里就是插到第二个
注意:这里要注意,数据包通过防火墙的时候是要顺序匹配策略的,从上往下依次匹配,
如果我们第一条策略就写了拒绝192.168.0.0访问ftp的策略后,然后再写192.168.0.1可以访问ftp,则这时192.168.0.1是不能访问的,因为在前面这个网段的ip就已经被拒绝了,所以一定要注意策略的顺序。
-L (list)查看策略:如果查看filter的策略,则可以:iptables –t filter –L,当然这里为了看得更详细,可以加上参数-v和-n,对于v和n的理解用图来说明效果:
-----加vn后
-F(flush)清楚所有策略,注意了,这里只是清除相应表中的所有策略,但是不能删除一个链的默认策略,什么是链的默认策略呢?
我们从图中可以看到
这个后面的就是链的默认策略,这里它默认是允许的,对于默认策略它总是在最后执行 的,也就是说当数据包补匹配前面所有策略时,就采用这个链的默认策略,当然这个链的默认策略是可以更改的。
-P 链 动作 用这个参数就可以改变一个链的默认策略
如:iptables –t filter –P INPUT DROP
这里我们就更改了INPUT链的默认策略。
那么如果我们要清除(还原)链的默认策略应该用什么命令呢?
这里用service iptables stop 是可以的,它可以清楚所有策略和链的默认策略。
-Z 计数器归零,上面我们可以看到每个条目的最左右有个pkts和bytes,这个就是用来清零这个计数器的
-D(delete)删除某个策略,这里删除时需要指定你要删除的是第几个策略,一般一个表里面的策略都是从上到下一1开始排列的
我们在删除时可以这样来指定:iptables –t filter –D INPUT 1 这个就是删除第一个策略
从图中可以看到我们参看时,在后面添加参数—line-numbers 就可以以数字排序的方式查看了
匹配条件参数
-i 网卡 数据包进入的网卡
-o 网卡 出去的
-s ip 源ip
-d ip 目的ip
-p 协议
--dport 端口号 目的端口号
--sport 端口号 源端口号
下面就用一些实例来了解各个参数吧:
拒绝192.168.0.0网段的pc访问自己的http服务
Iptables -t filter -A INPUT –s 192.168.0.0/24 -p tcp --dport 80 –j REJECT
这里写的时候一定要注意要用什么链,因为别人是访问我,所以是INPUT
允许192.168.1.1 可以访问我的ftp服务
Iptables –t filter -A INPUT –s 192.168.1.1 -p tcp –dport 21 -j ACCEPT
3,对自己所有允许,因为自己访问自己都是用过接口回环的,所以
Iptables -A INPUT -i lo -j ACCEPT
Iptabls -A OUTPUT -o lo -j ACCEPT
这里要特别注意了,因为iptables配置是写在内存中的,如果你重启以后,iptables的一些策略都会消失,所以需要service iptables save ,这样就讲你所写的策略都保存到了/etc/sysconfig/iptables里面了
第五季
----------------------------iptabes中的一些细节和参数的使用
1, !的使用,这里!是取反的意思
Iptables –A INPUT ‘!’ -s 192.168.0.1 -p tcp –dport 21 -j REJECT
这里的意思就是除了192.168.0.1可以访问本地ftp服务,其他都拒绝
端口,注意了,要指定端口,那么前面必须要有协议,不然指定端口时会报错,也就是说协议和端口是绑定使用的
Iptables -A INPUT -s 192.168.0.1 -p tcp --dport 20:80 -j ACCEPT
这里的意思就是允许tcp协议中从20到80之间的端口的访问
Iptables –A INPUT -s 192.168.0.1 -m multiport –p tcp --dport 20,21 -j REJECT
这里意思 是拒绝访问端口为20和21
如果要拒绝ping,这里要注意了,与其他的有点不一样
Iptables –A INPUT –s 192.168.0.1 -p icmp –icmp-type 8 –j REJECT
第七季
-----------------使用iptables进行流量控制,这个很酷!!
这里要使用一些参数,当然这些参数可以使用man iptables 来查看
这里我就实验来讲解吧
这里我们用192.168.0.254这台机器的http来共享出一个100M文件,然后让另一个pc去下载,通过限速和不限速来比较一下效果
在http服务器的html目录下有个100M的文件test
然后用192.168.0.1这个机器来下载
这里我们可以看到下载的速度为15M左右
下面在254机器上通过iptables来限速
这里的-m 是match匹配的意思,然后—limit 10/s 是限制每秒只能通过10个数据包
然后打0.1 这个机器上下载
这里可以看到下载速度只有7kb左右了
第八季
------------自定义链的使用
什么时候用到自定义链呢?一般到企业后,会发现防火墙下面会写 了很多策略,但是为了再加策略时不影响到以前已经写好的策略,我们就可以用自定义策略;
-N 自定义链名 添加自定义链
-X 自定义联名 删除自定义链
下面我们可以自己定义链:
Iptables –N RHCE
Iptables -A RHCE -s 192.168.0.1 -p tcp –dport 80 –j REJECT
当然这样写以后,是没有理由让数据包从RHCE这个自定义的链走的
但是不要忘记了,在前面的的动作中,我们不仅可以用ACCEPT也可以用到自定义链的,所以我们可以这样让数据包走我们的自定义链
Iptables –A INPUT –j RHCE
这样数据包就先走我们的自定义链了
不过问题来了
如果我们让数据包走自定义链后,那么走过自定义链,数据包还会回来继续走我们的INPUT链么?
答案是肯定的,数据如果走完自定义链如果不匹配,那么他还是会回到INPUT 链来继续往下匹配的!
下面来做个试验,添加自定义链RHCE 然后让允许192.168.0.1可以访问ftp服务,然后用INPUT来拒绝192.168.0.1ping254
这里可以看到是可以访问ftp的
这里看到拒绝了访问http的服务,这就证明了上面的结论!!
第九季
-------------防火墙的状态跟踪
什么将状态跟踪,这里我们就用tcp的三次握手连接来说明吧,当建立三次握手的时候,会发连接,然后协商建立三次握手后就会建立成功,这时就是ESTABLISH状态。这个三次握手和一些其他的连接问题就不多说了。
首先介绍一下这里可以跟踪的4个状态
NEW:第一次发起连接的数据包状态
ESTABLISH:建立连接的数据包的状态
RELATED:回应数据包的状态
INVALID:无效数据包的状态
这里为什么要用到数据包状态跟踪呢?
我们就拿ftp这个服务作为实例来说明吧,大家都知道ftp有2个模式,主动模式和被动模式;(首先要注意了,不管说明服务,一般客户端去连接服务器端时候,都会用一个大于1024 的端口去连接,而且是随机的,你是无法知道的,除非连接后你用网络监测netstat可以看到)
主动模式(port):在通过与服务器端的21端口建立起命令通道后,ftp客户端告诉服务器端,我开启了一个端口1234,你可以连我,然后ftp服务器端就用20端口主动去连客户端的1234端口,建立起数据通道
被动模式(passive):通过与服务器端的21端口建立命令通道后,服务器端就会告诉客户端我开启了2222端口,你来连接我的2222端口,这样客户端就会用大于1024的一个随机端口去连接服务器2222端口,建立起数据通道
了解ftp的2个模式后,我们就要考虑了,如果用的是主动模式,那么我们可以通过控制20和21 端口来过滤ftp的一些连接,但是如果是被动模式呢?我们根本不晓得建立数据通道的端口,就无法来过滤了,但是在建立连接的过程中,他们是始终会有连接状态的,所以这里我们就可以用数据包状态跟踪来解决ftp的被动模式问题。
注意了,一般ftp服务的连接都用的是被动模式(passive),下面我们来用实验证明
首先在254上搭建ftp服务器,然后运行0.1这个机器能通过20和21端口来访问ftp服务器,但是拒绝其他一切
254端
客户端来访问:
注意了,这里我们开始登陆进去成功是因为我防火墙策略中打开了21端口,但是我把20端口也打开了,进去后为什么连ls都不行,这是因为默认的模式为被动模式,这
里我们输入passive进去主动模式,这样就可以ls或者下载了;
这时我们利用数据包状态跟踪来处理,如果状态追踪成功,那么开始登陆进去就是可以下载数据的:
这里可以看到追踪的是tcp连接成功时数据包的状态:established,related
然后一定不要忘记了加载ip_conntrack_ftp这个模块!!!
测试:
这里已经可以证明成功了;
ROUTIP为防火墙