zoukankan      html  css  js  c++  java
  • iptables的扩展匹配

    iptables的匹配条件

    一、通用匹配:-s、-d、-p、-i、-o

    二、扩展匹配

    1、隐含扩展:使用-p{tcp|udp|icmp}指定某特定协议后,自动能够对协议进行扩展

    -p tcp

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

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

        --tcp-flags

        URG,PSH,RST,SYN,ACK,FIN也可以使用ALL和NONE

        --tcp-flags rst,syn,ack,fin syn 四个标志位中只有syn为1其他都为0的意思

    放行来自于192.168.1.0/24网络的主机对本机ssh服务的请求

    iptables -t filter -A INPUT -s 192.168.1.0/24 -d 192.168.1.202 -p tcp --dport 22 -j ACCEPT

    iptables -t filter -A OUTPUT -s 192.168.1.202 -d 192.168.1.0/24 -p tcp -sport 22 -j ACCEPT

    -p udp

        放行本机tftp服务

            iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.202 -p udp --dport 69 -j ACCEPT

            iptables -A OUTPUT -s 192.168.1.202 -d 192.168.1.0/24 -p udp --sport 69 -j ACCEPT

    -p icmp

        --icmp-type

        8:ping请求

        0:ping响应

    允许本机ping其他主机:

        iptables -A INPUT -s 192.168.1.202 -p icmp --icmp-type 8 -j ACCEPT

        iptables -A OUTPUT -d 192.168.1.202 -p icmp --icmp-type 0 -j ACCEPT

    允许其他主机ping本机:

        iptables -A INPUT -d 192.168.1.202 -p icmp --icmp-type 8 -j ACCEPT

        iptables -A OUTPUT -s 192.168.1.202 -p icmp -icmp-type 0 -j ACCEPT

    2、显式扩展:必须要明确指定得扩展模块

        -m 扩展模块名称 --专用选项1 --专用选项2

    multiport:多端口匹配,一次指定多个(15个以内)离散端口

        --source-ports,--sports port [,port|,port:port]

        --destination-ports, --dports

        --ports

    例子:

    # iptables -I INPUT -d 192.168.1.202 -p tcp -m multiport --dports 22,80 -j ACCEPT

    # iptables -I OUTPUT -s 192.168.1.202 -p tcp -m multiport --sports 22:80 -j ACCEPT

    iprange:ip地址范围

        [!] --src-range from[-to]

        [!] --dst-range from[-to]

    例子:

    # iptables -A INPUT -d 192.168.1.202 -p tcp --dport 23 -m iprange --src-range 192.168.1.1-192.168.1.200 -j ACCEPT

    # iptables -A OUTPUT -s 192.168.1.202 -p tcp --sport 23 -m iprange --dst-range 192.168.1.1-192.168.1.200 -j ACCEPT

    time:指定时间范围

        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

        --timestart hh:mm[:ss]

        --timestop hh:mm[:ss]

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

    例子:指定8081端口的访问时间位周一至周五的八点到十八点

        # iptables -A INPUT -d 192.168.1.202 -p tcp --dport 8081 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT

    # iptables -A OUTPUT -s 192.168.1.202 -p tcp --sport 8081 -j ACCEPT

    string:字符串匹配

        --algo {bm|kmp}:字符匹配查找时使用的算法

        --string "STRING":要查找的字符串

        --hex-string "HEXSTRING":要查找的字符,先编码成16进制格式

    例子:拒绝页面中含有hello的页面

    # iptables -I OUTPUT -s 192.168.1.202 -p tcp --sport 80 -m string --algo kmp --string "hello" -j DROP

    connlimit:每IP对指定服务的最大并发连接数

    [!] --connlimit-above n

    例如:每个IP超过5个连接即拒绝掉

    # iptables -I INPUT -d 192.168.1.202 -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP

    limit:报文速率控制

        --limit #[/second|/minute|/hour|/day]

        --limit-burst number

    例子:限制icmp包峰值为5个每秒只能通过两个

    # iptables -A INPUT -d 192.168.1.202 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -j ACCEPT

    可以使用hping3做测试,每秒钟发送多个icmp请求

    使用watch命令可以看到防火墙的数据包实时变化

    # watch -n 1 'iptables -L -nv'

    state:状态匹配(只要是四层协议都能够基于state做追踪)

        ip_conntract,nf_conntrack

        --state

            NEW:NEW说明这个包是我们看到的第一个包

            ESTABLISHED:ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。

            RELATED:一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。

            INVALID:INVALID说明数据包不能被识别属于哪个连接或没有任何状态。

    调整连接追踪功能所有能容纳的追踪的追踪最大连接数:

        # cat /proc/sys/net/nf_conntrack_max 定义了连接追踪的最大值,按需调整该值

        # less /proc/net/nf_conntrack 记录了当前追踪的所有连接

        # cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established tcp的established的超时时间

        法则:

            (1)、对于进入的状态为ESTABLISHED都应该放行

            (2)、对于出去的状态为ESTABLISHED都应该放行

            (3)、严格检查进入的状态为NEW的连接

            (4)、所有状态为INVALIED都应该拒绝

    如何放行工作与被动模式下的FTP服务?

    确保iptables加载ftp协议支持的模块:ip_nat_ftp,ip_conntrack_ftp

    手动装载:

    # modprobe ip_nat_ftp

    # modprobe ip_conntrack_ftp

    添加到配置文件自动装载:

    编辑配置文件:

    # vim /etc/sysconfig/iptables-config

    IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

    放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态

    ftp放行20、21端口

    # iptables -A INPUT -d 192.168.1.202 -p tcp --dport 22 -j ACCEPT

    # iptables -A OUTPUT -s 192.168.1.202 -p tcp --sport 22 -j ACCEPT

    # iptables -P OUTPUT DROP

    # iptables -P INPUT DROP

    # iptables -A INPUT -d 192.168.1.202 -p tcp --dport 21 -j ACCEPT

    # iptables -A OUTPUT -s 192.168.1.202 -p tcp --sport 21 -j ACCEPT

    # iptables -A INPUT -d 192.168.1.202 -p tcp --dport 20 -j ACCEPT

    # iptables -A OUTPUT -s 192.168.1.202 -p tcp --sport 20 -j ACCEPT

    # iptables -A INPUT -d 192.168.1.202 -p tcp -m state --state RELAY,ESTABLISHED -j ACCEPT

    # iptables -A OUTPUT -s 192.168.1.202 -p tcp -m state --state ESTABLISHED -j ACCEPT

    # iptables -I INPUT -d 192.168.1.202 -m state --state RELATED,ESTABLISHED -j ACCEPT

    # iptables -I INPUT 2 -d 192.168.1.202 -p tcp -m state --state NEW -m multiport --dports 9001,80,21,22 -j ACCEPT

    # iptables -I OUTPUT -s 192.168.1.202 -m state --state ESTABLISHED -j ACCEPT

    # iptables -D INPUT 3

    # iptables -D INPUT 3

    # iptables -D INPUT 3

    # iptables -D OUTPUT 2

    # iptables -D OUTPUT 2

    # iptables -D OUTPUT 2

    最终的规则就是:

    -A INPUT -d 192.168.1.202/32 -m state --state RELATED,ESTABLISHED -j ACCEPT

    -A INPUT -d 192.168.1.202/32 -p tcp -m state --state NEW -m multiport --dports 9001,80,21,22 -j ACCEPT

    -A OUTPUT -s 192.168.1.202/32 -m state --state ESTABLISHED -j ACCEPT

    -j target

        ACCEPT,DROP,REJECT,LOG,REDIRECT,SNAT,DNAT,MASQUERADE,MARK,RTURN,自定义链

    例如:

    # iptables -A INPUT -d 192.168.1.202 -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    # iptables -A OUTPUT -s 192.168.1.202 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    添加自定链,过滤恶意数据包(标志位全为0或1):

    # iptables -t filter -N clean_in

    # iptables -A clean_in -d 192.168.1.202 -p tcp --tcp-flags ALL ALL -j DROP

    # iptables -A clean_in -d 192.168.1.202 -p tcp --tcp-flags ALL NONE -j DROP

    # iptables -A clean_in -d 192.168.1.255 -p icmp -j DROP

    # iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP

    # iptables -A clean_in -d 192.168.1.202 -j RETURN

    # iptables -I INPUT -d 192.168.1.202 -j clean_in

    拒绝状态为INVALID

    # iptables -I clean_in 5 -d 192.168.1.202 -m state --state INVALID -j DROP

  • 相关阅读:
    二叉排序树(B-Tree)-c实现
    队列(Queue)-c实现
    栈(stack)--c实现(使用双链表)
    链表(list)--c实现
    c 和 指针读书笔记(1)
    c traps and pitfalls reading notes(2)
    js 控制
    正则表达式
    Android 笔记
    Android 布局方式学习
  • 原文地址:https://www.cnblogs.com/fansik/p/5959576.html
Copyright © 2011-2022 走看看