zoukankan      html  css  js  c++  java
  • iptables详解

    iptables: 包过滤型的防火墙
    firewall:防火墙,隔离工具:工作于主机和网络边缘,对于进出本主机或者网络的报文根据事先定义的检查规则匹配检测,对于能够被规则匹配的报文作出相应的处理组件

    iptables原理图


    netfilter:kernel
    iptables:rules until
    hook function 钩子函数

    input
    output
    forward
    prerouting
    postrouting

    链:(内置)
    PRETOUTING
    INPUT
    FORWORD
    OUTPUT
    POSTROUTING
    功能:
    filter:过滤
    nat:network address translation 用于修改源ip或目标ip也可以改端口
    mangle:拆解报文,作出修改,并重新封装,如修改ttl值
    raw:关闭nat表上启用的连接追踪的功能
    功能<--链
    raw:prerouting output
    mangle:prerouting input forward output postrouting
    nat:prerouting {input coent7}output postrouting
    filter:input forward output

    报文流向:
    流入本机 prerouting——》input
    由本机流出:output——》postrouting
    转发:prerouting——》 forward——》postrouting
    路由功能发生的时候
    报文进入本机后:
    判断目标主机是?
    报文离开本机之前
    判断经由那个接口送往下一站?

    rpm -ql iptables 安装iptables有哪些文件有处理条件 有处理动作

    iptables/netfilter
    规则:
    组成部分:
    匹配条件:根据规则的匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理
    基本匹配条件
    扩展匹配条件
    处理动作
    基本处理动作
    扩展处理动作
    自定义处理机制
    iptables的链:内置链和自定义链
    内置链:对应于hook function
    自定义链:用于内置链的扩展和补充;实现更灵活的规则管理机制

    添加规则时的考量点:
    (1)要实现那种功能:判断添加到那个表上;
    (2)报文流经的路径:判断添加到那个链上;越早越优先

    链:链上的规则次序,既为检查的次序;因此,隐含一定的应用法则
    (1)同类规则访问同一应用,匹配小的范围放上面
    (2)不同类的规则,访问不同的应用,匹配到报文频率大的放在上面
    (3)将那些可由一条规则描述的多个规则合并起来
    (4)设置默认策略
    iptables 命令
    iptables [-t table] {-A|-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【-t table】 COMMAND chain -m matchname [per-match-options] -j targetname [per-target-options]
    -t table: raw mangle nat filter
    COMMAND:
    链管理:
    -N:new自定义新的规则链
    -X:delete删除自定义的规则链
    -P:policy 设置模式策略的
    accept:接受
    drop:丢弃
    reject:拒绝
    -E:重命名自定义链;引用计数不为0的自定义链不能重命名也不能被删除
    规则管理:
    -A:append 追加
    - I:insert 插入 要指明位置,省略表示第一条
    -D:delete删除,(1)指明规则号(2)指明规则本身
    -R:replace 替换 指定链上的指定规则(1)指明规则号(2)指明规则本身
    -F :flush 清空指定的规则链
    -Z : zero 置零 iptables每一条规则都有两个计数器,1:匹配本规则的报文个数;2匹配到的所有报文大小之和
    查看:
    -L : list 列出指定链上的所有规则
    -n:numberic 以数字格式显示地址和端口号
    -v:verbose 详细信息 -v -vv
    -x : exactiy 显示计数器结果的精确值;
    --line-numbers 显示行号
    chain:prerouting input forward output postrouting
    匹配条件:
    基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供
    [!]-s, --source address [/mask] 检查报文中的源ip地址是否符合此指定的的地址范围;
    [!]-d, --destination address [/mask] 检查报文目的ip地址是否符合此指定的的地址范围;
    [!]-p , --protocol protocol 指定的协议 man iptables
    [!]-i , --in-interface name 数据报文流入的接口用于 PREROUTING INPUT FORWARD
    [!]-o , --out-interface name 数据报文流出的接口 FORWARD OUTPUT POSTROUTING
    扩展匹配条件:需要加载扩展模块,方可生效 -m
    隐试扩展:不需要手动加载扩展模块,因为他们是对协议的扩展,所以但凡使用-p指明了协议,就表示已经指明了要扩展的模块
    tcp:
    [!] --source-port, --sport port[:port] 匹配报文的源端口,可以是端口范围
    [!] --destination-port, --dport port [:port] 匹配报文的目标端口,可以是端口范围
    iptables -t filter -A INPUT -s 172.16.123.1 -d 192.12.123.22 -p tcp --dport 22 -j DROP tcp22端口禁止
    [!] --tcp-flag mask comp tcp的标志位
    mask is the flags which we should examine ,written as a comma-separated list 例如:SYN ACK FIN RST
    comp is a comma-separated list of flags which must be set 例如:syn
    例如:--tcp-flage SYN,ACK,FIN,RST SYN == --syn 表示要检查的标志位是syn,ack fin ret 其中syn必须为1 其余的必须为0
    udp:
    [!] --source-port, --sport port[:port] 匹配报文的源端口,可以是端口范围
    [!] --destination-port, --dport port [:port] 匹配报文的目标端口,可以是端口范围
    icmp:
    [!] --icmp-type{type[/code]|typename}
    echo-request :8
    echo-reply:0
    例如:iptables -A INPUT -d 192.168.2.1 -p icmp --icmp-type 8 -j DROP

    显示扩展:

    处理动作:
    -j targetname 【per-target-options】
    accept
    drop
    reject
    return :返回调用链
    redirect:端口重定向
    log:记录日志
    mark:做防火墙标记
    dnat:目标地址转换
    snat:源地址转换
    masquerade:地址伪装
    。。。自定义链

    防火墙(服务):在CentOS 6 service iptables {start|stop|restart|status}
    start:读取事先保存的规则,并应用到netfilter上
    stop:清空netfilter上的规则,以及还原默认策略
    status:显示生效规则
    restart :清空netfilter上的规则,在读取事先保存的规则,并应用到netfilter上;
    默认的规则文件:/etc/sysconfig/iptables
    iptables -t nat -F PREROUTING
    iptables -N mychain
    iptables -X mychain

    CentOS 7
    systemctl start|stop|restart|status firewalld.service
    systemctl disable filrewalld.service
    systemctl stop firewalld.service

    iptables -t filter -A INPUT -s 172.15.100.1 -d 172.15.100.22 -j DROP
    iptabels -t filter -L -n --line-numbers
    动态查看 watch -n1 'iptables -L -nv'

    回顾: iptables/netfilter
    netfilter :kernel framework
    iptables :编写的规则的CLI

    四个表:raw mangle nat filter
    5个链:PRETOUTING INPUT FORWARD OUTPUT POSTROUTING

    iptables 【-t table 】 subcommand 【chain】【匹配条件】【-就 target】
    subcommand:
    链:-N -X -E -P
    规则:-A -I -D -R -F -Z
    查看:-L
    -n -v -x --line-numbers
    匹配条件:
    基本:-s -d -p -i -o
    扩展:
    隐式:【-m】
    tcp:--dport --sport --tcp-flage --syn
    udp:--dport --sport
    icmp:--icmp-type
    echo request 8
    echo reply 0
    显示:使用帮助文档在Centos 6 man iptables 在Centos 7 man iptables-extensions
    1:multiport扩展
    以离散方式定义多个端口匹配,最多15个
    【!】 --source-ports,--sports【port:port】源
    【!】 --destination-ports,--dports【port:port】目标
    【!】 --ports【port:port】 源和目标
    iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j accept
    2: iprange 扩展
    指明连续的(但一般不值整个网络)ip范围地址
    【!】--src-range from 【-to】 源ip地址;
    【!】--dst-range from 【-to】目标ip地址
    iptables -A INPUT -d 172.16.100.3 -p tcp --dport 80 -m iprange --src-range 172.16.100.100-172.16.100.105 -j DROP
    3:string扩展
    对报文的应用层数据做字符串匹配检测
    --algo{bm|kmp}: 字符串匹配检测算法
    bm:boyer-Moore
    kmp:knuth-partt-Moore
    【!】 --string pattern :要检测的字符串的模式;

    /var/www/html/index.html <h1> www.baidu.com</h1> kan log /var/log/httpd/access.log
    iptables -A OUPUT -s 172.16.100.11 -d 172.16.0.0/24 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
    4 :time 扩展
    根据报文到达的时间与指定的时间范围进行匹配;
    iptables -A INPUT -s 172.16.0.0/24 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 16:30 --weekdays Sat,Sun {--kerneltz }-j DROP
    --kerneltz 使用内核上的时间,Cent os 7
    5:connlimit 扩展
    根据每一个客户端并发连接数量做匹配
    --connlimit-upto N :连接的数量小于等于N时候匹配
    --connlimit-above N:连接的数量大于N时匹配
    iptables -A INPUT -d 172.12.12.12 -p tcp --dport 22 -m connlimit --limit-above 3 -j REJECT
    ftp screen
    6: limit 扩展
    基于收发报文的速率做匹配
    令牌桶过滤器,摩天轮
    --limit rate 【/second|/minute/hour/day】
    --limit-burst number
    iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
    iptables -I INPUT 2 -p icmp -j reject
    7:state 扩展(重点)
    根据"连接追踪机制conntrack"去检测连接状态和tcp一点关系都没有;是netfilter的内核一种状态,在内核中的一种记录有生存时间
    记录conntrack的作用是什么! 追踪本机上的请求响应之间的关系,
    NEW:第一次
    ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间所进行的通讯状态
    RELATED:相关联的连接;如ftp中的命令连接和数据连接之间的关系。
    INVALID:无效的连接
    UNTRACKED;未进行追踪的连接 /var/ftp/ anonymous
    【!】--state state
    web服务:iptables -A INPUT -d 173.123.123.123 -p tcp -m multiport --dport 22,80 -m state --state NEW -j ACCTPT established
    iptables -A OUTPUT -s 173.123.123.123 -p tcp -m multport --sport 22,80 -m state --state ESTABLISHED -j ACCEPT
    iptables -P {INPUT|OUTPUT|FORWARD} DROP
    对于并发连接超大的,有损害,负载均衡器在/proc/sys/net/nf_conntrack_max修改连接追踪的最大连接数,当模板满载时,后续连接可以超时 内核带宽10GHZ 查看已经追中到的连接/proc/net/nf_conntrack
    不同协议的连接追踪的时间不同 在/proc/sys/net/netfilter/ 都有不同协议的时间
    使用iptables 开启ftp被动模式 查看这个模块modinfo nf_conntrack_ftp 加载这个模块 modprobe nf_conntarck_ftp lsmod 查看
    iptables -A INPUT -d 172.16.123.12 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -s 172.16.123.12 -p tcp --dport 21 -m state --state ESTABLISHED -j ACCEPT
    iptables -A INPUT -d 172.16.123.12 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -s 172.16.123.12 -p tcp-m state --state ESTABLISHED -j ACCEPT

    主动模式

    iptables -Z OUTPUT 1 清空OUTPUT第一条规则的计数器

    新建自定义链 iptables -N icmp -E进行重命名,引用是0的时候可以修改
    iptables -A icmp -d 172.156.100.1 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT 自定义链的规则
    iptables -A INPUT -j icmp 引用自定义链 自定义链中没有规则匹配到,在自定义链中添加一条iptables -A icmp -j return
    自定义链需要被调用的时候才可以生效,自定义链中最后需要定义返回规则 赶回规则是使用target 叫做return

    规则的使用期限:
    使用iptables 命令定义的规则,手动删除之前,生效期限为kernel存货期限;
    保存规则:
    保存规则至指定的文件:
    Cent OS 6: service iptables save 将规则保存至/etc/sysconfig/iptables;
    iptables-save > /path/to/some_rules_file将规则保定到指定文件
    iptables-restore < /path/from/some_rules_file

    Cent OS 7 :
    iptables-save > /path/to/some_rules_file
    iptables-restore < /path/from/some_rules_file

    自动生效规则文件中的规则:
    (1)用脚本保存各iptables命令,让此脚本开机后自动运行;
    /etc/rc.d/rc.local 文件中添加脚本路径
    (2)用规则文件保存各规则,开机时自动载入此规则文件中的规则
    /ect/rc.d/rc.local 文件添加
    iptables-restore < /path/from/iptables_rulus_file

    cent 7: 引入了新的iptables前段工具Firewalld 其管理工具有,firewalld-cmd。firewalld-config

    layer 7 --l7
    应用:xunlei qq
    -m layer --l7proto xunlei -j DROP
    1,给内核打补丁,重新编译安装内核 2.6.28版本
    :下载内核linux-2.6.28.10.tar.gz
    tar xf linux-2.6.28.10.tar.gz -C /usr/src
    cd /usr/src
    ln -sv linux-2.6.28.10 linux
    tar xf netfilter-layer7-v2.22.tar.gz -C /usr/src
    cd linux
    patch -p1 ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
    cp /boot/config-2.618-308.e15.config
    yum grouplist
    make menuconfig
    make

    2,给iptables源码打补丁,并重新编译安装iptables
    : 下载netfilter-layer7-v2.22.tar.gz l7-protocols-2009-05-28.tar.gz iptables-1.4.6.tar.gz
    service iptables stop
    cp /etc/rc.d/init.d/iptables &&iptables-config
    rpm -qa | grep ipt
    rmp -e iptables iptables-ipv6 iptstate --nodeps
    tar xf iptables-1.4.6.tar.gz -C /ust/src

    3,安装l7proto

    1. 匹配TTL值

    - 匹配TTL 大于 n(如 2) 的报文
    iptables -t mangle -A POSTROUTING -m ttl --ttl-gt 2 -j DROP
    - 1
    - 1

    - 匹配TTL 小于 n 的报文
    iptables -t mangle -A POSTROUTING -m ttl --ttl-lt 2 -j DROP
    - 1
    - 1

    - 匹配TTL 等于 n 的报文
    iptables -t mangle -A POSTROUTING -m ttl --ttl-eq 2 -j DROP
    - 1
    - 1

    2. 修改TTL值

    - 将TTL值 设定 为 n (如 2)
    iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 2
    - 1
    - 1

    - 将TTL值 减小 n
    iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 2

    - 1

    - 将TTL值 增大 n(一般情况下不要去增大TTL值)
    iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 2

  • 相关阅读:
    rsync特性
    01 什么是爬虫
    celery的使用
    redis的使用
    GIT使用大全
    多项式的高级运算
    SP1557 GSS2
    题解 CF997E 【Good Subsegments】
    P3920 [WC2014]紫荆花之恋
    题解 P3750 【[六省联考2017]分手是祝愿】
  • 原文地址:https://www.cnblogs.com/APeng2019/p/10719441.html
Copyright © 2011-2022 走看看