Iptables入门

IPTABLES入门

防火墙是什么?

防火墙是通过制定一些有顺序的规则,用来管理进入到特定网络范围内数据封包的一种机制。

防火墙从实现方法可以分为硬件防火墙软件防火墙硬件防火墙 是由厂商设计好的硬件设备,能够在硬件层面上实现解包封包,但离不开软件的辅助。而软件防火墙 由纯软件逻辑实现。

本文所论述的防火墙是由内核空间的 netfilter 来读取,并实现让防火墙工作,而放进的地方必须要是特定的位置,必须是tcp/ip协议栈的地方,而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的功能称之为netfilter(网络过滤器) .iptables是工作在用户空间,用以编写规则的一个工具,所编写的规则最终写入到内核空间中,写入netfilter

iptables的工作机制和简要概念

传统意义上的iptables由四表,五链来进行报文流的控制。

五链(钩子函数,hook function):
1. PREROUTING 在对数据包作路由选择之前,应用此链中的规则,如DNA
2. INPUT` 当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则
3. FORWARD 当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则
4. OUTPUT 当防火墙本机向发送数据包(出站时),应用此链中规则。
5. POSTROUTING 在对数据包作路由选择之后,应用此链中的规则,如SNAT

四表(功能):
raw 控制链接追踪功能的开启关闭,和nat表相关,开启链接追踪会消耗系统性能。该表包含两条链
PREROUTING OUTPUT
- iptables 包含4种跟踪链接的状态
1. NEW:该包想要开始一个新连接
2. RELATED:该报是属于某个已经建立连接触发的新连接,例如FTP的数据连接是由信道链接所触发的,所以数据连接就叫做RELATED。
3. ESTABLISHED:只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接后续数据包。
4. INVALID:数据包不能被识别属于哪个连接或者没有任何状态比如内存溢出、收到不知属于哪个连接的ICMP错误信息,一般应该DROP(丢弃)这个状态的任何数据

mangle 对报文进行拆解,修改,并重新封装(不修改ip或端口),该表包含五个链,PREROUTING INPUT FORWARD OUTPUT POSTROUTING

nat 用于NAT,报文的源地址或者目的地址,需要注意的是,只有第一个包会被匹配,其后的包会做相同的处理。该表包含三个规则链,PREROUTING OUTPUT POSTROUTING

filter 用来过滤报文,对报文进行相应的操作,如拒绝通过(REJECT),丢弃(DROP),通过(ACCEPT)等等。该表包含三个规则链:INPUT OUTPUT FORWARD

四张表的优先级顺序:raw–mangle–nat–filter

Iptables入门_第1张图片
相关的四表五链 之前已经介绍过了,上图就是报文流经防火墙主机的过程中各表和链之间的关系。

简要来说,报文流向经过的链如下几类:
1. 流入:PREROUTING–>INPUT
2. 流出:OUTPUT–>POSTROUTING
3. 转发:PREROUTING–>FORWARD–>POSTROUTING

iptables链的分类:
- 内置链:每个链对应一个钩子函数(hook),即之前所述的五链
- 用户自定义链:对于内置链的扩展和补充,实现更灵活的规则管理,必须由内置链调用才会生效。(后续会详细说明)

添加iptables时需要考量的因素:
- 实现什么样的功能:用于判定将规则添加至哪个表;
- 报文的流经位置:用于判断将规则添加至哪个链;
- 报文的流向:判定规则中何为”源“,何为”目标“;
- 匹配条件:用于编写正确的匹配规则;
1. 专用于某种应用的同类规则,匹配范围小的放前面
2. 专用于某些应用的不同类规则,匹配到的可能性较多的放前面;同一类别的规则可使用自定义链单独存放;
3. 用于通用目的的规则放前面;

iptables规则的匹配法则:规则自上而下依次匹配,如果匹配到了相关规则,则应用之并不检查后续规则,当所有规则都未匹配到,则应用默认策略。

NAT的全名是Network Address Translation(网络地址转换)。在论述NAT的种类前,先简单的说,假如局域网内部有任何一台主机想要向外部发送报文,那么该如通过iptables主机传送呢?
1. 先经过 NAT table的PREROUTING链;
2. 经过路由判定它是否要进入iptables本机,若不进入本机,则下一步;
3. 再通过filter tables的FORWARD链
4. 再通过NAT table 的 POSTROUTING链,最后离开iptables本机传送出去。

NAT服务的重点就在上述的1、4步骤, 也就是NAT table的两条重要的链 PREROUTING,POSTROUTING。PREROUTING重点在于修改目的IP(Destination NAT,DNAT),POSTROUTING重点在于修改源IP(Source NAT,SNAT)。

DNAT:目的地址转换,可用于保护局域网内部对外提供服务的服务器。
Iptables入门_第2张图片
如上图所示。外部网络有一台主机想要访问内部www服务器(假设:10网段为公网ip,172为内部私有ip。太懒了,各位看官注意下^_^),他的ip报文的源地址和目标地址有何变化:
1. 客户端访问www.服务,发出的报文,源地址为10.1.14.2,目标地址为10.1.14.1
2. iptables 收到请求,一看,是访问的80端口,就把目标地址替换为172.18.14.2,通过172.18.14.1网卡发送出去。
3. 内部www服务器收到请求,响应结果,回传给iptables主机。
4. iptables主机收到回传的数据,根据步骤2记录下来的信息,再将报文源ip由172.18.14.2改为公网ip10.1.14.1回传给外部用户。

上述步骤,外部主机请求www资源就是一个DNAT,而www服务器返回资源的过程就是SNAT(这里的SNAT是由于iptables记录了相关信息 而自动做出的动作)

SNAT:为了内部主机访问外部网络而做的一种安全措施。
Iptables入门_第3张图片
SNAT的大概流程:
1. 内部主机发起web资源请求 源ip 172.18.14.2 目标ip 10.1.14.2
2. iptables收到请求,记录地址信息,将源ip改为10.1.14.1 目标ip不变
3. web服务器返回资源,源ip 10.1.14.2,目标ip 10.1.14.1
4. iptables主机根据2保存的地址信息,将 资源反馈给内部用户,此时,源地址不变,10.1.14.2,目标ip转为172.18.14.2

iptables命令概述

man iptables,man iptables-extensions

# man iptables-extensions
查阅iptables帮助
  • 命令通用格式
    iptables [-t tables] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

  • 选项详解

    • 链管理

      • -N :new 自定义一条新的规则链

        • # iptables -N in_icmp
      • -X : delete删除自定义的规则链

        • # iptables -X in_icmp
      • -P :设置默认策略,指明是黑名单还是白名单.对于filter表而言,默认策略有: ACCEPT:(接受),DROP(丢弃),REJECT(拒绝)
        • ~]# iptables -P FORWARD ACCEPT
        • ~]# iptables -P FORWARD DROP
      • -E :重命名自定义链,引用计数不为0的自定义链接,不能被删除和重命名
      • -F:flush,清空指定的规则链
        • 指明链,即清空指定链上的规则
        • 不指明链,即清空所有链上的规则
        • -Z zero,置零计数器
        • packets:匹配到的报文个数
        • bytes:被本规则所匹配到的所有报文大小之和
    • 规则管理

      • -A :append,追加新规则
      • -I:insert,插入规则,需要指明位置,省略时表示第一条
      • -D:delete,删除规则,指明替换号,指明替换规则本身
      • -R, –replace chain rulenum rule-specification:替换指定的规则为新的规则;
      • -D, –delete chain rulenum:根据规则编号删除规则;
      • -D, –delete chain rule-specification:根据规则本身删除规则;
    • 规则显示

      • -L
        • -v , –verbose:详细信息;
        • -vv,更详细的信息
        • -n, –numeric:数字格式显示主机地址和端口号;
        • -x, –exact:显示计数器的精确值,而非圆整后的数据
        • –line-numbers:列出规则时,显示其在链上的相应的编号;
      • -S, –list-rules [chain]:显示指定链的所有规则;
    • 匹配条件

      • 通用匹配
        • [!] -s, –source address[/mask][,…]:检查报文的源IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
        • [!] -d, –destination address[/mask][,…]:检查报文的目标IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
        • [!] -p, –protocol protocol:匹配报文中的协议,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者 “all”, 亦可以数字格式指明协议;
        • -m, –match match:调用指定的扩展匹配模块来扩展匹配条件检查机制;
        • [!] -i, –in-interface name:限定报文仅能够从指定的接口流入
        • [!] -o, –out-interface name:限定报文仅能够从指定的接口流出
      • 扩展匹配

        • 隐式扩展
          • 不需要手动加载扩展模块,因为它们是对协议的扩展,所以但凡使用-p 指明了协议,就表示已经指明了要扩展的模块
          • p tcp
            • [!]–source-port, –sport port[:port]
              • 匹配报文的源端口,可以是端口范围
            • [!]–destination-port, –dport port[:port
              • 匹配报文的目标端口,可以是端口范围
            • [!]–tcp-flags mask comp
              • 匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
              • mask:要检查的FLAGS list,以逗号分隔;
              • comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;
                • –tcp-flags SYN,ACK,FIN,RST SYN
                • –tcp-flags ALL ALL
                • –tcp-flags ALL NONE
          • -p udp:可直接使用udp协议扩展模块的专用选项
            • [!] –source-port,–sport port[:port]
            • [!] –destination-port,–dport port[:port]
          • p icmp
            • –icmp-type {type[/code]|typename}
              • 0/0: echo reply (请求)
              • 8/0:echo request (响应)
        • 显示扩展,必须使用-m指明要调用的扩展模块的扩展机制

          • multiport:以离散或连续的 方式定义多端口匹配条件,最多15个;

            • [!] –source-ports,–sports port[,port|,port:port]…:指定多个源端口;
            • [!] –destination-ports,–dports port[,port|,port:port]…:指定多个目标端口;
            
            # iptables -I INPUT  -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT`
            
          • iprange以连续地址块的方式来指明多IP地址匹配条件;

            • –src-range from[-to] :指明源ip地址范围
            • –dst-range from[-to]:指明目的ip地址范围
            
            # iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT
            
          • time,以时间范围来控制匹配

            • –timestart hh:mm[:ss] :时间其实范围
            • –timestop hh:mm[:ss] :时间结束范围
            • –weekdays day[,day…]:一周的某几天,星期一…星期二…
            • –monthdays day[,day…]: 每个月的几号
            • –datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:完整日期起始点
            • –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:完整日期终结点
            • –kerneltz:使用内核配置的时区而非默认的UTC;
            
            #iptables -A INPUT -s 172.16.0.0/16 -d 172.168.100.67 -p tcp --dport 80 -m time -
            
            -timestart 14:30 --time-stop 18:30 --weekdays sat,sun -j DROP
            每周的星期几可以使用数据表示方法: 1,2,3,4,5,6,7 可以使用离散取值方法
          • string ,以字符串 控制匹配条件

            • –algo {bm|kmp}:字符串匹配检测算法

              • –string pattern
              • –hex-string pattern:十六进制字符串
              
              # iptables -A OUTPUT -s 172.18 -p tcp --sport 80 -m string --algo bm --
              
              string "gay" -j REJECT
          • connlimit :限制链接数量

            • –connlimit-upto n:小于等于n个链接
            • –connlimit-above n:大于等于n个链接
            
            # iptables -I INPUT -d 172.18.14.66 -p tcp -m comp --tcp-flags SYN,ACK,FIN,RST SYN --dport 22 -m connlimit --connlimit-above 2 -j REJECT
            
          • limit 限制链接速度
            • –limit rate[/second|/minute|/hour|/day]: 多少个连接数[每秒/每分钟……]
            • –limit-burst number:最大连接池数。
          • state :根据链接状态来进行控制

            • 根据连接追踪机制,查检连接的状态, 跟TCP没有关系,是内核中netfilter实现, 能实现tcp,udp,icmp的连接追踪,内核会记录每一个连接(放置在内存中),谁,通过什么协议, 访问什么服务, 访问的时间,这种机制被称之为conntrack机制.也正是有了state扩展,iptables成为了有连接追踪的防火墙,安全性是更高. 是由state扩展提供,库文件为ibxt_conntrack.so. 追踪连接功能在内核的内存空间中,把出去和进来的连接通过模板建立关联关系. 追踪本机的请求和响应之间的关系,状态如下几种:

              • NEW:新发起的请求
              • ESTABLISHED:new状态之后,链接追踪模版中为其建立的条目失效之前期间所有的通信状态
              • 相关的连接,如FTP协议中命令连接触发数据连接
              • INVALID ,无效的连接,如tcp状态全1或全0的连接
              • UNTRACKED:未进行追踪的连接
              • 调整追踪连接功能所容纳的最大连接数量:
                • /proc/sys/net/nf_conntrack_max
              • 已经追踪到的并记录下来的连接
                • /proc/net/nf_conntrack
              • 不同协议的连接追踪状态时长
                • /proc/sys/net/netfilter/*
              • [!] –state STATE : 多个state可以使用,号分隔
              
              #iptables -A INPUT -d 172.18.14.168 -p tcp -m multiport --dport 22,80 -m state --
              
              state NEW,ESTABLISHED -j ACCEPT
              
              #iptables -A OUTPUT -s 172.18.14.168 -p tcp -m multiport --sport 22,80 -m state --
              
              state ESTABLISHED -j ACCEPT
              
              #iptables -P INPUT DROP
              
              
              #iptables -P OUTPUT DROP
              
              
              #iptables -P FORWARD DROP
              
              • 启动被动模式的ftp服务

                • 手动加载nf_conntrack_ftp模块
                
                #iptables -A INPUT -d 172.18.14.168 -m state --state ESTABLISHED -j ACCEPT
                
                
                #iptables -A INPUT -d 172.18.14.168 -p tcp -m multiport 22,21,80 -m state --state NEW -j ACCEPT
                
                
                # iptables -A INPUT -d 172.18.14.168 -p tcp -m state --state RELATED -j ACCEPT
                
                
                #iptables -A OUTPUT -s 172.18.14.168 -m state --state ESTABLISHED -j ACCEPT
                
    • target的分类

      • ACCEPT 接受
      • DROP 丢弃
      • REJECT 拒绝
        • 拒绝和丢弃的区别:拒绝反馈快,可能返回一些信息,和丢弃什么都不反馈,返回信息较慢。
      • RETURN 返回调用链
      • REDIRECT 端口重定向
      • LOG 记录日志

        • –log-level LEVEL 日志等级
        • –log-prefix FREFIX 日志提示信息
        iptables -A INPUT -d 172.18.14.168 -p tcp --dport 21 -j LOG --log-prefix "badmanlog"
      • DNAT 目标地址转换
      • SNAT 源地址转换
      • MASQUERADE:地址伪装

        
        #iptables -t nat -A POSTROUTING -s 172.18.14.66 -o eth1 -j MASQUERADE
        
        • MASQUERADE 的意思如上所示,内部主机地址172.16.14.66 的报文流,只要可以从iptables主机网卡eth1出去,就自动把源地址替换为eth1网卡的ip地址。

实操小例子

[root@bnpanda ~]#iptables -t filter -A INPUT -s 172.18.0.0/16 -d 172.18.14.168 -p tcp -m tcp --dport 22 -j ACCEPT
    -t  指定表
    -A  指定规则链
    -s  源地址
    -d  目标地址
    -p  指定协议
    --dport 指定端口
[root@bnpanda ~]#iptables -t filter -L
    查看指定表的规则清单
[root@bnpanda ~]#iptables -t filter -L -n
    以数字形式查看指定表的规则清单
[root@bnpanda ~]#iptables -t filter -p INPUT DROP
    设定 filter表的默认规则:丢弃所有对本机的访问。T
[root@bnpanda ~]#iptables -t filter -P OUTPUT DROP
    所有从本机发出的连接,访问都丢弃
[root@bnpanda ~]#iptables -t filter -P FORWARD DROP
    设定filter表中默认规则,丢弃所有转发包
[root@bnpanda ~]#iptables -t filter -P INPUT ACCEPT
    设定默认规则:访问本机的链接都被允许
[root@bnpanda ~]#iptables -t filter -P OUTPUT ACCEPT
    设定默认规则,从本机发出的链接都被允许
[root@bnpanda ~]#iptables -D OUTPUT 1
    删除OUTPUT链上第一条规则
[root@bnpanda ~]#iptables -L -n --line-number 
    显示规则的序号
[root@bnpanda ~]#iptables -N samba_input_rules
    -N :自定义规则链
[root@bnpanda ~]#iptables -A samba_input_rules -d 172.18.14.168 -p udp --dport 137:138 -j ACCEPT
在自定义规则链里添加规则,目前无效,必须被默认链调用
[root@bnpanda ~]#iptables -I INPUT 2 -d 172.18.14.168 -j samba_input_rules
    ***-j samba_input_rules调用自定义规则链
[root@bnpanda ~]#iptables -X samba_input_rules 
iptables: Too many links.
    -X 删除自定义规则链
    删除自定义规则链必须要引用计数为0才可以,匹配到的包总数和匹配到的包大小都为0才行
    可以先用-F清楚指定的链的设定清单,再删除
    系统默认规则链不能删除
[root@bnpanda ~]#iptables -F samba_input_rules、
    清空指定规则链的规则清单
限制本地主机的web服务器在周三不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
#iptables -A INPUT -d 172.18.14.168 -p tcp --dport 80 -m time --weekdays 12,4,5,6,7 -m limit --limit 100/second -j ACCEPT
#iptables -A OUTPUT -s 172.18.14.168 -p tcp --sport 80 -m string --algo bm --string "admin" -j DROP
#iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
开放本机的ssh服务给172.18.14.1-172.18.14.100中的主机,到本机的连接数不得超过2个;仅允许响应报文通过其服务端口离开本机;
#iptables -A INPUT -m state --state  ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
#iptables -A INPUT -d 172.18.14.168 -p tcp --dport 22 -m iprange --src-range 172.18.14.20-172.18.14.100 -m connlimit --connlimit-upto 3  -j accept
#iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
拒绝TCP标志位全部为1及全部为0的报文访问本机;
[root@bnpanda ~]#iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
[root@bnpanda ~]#iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DRO
允许本机ping别的主机;但不开放别的主机ping本机;
[root@bnpanda ~]#iptables -A OUTPUT -p icmp  --icmp-type 8  -j ACCEPT
[root@bnpanda ~]#iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
(注意,此题建立在前两题操作的基础上)

你可能感兴趣的:(linux学习,iptables入门)