zoukankan      html  css  js  c++  java
  • centos6中iptables单机网络防火墙的使用


    概述:

    iptables:基于软件的形式实现的一种防火墙的软件程序
    Firewall:工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查,并且由匹配到的规则进行处理的一组硬件或软件,甚至可能是两者的组合


    主机防火墙:工作于主机边缘,只能对一台主机起到保护作用
    网络防火墙:工作于网络边缘,对多台主机起到保护作用
     
    网络层:网络防火墙
    应用层:网关


    IDS:入侵检测
       HIDS:OSSEC
       NIDS:snort
       Filesystem:tireware


    IPS:入侵防御系统


    honeypot:蜜罐


    系统评估安全工具:
      Nessus,nmap 


    iptables/netfilter:基于网络层的防火墙,连接追踪(状态检测)


    ipfw ipchains iptables


    iptables:防火墙规则编写工具
        netfiter:网络过滤器,是一个框架
            hook_function
        INPUT
        OUTPUT
        FORWARD
        POATROUTING
        PRERROUTING


    过滤:做报文筛选
    NAT:Network Address Transltion
         DNAT
         SNAT
    mangle:
    raw:


    FORWARD:
        filter
        mangle
    INPUT
        filter
        mangle
    OUT
        filter
        mangle
        nat
    PREROUTING
         mangle 
         nat
    POSTOUTING
         mangle 
         nat


    将控制强的放在前面,应用访问频繁的也要放在前面


    四表:
       fileter,net,mangle,raw
    五链
       PREROUTING(路由前) INPUT FOREARD OUTPUT POSTROUTING(路由后)


    表和链的对应关系
         filer:INPUT,FORWARD.OUTPUT
         nat:PREROUTING OUTPUT POSTROUTING
         mangle:PREROUTING FORWARD POSTROUTING INPUT OUTPUT


    规则:检查条件,处理机制,


    通:白名单,默认为堵,只对能识别的进行放行
    堵:黑名单,默认为通,只对能识别的进行阻截


    检查条件:
       IP:SIP,DIP
       TCP:SPORT,DPORT,FLags
       UDP:SPORT,DPORT
       ICMP:ICMP-TYPE


    扩展机制:
      time string state(connection-tracking)


    处理机制:
        DROP(丢弃),
        REJECT(拒绝,并返回)
        ACCEPT(允许)
        SNAT
        DNAT
        RETURN(返回)
        REDIRECT(端口转发)
        LOG(只记录日志)

    mangle:做防火墙标记



    如何写规则

       -t 表 -L 列出 -n 以数值方式显示
      iptables [-t table] -N chain
         创建一条自定义的空规则链
      iptables [-t table] -X chain
         产出一条自定义的空规则链
      iptables [-t table] -E old-chin-name new-chain-name
        为链修改名
     iptables [-t table] -P chain—name target
        为链指定默认策略,修改默认的属性
      iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
      -F 清空链中的规则
         规则由编号,在链中自上而下,从1开始
      -L list 列出表中的所有规则
         -n:数字格式显示ip和port
         -v:显示信息,
            pkts:packets,被本规则所有匹配到的报文的个数
            baytes:被本规则所匹配到的所有报文的大小子和,单位是字节,会执行单位换算 
             target:目标,即处理机制
             port:协议一般为(TCP|UDP|ICMP)
             opt:可选项
             in:数据包的流入端口
             out:数据包的流出接口
             scource:源地址
             destination:目标地址
          -vv:
          -vvv:
          -x:exactly:精确值,不执行单位换
          --line-nambers:显示各规则的行号
          -Z:zero,清零:
        把规则的计数器清零


    打印iptables列表
    # iptables -t filter -L -n


    建立新的规则mychain
    # iptables -t filter -N mychain
    删除mychain
    # iptables -X mychain


    网络192.168.0.0/16访问192.168.8.40允许
    # iptables -t filter -A INPUT -s 192.168.0.0/16 -d 192.168.8.40 -j ACCEPT


    主机192.168.8.40访问192.168.0.0/16网段允许
    # iptables -t filter -A OUTPUT -s 192.168.8.40 -d 192.168.0.0/16 -j ACCEPT


    网段192.168.11.0访问192.168.8.40 icmp协议丢弃
    # iptables -A INPUT -i eth0 -s 192.168.11.0/24 -d 192.168.8.40 -p icmp -j DROP
    拒绝
    # iptables -A INPUT -i eth0 -d 192.168.8.40 -p icmp -j REJECT
    # iptables -A OUTPUT -o eth0 -s 192.168.8.40 -p icmp -j REJECT


    iptables [-t table] {-A|-D} chain rule-specification
      -A:append,附加一条规则
         rule-specification
         匹配条件 -j 处理机制


        匹配条件:

          通用匹配
         -s 匹配原地址,可以IP,也可以网络地址:可以使用!操作符取反,!172.168.0.0/16 相当于 --src,或 --source
         -d  匹配目标地址,可以IP,也可以网络地址:可以使用!操作符取反,!172.168.0.0/16
         -p  匹配协议,通常只能使用{TCP|UDP|ICMP}三者之一
         -i  数据报文流入的接口,通常只用于INPUT,FORWARD和PREROUTING
         -o  数据报文流出的接口,通常只用OUTPUT,FORWARD和POSTROUTING


         保存规则:
           service iptables save 
            规则会被保存至/etc/sysconfig/iptables文件中:
            默认,start时也会读取次文件中的内容以设置规则
            iptables-save > /path/to/some_rulefile 保存iptables至别的位置
            iptables-restore < /path/to/some_rulefile 从自定义的位置读取并使之生效
    规则命令:
      -A:添加
      -D:删除
      iptables [-t table] -D chain rulenum
        当一条被删除,另外的一条会被补上

    删除INPUT和OUTPUT中的第二条规则

    # iptables -t filter -D INPUT 2

    # iptables -t filter -D OUTPUT 2


      插入规则
      iptables [-t table] -I chain [rulenum] rule-specification
       
      替换规则(覆盖指定规则)
      iptables [-t table] -R chain rulenum rule-specification


      显示指定链上的规则添加命令
      iptables [-t table] -S [chain [rulenum]]


    扩展匹配

        隐含扩展:使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展
           -p tcp
              --dport m[-n],匹配的目标端口,可以是连续的多个端口
              --sport:m[-n],匹配的源端口,可以是连续的多个端口
              --tcp-flags

               URG PSH PST SYN ACK FIN

    显式扩展:必须要明确指定的扩展模块
          -m 扩展模块名称 --专用选项1 --专用选项2


          multiport:多端口匹配,一次指定多个离散端口
            --source-ports --sport ports{port1 port2}
            --destination-ports, --dports
            --ports


         iprange:ip地址服务 
           [!] --src-range from [-to]
           [!] --dst-range from [-to]


         time 指定时间范围
            --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
            --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]


            --timestart hh:mm[:ss]
            --timestart hh:mm[:ss]


            [!] --weekdays day[,day....]


         string 字符串匹配
            --alog {bm|kmp} :字符匹配查找时使用的算法
            --string “STRING” :要查找的字符串
            --hex-string "HEX-STRING" 要查找的字符,先编码成16进制格式


          connlimit:每IP对指定服务的最大并发连接数
           [!] --connlimit-above


          limit:报文速率控制
            --limit #[/second|/minute|/hour|/day]
            --limit-burst # 
            hping3:安装此包,做测试


          state:状态追踪
              ip_conntrack,nf_conntrack


              netfilter:会话
               
             --state
                 NEW
                 ESTABLISHED
                 RELATED
                 INVALID
                 
          调整连接追踪功能所能容纳的最大连接数
              cat /proc/sys/net/nf_conntrack_max
                  定义了连接追踪的最大值,因此,建议按需调大此值
              cat /proc/net/nf_conntrack
                 记录了当前追踪的所有连接
              cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established 
              超时时间


              法则:
              1.对于进入状态为ESTABLISHED都应该放行
              2.对于返回状态为ESTABLISHED都应该放行
              3.严格检查进入的状态为NEW的链接
              4.所有状态为INVALID都应该拒绝
      iptable -I lean_in 5 -d 172.16.100.7 -m state --state INVALID -j DROP


          -j target
                RETURN:返回调用链


    常见服务规则案例:


    放行来自于网络192.168.11.0/24对本机192.168.8.40 ssh服务的访问:
    # iptables -t filter -A INPUT -s 192.168.11.0/24 -d 192.168.8.40 -p tcp --dport 22 -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.8.40 -d 192.168.11.0/24 -p tcp --sport 22 -j ACCEPT


    拒绝来自192.168.11.0网段对192.168.8.40 web 80端口的访问

    # iptables -A INPUT -s 192.168.11.0/24 -d 192.168.8.40 -p tcp --dport 80 -j DROP

    # iptables -A OUTPUT -s 192.168.8.40 -d 192.168.11.0/24 -p tcp --sport 80 -j DROP


           -p udp
              --dport m[-n],匹配的目标端口,可以是连续的多个端口
              --sport:m[-n],匹配的源端口,可以是连续的多个端口


    放行本机的tftp服务
    # iptables -A INPUT -s 192.168.11.0/24 -d 192.168.8.40 -p udp --dport 69 -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -d 192.168.11.0/24 -p udp --sport 69 -j ACCEPT


    放行本机的DNS服务
    # iptables -A INPUT -s 192.168.0.0/16 -d 192.168.8.40 -p udp --dport 53 -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -d 192.168.0.0/16 -p udp --sport 53 -j ACCEPT
    查询互联网dns
    # iptables -A OUTPUT -s 192.168.8.40 -p udp --dport 53 -j ACCEPT
    # iptables -A INPUT -d 192.168.8.40 -p udp --sport 53 -j ACCEPT


           -p icmp
               --icmp-type
    8:ping请求
    0:ping响应
    放开本机的ping响应
    # iptables -A INPUT -d 192.168.8.40 -p icmp --icmp-type 8 -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -p icmp --icmp-type 0 -j ACCEPT



    将input、output和forward都禁用
    # iptables -P INPUT DROP
    # iptables -P OUTPUT DROP
    # iptables -P FORWARD DROP


    放行192.168.11.0/24网络对80端口访问
    # iptables -t filter -A INPUT -s 192.168.11.0/24 -d 192.168.8.40 -p tcp --dport 80 -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.8.40 -d 192.168.11.0/24 -p tcp --sport 80 -j ACCEPT
    放行3306端口对所有主机的访问
    # iptables -t filter -A INPUT -d 192.168.8.40 -p tcp --dport 3306 -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.8.40 -p tcp --sport 3306 -j ACCEPT


    放行对本地回环口的访问:
    # iptables -A INPUT -i lo -j ACCEPT
    # iptables -A OUTPUT -o lo -j ACCEPT


    保存规则

    # service iptables save


    扩展匹配之状态追踪案例

    初始化
    # iptables -P INPUT ACCEPT
    # iptables -P OUTPUT ACCEPT
    # iptables -F

    放行对192.168.8.40 新建立、已经建立连接的ssh服务访问
    # iptables -A INPUT -d 192.168.8.40 -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    # iptables -A OUTPUT -s 192.168.8.40 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    # iptables -P INPUT DROP
    # iptables -P OUTPUT DROP




    //对每秒2次,高峰5次的ping包给予响应
    # iptables -A INPUT -d 192.168.8.40 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -m state --state NEW,ESTABLISHED -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT


    //放行80端口
    # iptables -A INPUT -d 192.168.8.40 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT


    验证
    # curl -I http://192.168.8.40/index.html
    HTTP/1.1 200 OK
    Date: Mon, 28 Dec 2015 15:11:36 GMT
    Server: Apache/2.4.9 (Unix)
    Last-Modified: Sun, 27 Dec 2015 19:39:40 GMT
    ETag: "1c-527e659749c1c"
    Accept-Ranges: bytes
    Content-Length: 28
    Content-Type: text/html


    //对输入、输出已经建立的连接放行
    # iptables -I INPUT -d 192.168.8.40 -m state --state ESTABLISHED -j ACCEPT
    # iptables -I OUTPUT -s 192.168.8.40 -m state --state ESTABLISHED -j ACCEPT


    对规则进行合并
    # iptables -I INPUT 2 -d 192.168.8.40 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT


    删除无用规则
    # iptables -L -n -v --line-numbers
    # iptables -D INPUT 3
    # iptables -D INPUT 4


    # iptables -D OUTPUT 2
    # iptables -D OUTPUT 2
    # iptables -D OUTPUT 2


    # iptables -L -n -v --line-numbers


    通过命令观察数据变化
    # watch -n .3 "iptables -L -n -v"




    扩展案例之RETURN:返回调用链

    # iptables -t filter -N clean_in
    //对数据包进行清洗
    # iptables -A clean_in -d 192.168.8.40 -p tcp --tcp-flags ALL ALL -j DROP
    # iptables -A clean_in -d 192.168.8.40 -p tcp --tcp-flags ALL NONE -j DROP
    # iptables -A clean_in -d 192.168.255.255 -p icmp -j DROP
    # iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP


    //应用clean_in规则
    # iptables -A clean_in -d 192.168.8.40 -j RETURN
    # iptables -I INPUT -d 192.168.8.40 -j clean_in


    将INVALID状态的连接放弃
    # iptables -I clean_in 5 -d 192.168.8.40 -m state --state INVALID -j DROP



    放行工作于被动模式的ftp服务

       1、确保iptables加载ftp协议支持的模块,ip_nat_ftp,ip_conntrack_ftp
          编辑/etc/syconfig/iftables-config文件,定义如下参数:
          IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
        2、放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态


    具体步骤:
    初始化:放行所有出和入的请求,开放ssh服务22号端口的访问并关闭所有进出请求
    # iptables -P INPUT ACCEPT
    # iptables -P OUTPUT ACCEPT
    # iptables -F


    # iptables -A INPUT -d 192.168.8.40 -p tcp --dport 22 -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -p tcp --sport 22 -j ACCEPT
    # iptables -P INPUT DROP
    # iptables -P OUTPUT DROP


    # iptables -A INPUT -d 192.168.8.40 -p tcp --dport 21 -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -p tcp --sport 21 -j ACCEPT


    放开21号端口不能访问FTP服务,继续放开20号端口依旧不能访问192.168.8.40的FTP服务(21号端口主要用来建立会话、认证,20号端口用来传输数据)
    # iptables -A INPUT -d 192.168.8.40 -p tcp --dport 20 -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -p tcp --sport 20 -j ACCEPT


    删除这两条无用的规则
    # iptables -D INPUT 3
    # iptables -D OUTPUT 3


    # iptables -A INPUT -d 192.168.8.40 -m state --state RELATED,ESTABLISHED -j ACCEPT
    # iptables -A OUTPUT -s 192.168.8.40 -m state --state ESTABLISHED -j ACCEPT


    加载FTP扩展模块(临时有效)
    # modprobe ip_nat_ftp
    # modprobe ip_conntrack_ftp


    想长期有效需要修改配置文件
    # vim /etc/sysconfig/iptables-config 
    修改:
    IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"


    ==================


    优化之 开放21,22,80端口的访问

    # iptables -I INPUT -d 192.168.8.40 -m state --state RELATED,ESTABLISHED -j ACCEPT
    # iptables -D INPUT 4


    # iptables -I INPUT 2 -d 192.168.8.40 -p tcp -m multiport --dport 21,22,80 -m state --state NEW -j ACCEPT
    # iptables -D INPUT 3
    # iptables -D INPUT 3


    # iptables -I OUTPUT -s 192.168.8.40 -m state --state ESTABLISHED -j ACCEPT
    # iptables -D OUTPUT 2
    # iptables -D OUTPUT 2
    # iptables -D OUTPUT 2


    保存规则


    # iptables-save > /etc/sysconfig/iptables-v1


    清空规则
    # echo "" > /etc/sysconfig/iptables
    # sed -i "/^$/d" /etc/sysconfig/iptables


    恢复规则
    # iptables-restore < /etc/sysconfig/iptables-v1 


  • 相关阅读:
    day18:json模块&time模块&zipfile模块
    Color Changing Sofa Gym
    Gym
    Gym
    Java的awt包的使用实例和Java的一些提示框
    分组背包 例题:hdu 1712 ACboy needs your help
    UVA1401 Remember the Word 字典树维护dp
    CodeForces833 B. The Bakery 线段树维护dp
    hdu4719 Oh My Holy FFF 线段树维护dp
    Little Difference Gym
  • 原文地址:https://www.cnblogs.com/reblue520/p/6239878.html
Copyright © 2011-2022 走看看