linux之iptables详解

防火墙(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为防火墙


本文出自 “pincer” 博客,请务必保留此出处http://pincer.blog.51cto.com/5759011/1617391

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。