美文网首页
iptables防火墙

iptables防火墙

作者: uangianlap | 来源:发表于2016-10-20 16:01 被阅读79次

    标签(空格分隔): Linux 运维 防火墙 iptables


    iptables

    iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。由iptables程序包提供.术语 iptables 也经常代指该内核级防火墙。iptables 可以直接配置,也可以通过许多 前端[broken link: invalid section]
    图形界面[broken link: invalid section]
    配置。iptables 用于 ipv4ip6tables 用于 ipv6
    nftables 已经包含在 Linux kernel 3.13 中,以后会取代 iptables 成为主要的 Linux 防火墙工具。(摘自archwiki)

    iptables的4表5链

    Iptables,(带状态追踪的包过滤式)防火墙规则管理工具 组成部分(4表 5链 各种规则)如下:

    netfilter: 防火墙框架,位于内核空间.
    ip header(ipv4):
    hook function: 报文的行走路线 5条'链'
        input
        output
        forward
        preroutings
        postroutings
    

    内置链(chain)相当于围墙上的各道门,iptables上对应的hook function(勾子函数)
    ❶ PREROUTING
    ❷ INPUT
    ❸ FORWARD
    ❹ OUTPUT
    ❺ POSTROUTING

    表,也称功能(tables)(门上的各种规则)
    ❶ raw:关闭nat表上启用的连接追踪机制.剥离外部附加功能,以原始状态呈现
    ❷ mangle ['mæŋg(ə)l]: 拆解报文,做出修改,并重新封装起来.
    ❸ nat: network address translation网络地址转换,修改源IP或目标IP,也可以改端口(源端口目标端口)
    ❹ filter: 过滤,防火墙

    表与链的关系与报文的流向

    功能(tables) --> 链(chain)
        tables规则在每道门(chain)执行次序(从高到低)如下
        raw:    REROUTING, OUTPUT
        mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
        nat:    PREROUTING, OUTPUT, POSTROUTING, [INPUT](CentOS7)
        filter: INPUT, FORWARD, OUTPUT
    报文流向
        注入本机: PREROUTING --> INPUT
        由本机流出: OUTPUT --> POSTROUTING
        经由本机转发: PREROUTING --> FORWARD --> POSTROUTING
    

    iptables命令的详细使用

    iptables命令:将iptables的库想象成数据库,这些命令无非是对数据的增删改查等等。
        iptables [-t table] {-A|-C|-D} chain rule-specification
        iptables [-t table] -I chain [rulenum] rule-specification
        iptables [-t table] -R chain rulenum rule-specification
        iptables [-t table] -D chain rulenum
        iptables [-t table] -S [chain [rulenum]]
        iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
        iptables [-t table] -N chain
        iptables [-t table] -X [chain]
        iptables [-t table] -P chain target
        iptables [-t table] -E old-chain-name new-chain-name
        rule-specification = [matches...] [target]
        match = -m matchname [per-match-options]
        target = -j targetname [per-target-options]
    

    iptables语法格式

    iptables [-t table] COMMAND chain cretieria [-m matchname [per-match-options]] -j targetname [per-target-options]`  
        -t table    # 指定规则所作用的表,raw, mangle, nat, [filter]
        chain       # 指定规则所作用的链 PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING
        COMMAND     # 对链及这个链上的规则的管理(增删查改)
        cretieria   # 匹配条件
    

    COMMAND参数对链与规则的管理

        `链管理`
        -N:new,自定义一条新的规则链,默认是不会被引用的,仅在默认链上通过某规则进行调用方可生效,因此每个自定义链都有引用计数。
            示例: iptables -t filter -N in_web
        -X CHAIN_NAME: delete,只能删除自定义的规则链(空的且引用计数为0),如果没有加链名,则会删除所有自定义空链。
        -E old_name new_name: rename,重命名自定义链,(引用计数为0才可以,正在被引用的链不能重命名)。
        
        -P: Policy,设置默认策略,对filter表中的链而言,其默认的策略有ACCEPT DROP REJECT   #注意这里不需要-j参数
            示例: iptables -t filter -P INPUT DROP|ACCEPT|REJECT
        -F: flush, 清空指定的规则链或删除指定链上的规则。如果没有跟链名则是删除指定表的所有链。      
            示例:iptables [-t table] -F [chain[rulenum][options...]]
        -Z CHAIN_NAME: zero, 置零指定的链
            iptables的每条规则都有两个计数器:
                1.匹配到的报文的个数(pkts)
                2.匹配的所有报文的大小之和(bytes)
    
        `规则管理(自己编写的)`
        -A: append,在末尾追加一条链规则. 
            例: iptables -t filter -A INPUT -s 192.168.1.10 -d 192.168.1.123 -j ACCEPT
    
        -I: insert,插入,要指明rulenum,省略时默认插入到第1条。
    
        -D: delete, 删除指定链上的指定规则,指明规则序号或规则本身。
            例: iptabls -D INPUT 1 [-j DROP]
                
        -R: replace,iptables [-t table] -R chain rulenum rule-specification;替换指定链上的指定规则.
            例: iptables -t filter -R INPUT 1 -s 10.1.0.71 -j DROP   
        注:不同类别的规则顺序上面应该为使用较频繁的放上(前)面,相同类型的规则的话那么应该将匹配范围小的放在较上(前)面.
    
        `查看选项`
        -L:               list,列出指定链上的所有规则。
        -n:               numberic,以数字格式显示地址和端口。
        -v:               verbose, 详细信息。
        -vv,-vvv:        更详细的信息。
        -x:               exactly,显示计数器结果的精确值。
        --line-numbers:   显示链上的某条规则的序号。
    

    iptables命令的匹配条件(cretieria)(多个条件之间默认是与关系)

    基本匹配条件:无需加载任何模块,由iptables/netfilter自行

    [!] -s, --source address[/mask][,...]: 检查报文中的源IP地址是否符合此处指定的地址或范围。
    例: iptables -t filter -A INPUT -s 
               
    [!] -d, --destination address[/mask][,...]: 检查报文中的目标IP地址是否符合此处指定的地址范围。
    
    [!] -p, --protocol protocol: 传输层的协议(tcp, udp, udplite, icmp, esp, ah, sctp or all)类型 如没有指定的话则为all
        
    [!] -i, --in-interface name: 数据报文流入的接口.只能用在INPUT,  FORWARD 与 PREROUTING链上。
    例: "iptables -t filter -R INPUT -s 172.16.100.6 -d 172.16.100.67 -p icmp -i eno16777736 -j DROP"
    [!] -o, --out-interface name: 数据报文即将离开本机经由的接口.只能用在FORWARD,  OUTPUT and POSTROUTING链上。
    
    -m:显示指明要使用的扩展模块
    -j, --jump TARGET: 跳转目标(即处理动作)
    

    扩展匹配条件:需要加载扩展模块,方可生效. #CentOS中可以man iptables-extensions查看具体内容说明

    ㈠ 隐式扩展(不需要手动加载扩展模块); 因为它们是对协议的扩展,所以但凡使用-p指明了协议,就表示已经指明了要扩展的模块。
        -p {tcp|udp|icmp}
            tcp:
                [!] --source-port,--sport port[:port]: 匹配报文的源端口(可给出多个连续的端口)
                [!] --destination-port,--dport port[:port]: 匹配报文的目标端口(同上)
                示例: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 22 -j DROP #禁止访问本机tcp的22号端口即ssh服务
    
                [!] --tcp-flags mask comp: 带2个参数,其取值为(SYN(建立连接) ACK(ACK) FIN(关闭连接) RST(连接重置) URG() PSH(有数据传输) ALL NONE)
                    mask是我们必须要检查的标识位(值为0或1),而comp是我们必须要设置的.
                    "iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
                    will only match packets with the SYN flag set, and the ACK,
                    FIN and RST flags unset."--> 要检查的标识位有SYN,ACK,FIN,RST,其中SYN必须值为1,余下的必须为0.即匹配tcp第一次"握手" 即确认是一个新请求
    
                [!] --syn: 相当于--tcp-flags SYN,ACK,FIN,RST SYN
    
            udp:
                [!] --source-port,--sport port[:port]:
                    Source port or port range specification.  See the description
                    of the --source-port option of the TCP extension for details.
    
                [!] --destination-port,--dport port[:port]
                    Destination  port  or  port  range  specification.See the
                    description of  the  --destination-port option of the TCP
                    extension for details.
    
            icmp: --protocol icmp被指定了才生效,提供下面的选项.   # 互联网控制报文协议  主要是用于探测网络上主机或服务的可用性
                [!] --icmp-type {type[/code]|typename}
                    This allows specification of the ICMP type, which  can  be  a
                    numeric  ICMP  type,  type/code pair, or one of the ICMP type
                    names shown by the command
                    iptables -p icmp -h
                    两个最常见的type/code(更详细的类型与代码请GOOGLE)      
                    echo-request: 8/0  # ping出去的报文
                    echo-reply: 0/0    # ping返回的报文
    
                示例: iptables -A INPUT -s 0.0.0.0/0 -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP # 限制任何人ping自己
                     iptables -A OUTPUT -d 0.0.0.0/0 -s 172.16.100.67 -p icmp --icmp-type 0/0 -j DROP  # 
    
    ㈡ 显式扩展(指明需要手动加载扩展模块), -m matchname [per-match-options]
    
        1、multiport
            以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified. 
    
            [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
            [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
            [!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;
            例: iptables -t filter -A INPUT -d 10.1.0.6 -p tcp -m multport --dports 22,23,80 -j ACCEPT
              iptables -t filter -A OUTPUT -s 10.1.0.6 -p tcp -m multport --sports 22,23,80 -j ACCEPT
        2、iprange
            以连续的ip地址范围指明多地址匹配条件();
    
            [!] --src-range from[-to]  
            [!] --dst-range from[-to]
                示例: 
    
        3、string
            对报文中的应用层数据做字符串匹配检测(string或--hex-string 与 --algo必须给);
            [!] --string pattern
            [!] --hex-string pattern        # 没有给出偏移量的话指代全文
            --algo {bm|kmp}:字符串匹配检查算法;
            --from offset: 从最开始处偏移多少个字符
            --to offset: 从最尾端向前偏移多少个字符
            示例: iptables -A OUTUT -d 172.18.20.0/24 -s 172.18.20.96 -p tcp --sport 80 -m string --string "sex" --algo bm -j REJECT
    
        4、time
            根据报文到达的时间与指定的时间范围进行匹配度检测;
    
             --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]   
             --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    
             --timestart hh:mm[:ss]
             --timestop hh:mm[:ss]
    
             [!] --monthdays day[,day...]       
    
             [!] --weekdays day[,day...]    1~7代表周一到周日,也可用 Mon,Tue,Wed, ...等英文标识
                示例: iptables -t filter -I INPUT -d 10.1.0.6 -p tcp --dport 23 -m time --timestart  16:00:01 --timestop 09:59:59 --weekdays Sat,Sun -j REJECT     
    
        5、connlimit
            根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;
    
            --connlimit-upto n:连接数小于等于阈值;  # 单ip并发连接数据<= n
            --connlimit-above n:连接数超出阈值;    # 单ip并发连接数 > n 
            例: iptables -t filter -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
    
        6、limit -->基于收发报文的速率进行匹配;
            --limit rate[/second|/minute|/hour|/day]   # 包的速率,如每分钟多少个包 每小时多少个包 
            --limit-burst NUMBER   # 默认值为5, 最大允许匹配的初始化包数量  想象一下摩天轮
             例:iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT
    
        7、**state   # 对系统安全性有很大的提升   cat /proc/sys/net/nf_conntrack_max 查看   在调度器主机千万不要开启此功能
            状态(state_name)检测:连接追踪机制(conntrack) tcp udp icmp 都支持   
                        NEW:    新连接
                ESTABLISHED:    已建立的连接
                    RELATED:    相关联的连接,由某个已存在的连接发起请求之后建立的(第一次的)连接.
                    INVALID:    无法识别的连接, state表中有数据,但因为某种原因而无法识别了.
                  UNTRACKED:    未被追踪连接。     
    
            需要安装相关的内核模块:
                modprobe nf_conntrack
                modprobe nf_conntrack_ipv4
                modprobe nf_conntrack_ftp   --> 专门用来实现追踪ftp  RELATED状态的
    
                追踪到的连接:/proc/net/nf_conntrack文件中;
    
                能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
                    建议调整至足够大;
    
                不同的协议的连接追踪时长不同:
                    /proc/sys/net/netfilter/   # 建议调小 
    
            [!] --state state_name
    
            如何开放被动模式的ftp服务:
            (1) 装载追踪ftp协议的模块;
            # modprobe nf_conntrack_ftp
    
            (2) 允许入站命令连接 NEW ESTABLISHED状态的报文
                示例: iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    
            (3) 允许放行
            # iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    
            (4) 放行出站的ESTABLISHED连接   # 这条规则的好处是基本上控制了入站请求,就不需要新建出站请求了.以不变应万变
            # iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
    
    
        iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
        iptables -t filter -A INPUT -d 本机IP -p tcp -m multiport --dports 21,22,23,80 -m state --state NEW -j ACCEPT
         
        iptables -t filter -A OUTPUT -s 172.18.20.96 -m state --state ESTABLISHED -j ACCEPT  #以一敌万的配置
        iptables -t filter -P INPUT DROP   #这两条建议使用自定义规则实现,可以防止执行iptables -F命令后无法远程连接    
        iptables -t filter -P OUTPUT DROP
    

    处理动作(target) # man iptables-extensions

    -j targetname [per-target-options]
        ACCEPT: 允许访问
        DROP:   拒绝
        REJECT: "礼貌"拒绝
            --reject-with TYPE: TYPE(可以是 icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable... 默认为icmp-port-unreachable)   
    
        RETURN: 返回调用链  例如自定义链返回
    
        REDIRECT: 端口重定向(映射) # 在nat表 PREROUTING OUTPUT链上有效
            例:iptables -t nat -A PREROUTING -d 192.168.22.2,192.168.22.3 -p tcp
            --dport 80 -j REDIRECT --to-ports 8080
    
        LOG: 记录日志
            --log-level:
            --log-prefix: 日志信息的前导信息
            --log-tcp:
            ...
    
        MARK: 做防火墙转换
            iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,3306 -j MARK --set-mark 11
    
        DNAT: 目标地址转换  放在PREROUTING链上  nat表
            示例: iptables -t nat -A PREROUTING -d 10.1.0.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.22.2:80
            iptables -t nat -A PREROUTING -d 10.1.0.6 -p tcp --dport 22 -j DNAT --to-destination 192.168.22.3:8800
    
        SNAT: 源地址转换  只能放在POSTROUTING或INPUT链上   只在放在nat表
            示例: iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -j SNAT --to-source 10.1.0.6    # 192.168.22网段的主机转换成网关地址10.1.0.6访问外网地址
    
        MASQUERADE: 地址伪装,   # 只能用在nat表 POSTROUTING链上
            示例: 
        ...
    
        -j 自定义链名-->即处理动作转到自定义链上去  就像调用一个函数似的
    
    

    保存和载入iptables规则

    保存:iptables-save > /PATH/TO/SOME_RULE_FILE
    重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE
        -n, --noflush:不清除原有规则
        -t, --test:仅分析生成规则集,但不予提交;
    
        注意:重载文件中的规则,会清除已有规则;
    
    CentOS 6:
        保存规则:service  iptables  save
            保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;
        重载规则:server iptables restart
            默认重载/etc/sysconfig/iptables文件中的规则
    
        脚本配置文件:/etc/sysconfig/iptables-config
            用于指明要装载的模块;
    
    CentOS 7开机自动生效规则:
        (1) firewalld服务;
        (2) shell脚本,直接记录iptables命令;
        (3) 自定义unit file或init script;
    

    iptables规则优化的思路

    (1) 优先放行双方向状态为ESTABLISHED,RELATED的报文;
    (2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
    (3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
    (4) 设置默认策略:白名单机制
        (a) 可使用iptables -P设定默认策略;
        (b) 建议在规则链的最后定义规则做为默认策略;
    

    相关文章

      网友评论

          本文标题:iptables防火墙

          本文链接:https://www.haomeiwen.com/subject/vpoaettx.html