CentOS下iptables详解

一:前言linux

 
防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。不管是在哪一个网络中,防火墙工做的地方必定是在网络的边缘。而咱们的任务就是须要去定义到底防火墙如何工做,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
 
目前市面上比较常见的有三、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,实际上是代理层的网关
 
对于TCP/IP的七层模型来说,咱们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。可是对于七层的防火墙,无论你源端口或者目标端口,源地址或者目标地址是什么,都将对你全部的东西进行检查。因此,对于设计原理来说,七层防火墙更加安全,可是这却带来了效率更低。因此市面上一般的防火墙方案,都是二者结合的。而又因为咱们都须要从防火墙所控制的这个口来访问,因此防火墙的工做效率就成了用户可以访问数据多少的一个最重要的控制,配置的很差甚至有可能成为流量的瓶颈。
 
二:iptables 的历史以及工做原理
 
1.iptables的发展:
 
iptables的前身叫ipfirewall (内核1.x时代),这是一个做者从freeBSD上移植过来的,可以工做在内核当中的,对数据包进行检测的一款简易访问控制工具。可是ipfirewall工做功能极其有限(它须要将全部的规则都放进内核当中,这样规则才可以运行起来,而放进内核,这个作法通常是极其困难的)。当内核发展到2.x系列的时候,软件改名为ipchains,它能够定义多条规则,将他们串起来,共同发挥做用,而如今,它叫作iptables,能够将规则组成一个列表,实现绝对详细的访问控制功能
 
他们都是工做在用户空间中,定义规则的工具,自己并不算是防火墙。它们定义的规则,能够让在内核空间当中的netfilter来读取,而且实现让防火墙工做。而放入内核的地方必需要是特定的位置,必须是tcp/ip的协议栈通过的地方。而这个tcp/ip协议栈必须通过的地方,能够实现读取规则的地方就叫作 netfilter.(网络过滤器)
 
    做者一共在内核空间中选择了5个位置,
    1.内核空间中:从一个网络接口进来,到另外一个网络接口去的
    2.数据包从内核流入用户空间的
    3.数据包从用户空间流出的
    4.进入/离开本机的外网接口
    5.进入/离开本机的内网接口
        
2.iptables的工做机制
 
从上面的发展咱们知道了做者选择了5个位置,来做为控制的地方,可是你有没有发现,其实前三个位置已经基本上能将路径完全封锁了,可是为何已经在进出的口设置了关卡以后还要在内部卡呢? 因为数据包还没有进行路由决策,还不知道数据要走向哪里,因此在进出口是没办法实现数据过滤的。因此要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那咱们为何还要放置他们呢?由于咱们在作NAT和DNAT的时候,目标地址转换必须在路由以前转换。因此咱们必须在外网然后内网的接口处进行设置关卡。        
 
 这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
        这是NetFilter规定的五个规则链,任何一个数据包,只要通过本机,必将通过这五个链中的其中一个链。       
 
3.防火墙的策略
 
防火墙策略通常分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必需要定义谁能进堵策略则是,大门是洞开的,可是你必须有身份认证,不然不能进。因此咱们要定义,让进来的进来,让出去的出去,因此通,是要全通,而堵,则是要选择。当咱们定义的策略的时候,要分别定义多条功能,其中:定义数据包中容许或者不容许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工做,咱们制定出了“表”这个定义,来定义、区分各类不一样的工做功能和处理方式。
 
咱们如今用的比较多个功能有3个:
1.filter 定义容许或者不容许的
2.nat 定义地址转换的 
                3.mangle功能:修改报文原数据
 
咱们修改报文原数据就是来修改TTL的。可以实现将数据包的元数据拆开,在里面作标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
 
小扩展:
对于filter来说通常只能作在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来说通常也只能作在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链均可以作:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
 
iptables/netfilter(这款软件)是工做在用户空间的,它可让规则进行生效的,自己不是一种服务,并且规则是当即生效的。而咱们iptables如今被作成了一个服务,能够进行启动,中止的。启动,则将规则直接生效,中止,则将规则撤销。 
iptables还支持本身定义链。可是本身定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完以后,再返回。接着在特定的链中继续检查。
 
注意:规则的次序很是关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
 
三.规则的写法:
 
 iptables定义规则的方式比较复杂:
 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
 -t table :3个filter nat mangle
 COMMAND:定义如何对规则进行管理
 chain:指定你接下来的规则究竟是在哪一个链上操做的,当定义策略的时候,是能够省略的
 CRETIRIA:指定匹配标准
 -j ACTION :指定如何进行处理
 
 好比:不容许172.16.0.0/24的进行访问。
 iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
 固然你若是想拒绝的更完全:
 iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
 
 iptables -L -n -v #查看定义规则的详细信息
 
四:详解COMMAND:
 
1.链管理命令(这都是当即生效的)
-P :设置默认策略的(设定默认门是关着的仍是开着的)
默认策略通常只有两种
iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的
好比:
iptables -P INPUT DROP 这就把默认规则给拒绝了。而且没有定义哪一个动做,因此关于外界链接的全部规则包括Xshell链接之类的,远程链接都被拒绝了。
        -F: FLASH,清空规则链的(注意每一个链的管理权限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的全部链
        -N:NEW 支持用户新建一个链
            iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
        -X: 用于删除用户自定义的空链
            使用方法跟-N相同,可是在删除以前必需要将里面的链给清空昂了
        -E:用来Rename chain主要是用来给用户自定义的链重命名
            -E oldname newname
         -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
            iptables -Z :清空
 
2.规则管理命令
         -A:追加,在当前链的最后新增一个规则
         -I num : 插入,把当前规则插入为第几条。
            -I 3 :插入为第三条
         -R num:Replays替换/修改第几条规则
            格式:iptables -R 3 …………
         -D num:删除,明确指定删除第几条规则
        
3.查看管理命令 “-L”
 附加子命令
 -n:以数字的方式显示ip,它会将ip直接显示出来,若是不加-n,则会将ip反向解析成主机名。
 -v:显示详细信息
 -vv
 -vvv :越多越详细
 -x:在计数器上显示精确值,不作单位换算
 --line-numbers : 显示规则的行号
 -t nat:显示全部的关卡的信息
 
五:详解匹配标准
 
1.通用匹配:源地址目标地址的匹配
 -s:指定做为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
并且地址能够取反,加一个“!”表示除了哪一个IP以外
 -d:表示匹配目标地址
 -p:用于匹配协议的(这里的协议一般有3种,TCP/UDP/ICMP)
 -i eth0:从这块网卡流入的数据
流入通常用在INPUT和PREROUTING上
 -o eth0:从这块网卡流出的数据
流出通常在OUTPUT和POSTROUTING上
        
2.扩展匹配
2.1隐含扩展:对协议的扩展
    -p tcp :TCP协议的扩展。通常有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,好比
--dport 21  或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
    对于它,通常要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn   =    --syn
表示检查这4个位,这4个位中syn必须为1,其余的必须为0。因此这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫作--syn
    -p udp:UDP协议的扩展
        --dport
        --sport
    -p icmp:icmp数据报文的扩展
        --icmp-type:
echo-request(请求回显),通常用8 来表示
因此 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)通常用0来表示
                  
2.2显式扩展(-m)
     扩展各类模块
      -m multiport:表示启用多端口扩展
      以后咱们就能够启用好比 --dports 21,23,80
                  
        
六:详解-j ACTION
 
 经常使用的ACTION:
 DROP:悄悄丢弃
通常咱们多用DROP来隐藏咱们的身份,以及隐藏咱们的链表
 REJECT:明示拒绝
 ACCEPT:接受
custom_chain:转向一个自定义的链
 DNAT
 SNAT
 MASQUERADE:源地址假装
 REDIRECT:重定向:主要用于实现端口重定向
 MARK:打防火墙标记的
 RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。
 
练习题1:
     只要是来自于172.16.0.0/16网段的都容许访问我本机的172.16.100.1的SSHD服务
     分析:首先确定是在容许表中定义的。由于不须要作NAT地址转换之类的,而后查看咱们SSHD服务,在22号端口上,处理机制是接受,对于这个表,须要有一来一回两个规则,若是咱们容许也好,拒绝也好,对于访问本机服务,咱们最好是定义在INPUT链上,而OUTPUT再予以定义就好。(会话的初始端先定义),因此加规则就是:
     定义进来的: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
     定义出去的: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
     将默认策略改为DROP:
  iptables -P INPUT DROP
  iptables -P OUTPUT DROP
  iptables -P FORWARD DROP
        
七:状态检测:
 
是一种显式扩展,用于检测会话之间的链接关系的,有了检测咱们能够实现会话间功能的扩展
        什么是状态检测?对于整个TCP协议来说,它是一个有链接的协议,三次握手中,第一次握手,咱们就叫NEW链接,而从第二次握手之后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫作已创建的链接(ESTABLISHED),还有一种状态,比较诡异的,好比:SYN=1 ACK=1 RST=1,对于这种咱们没法识别的,咱们都称之为INVALID没法识别的。还有第四种,FTP这种古老的拥有的特征,每一个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系咱们称之为RELATED。
因此咱们的状态一共有四种:
        NEW
        ESTABLISHED
        RELATED
        INVALID
 
因此咱们对于刚才的练习题,能够增长状态检测。好比进来的只容许状态为NEW和ESTABLISHED的进来,出去只容许ESTABLISHED的状态出去,这就能够将比较常见的反弹式木马有很好的控制机制。
        
对于练习题的扩展:
进来的拒绝出去的容许,进来的只容许ESTABLISHED进来,出去只容许ESTABLISHED出去。默认规则都使用拒绝
iptables -L -n --line-number  :查看以前的规则位于第几行
    改写INPUT
        iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
 
    此时若是想再放行一个80端口如何放行呢?
        iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 
        iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT
 
练习题2:
假如咱们容许本身ping别人,可是别人ping本身ping不通如何实现呢?
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).咱们为了达到目的,须要8出去,容许0进来
 
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
 
小扩展:对于127.0.0.1比较特殊,咱们须要明肯定义它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
 
八:SNAT和DNAT的实现
 
因为咱们如今IP地址十分紧俏,已经分配完了,这就致使咱们必需要进行地址转换,来节约咱们仅剩的一点IP资源。那么经过iptables如何实现NAT的地址转换呢?
 
1.SNAT基于原地址的转换
基于原地址的转换通常用在咱们的许多内网用户经过一个外网的口上网的时候,这时咱们将咱们内网的地址转换为一个外网的IP,咱们就能够实现链接其余外网IP的功能
因此咱们在iptables中就要定义到底如何转换:
定义的样式:
好比咱们如今要将全部192.168.10.0网段的IP在通过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
这样,只要是来自本地网络的试图经过网卡访问网络的,都会被通通转换成172.16.100.1这个IP.
那么,若是172.16.100.1不是固定的怎么办?
咱们都知道当咱们使用联通或者电信上网的时候,通常它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时咱们就要将外网地址换成 MASQUERADE(动态假装):它能够实现自动寻找到外网地址,而自动将其改成正确的外网地址。因此,咱们就须要这样设置:
         iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
         这里要注意:地址假装并不适用于全部的地方。
 
2.DNAT目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端 经过目标地址转换,咱们可让外面的ip经过咱们对外的外网ip来访问咱们服务器不一样的服务器,而咱们的服务却放在内网服务器的不一样的服务器上
 
    如何作目标地址转换呢?:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
        目标地址转换要作在到达网卡以前进行转换,因此要作在PREROUTING这个位置上
 
九:控制规则的存放以及开启
 
注意:你所定义的全部内容,当你重启的时候都会失效,要想咱们可以生效,须要使用一个命令将它保存起来
1.service iptables save 命令
它会保存在/etc/sysconfig/iptables这个文件中
    2.iptables-save 命令
iptables-save > /etc/sysconfig/iptables
 
    3.iptables-restore 命令
开机的时候,它会自动加载/etc/sysconfig/iptabels
若是开机不能加载或者没有加载,而你想让一个本身写的配置文件(假设为iptables.2)手动生效的话:
iptables-restore < /etc/sysconfig/iptables.2
则完成了将iptables中定义的规则手动生效
 
 
十:总结
         Iptables是一个很是重要的工具,它是每个防火墙上几乎必备的设置,也是咱们在作大型网络的时候,为了不少缘由而必需要设置的。学好Iptables,可让咱们对整个网络的结构有一个比较深入的了解,同时,咱们还可以将内核空间中数据的走向以及linux的安全给掌握的很是透彻。咱们在学习的时候,尽可能能结合着各类各样的项目,实验来完成,这样对你加深iptables的配置,以及各类技巧有很是大的帮助。
 

命令 -A, --appendweb

范例 iptables -A INPUT ...shell

说明 新增规则到某个规则炼中,该规则将会成为规则炼中的最后一条规则。安全

命令 -D, --delete服务器

范例 iptables -D INPUT --dport 80 -j DROP网络

iptables -D INPUT 1app

说明 从某个规则炼中删除一条规则,能够输入完整规则,或直接指定规则编号加以删除。tcp

命令 -R, --replace函数

范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP工具

说明 取代现行规则,规则被取代后并不会改变顺序。

命令 -I, --insert

范例 iptables -I INPUT 1 --dport 80 -j ACCEPT

说明 插入一条规则,本来该位置上的规则将会日后移动一个顺位。

命令 -L, --list

范例 iptables -L INPUT

说明 列出某规则炼中的全部规则。

命令 -F, --flush

范例 iptables -F INPUT

说明 删除某规则炼中的全部规则。

命令 -Z, --zero

范例 iptables -Z INPUT

说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

命令 -N, --new-chain

范例 iptables -N allowed

说明 定义新的规则炼。

命令 -X, --delete-chain

范例 iptables -X allowed

说明 删除某个规则炼。

命令 -P, --policy

范例 iptables -P INPUT DROP

说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。

命令 -E, --rename-chain

范例 iptables -E allowed disallowed

说明 修改某自订规则炼的名称。

经常使用封包比对参数

参数 -p, --protocol

范例 iptables -A INPUT -p tcp

说明 比对通信协议类型是否相符,可使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 之外的其它类型,包含 udp、icmp ...等。若是要比对全部类型,则可使用 all 关键词,例如:-p all。

参数 -s, --src, --source

范例 iptables -A INPUT -s 192.168.1.1

说明 用来比对封包的来源 IP,能够比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时也可使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24。

参数 -d, --dst, --destination

范例 iptables -A INPUT -d 192.168.1.1

说明 用来比对封包的目的地 IP,设定方式同上。

参数 -i, --in-interface

范例 iptables -A INPUT -i eth0

说明 用来比对封包是从哪片网卡进入,可使用通配字符 + 来作大范围比对,例如:-i eth+ 表示全部的 ethernet 网卡,也可使用 ! 运算子进行反向比对,例如:-i ! eth0。

参数 -o, --out-interface

范例 iptables -A FORWARD -o eth0

说明 用来比对封包要从哪片网卡送出,设定方式同上。

参数 --sport, --source-port

范例 iptables -A INPUT -p tcp --sport 22

说明 用来比对封包的来源埠号,能够比对单一埠,或是一个范围,例如:--sport 22:80,表示从 22 到 80

埠之间都算是符合条件,若是要比对不连续的多个埠,则必须使用 --multiport 参数,详见后文。比对埠号时,可使用 !

运算子进行反向比对。

参数 --dport, --destination-port

范例 iptables -A INPUT -p tcp --dport 22

说明 用来比对封包的目的地埠号,设定方式同上。

参数 --tcp-flags

范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

说明 比对 TCP

封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设定,未被列举的旗号必须是空的。TCP

状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)

等都可使用于参数中,除此以外还可使用关键词 ALL 和 NONE 进行比对。比对旗号时,可使用 ! 运算子进行反向比对。

参数 --syn

范例 iptables -p tcp --syn

说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的做用彻底相同,若是使用 ! 运算子,可用来比对非要求联机封包。

参数 -m multiport --source-port

范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110

说明 用来比对不连续的多个来源埠号,一次最多能够比对 15 个埠,可使用 ! 运算子进行反向比对。

参数 -m multiport --destination-port

范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110

说明 用来比对不连续的多个目的地埠号,设定方式同上。

参数 -m multiport --port

范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110

说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,若是来源端口号为 80 但目的地埠号为 110,这种封包并不算符合条件。

参数 --icmp-type

范例 iptables -A INPUT -p icmp --icmp-type 8

说明 用来比对 ICMP 的类型编号,可使用代码或数字编号来进行比对。请打 iptables -p icmp --help 来查看有哪些代码能够用。

参数 -m limit --limit

范例 iptables -A INPUT -m limit --limit 3/hour

说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。

除了每小时平均一次外,也能够每秒钟、每分钟或天天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。

除了进行封包数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动做,以免因骇客使用洪水攻击法,致使服务被阻断。

参数 --limit-burst

范例 iptables -A INPUT -m limit --limit-burst 5

说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。

参数 -m mac --mac-source

范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting

规则炼上,这是由于封包要送出到网卡后,才能由网卡驱动程序透过 ARP 通信协议查出目的地的 MAC 地址,因此 iptables

在进行封包比对时,并不知道封包会送到哪一个网络接口去。

相关文章
相关标签/搜索