zoukankan      html  css  js  c++  java
  • iptables

    iptables

    1 Firewall:隔离工具

    1.1 Packets Filter Firewall

    工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件

    硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现
    软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙
    主机防火墙:服务范围为当前主机
    网络防火墙:服务范围为防火墙后的局域网
    

    2 iptables/netfilter

    2.1 netfilter

    防火墙框架 framework 位于内核空间

    2.1 iptables

    命令行工具程序,位于用户空间;规则管理工具

    3 netfilter

    3.1 hooks function

    prerouting
    input
    forward
    output
    postrouting
    

    4 iptables

    4.1 CHAINS:<钩子>

    PREROUTING
    INPUT
    FORWARD
    OUTPUT
    POSTROUTING
    

    5 报文流向

    到本机某进程的报文:PREROUTING --> INPUT

    由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING

    由本机的某进程发出报文:OUTPUT --> POSTROUTING

    6 tables

    6.1 filter

    过滤,防火墙

    6.2 nat

    network address translation,网络地址转换

    6.3 mangle

    拆解报文,做出修改,并重新封装

    6.4 raw

    关闭nat表上启用的连接追踪机制

    6.5 优先级次序(由高而低)

    raw --> mangle --> nat --> filter
    

    6.6 功能<-->钩子

    raw:PREROUTING,OUTPUT
    mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
    nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
    filter:INPUT,FORWARD,OUTPUT
    

    7 iptables规则的组成部分

    7.1 匹配条件

    网络层首部:Source IP, Destination IP
    传输层首部:Source Port, Destination Port
    扩展检查机制:
    

    7.2 处理动作:target

    ACCEPT,DROP,REJECT ...
    

    8 安装:

    8.1 netfilter

    位于内核中的tcp/ip协议栈报文处理框架

    8.2 iptables

    CentOS 5/6:iptables命令编写规则,是netfilter功能的前端表现
        # iptables -t filter -F
        # service iptables save
    
    CentOS 7:firewalld,firewall-cmd, firewall-config
        # systemctl disable firewalld
    

    8.3 程序包:

    iptables, iptstate

    9 iptables命令

    9.1 规则

    根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理

    9.2 匹配条件

    基本匹配条件:源地址,目标地址,传输层协议
    扩展匹配条件:需要借助于扩展模块进行指定的匹配条件
        隐式扩展:已经在基本匹配条件中指明的协议相关的扩展
        显式扩展:隐式扩展之外的其它扩展匹配条件
    

    9.3 处理动作

    基本动作:ACCEPT,DROP,...
    扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作
    

    9.4 添加规则时需要考量的问题

    (1) 报文流经的位置:用于判断将规则添加至哪个链
    (2) 实现的功能:用于判断将规则添加至哪个表
    (3) 报文的方向:用于判断哪个为“源”,哪个为“目标”
    (4) 匹配条件:用于编写能够正确匹配目标报文的规则
    

    10 iptabls命令的使用格式

    10.1 规则管理格式

    iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]
    
         -t table:指明要管理的表;不指定,默认为filter;
    

    11 COMMANDS

    链管理

    -P:iptables [-t table] -P chain target,定义链的默认策略;其target一般可使用ACCEPT或DROP
    
    -N:iptables [-t table] -N chain,自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数
    
    -X:iptables [-t table] -X [chain],删除自定义的空的引用计数为0的链
    
    -F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 
    
    -E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链
    
    -Z:iptables [-t table] -Z  [chain [rulenum]] [options...],清空指定表/规则的计数器的计数
    

    规则

    -A:append, iptables [-t table] -A chain rule-specification,追加规则到指定的链尾部
    
    -I:insert, iptables [-t table] -I chain [rulenum] rule-specification,插入规则到指定的链中的指定位置,默认为链首
    
    -D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum,删除指定的链上的指定规则
    
    -R:replace,iptables [-t table] -R chain rulenum rule-specification,将指定的链上的指定规则替换为新的规则
    

    查看

    -L:list, iptables [-t table] -L [chain [rulenum]] [options...]
        -n:数字格式
        -v:verbose,详细格式信息
        -vv, -vvv
        --line-numbers:显示链上的规则的编号
        -x:exactly,显示计数器的精确值
    
    -S:--list-rules [chain]
        Print all rules in the selected chain.
        直接查看定义的iptables命令语句
    

    计数器

    每条规则以及链的默认策略分别有各自的两个计数器

    (1) 匹配到的报文的个数:pkts
    (2) 匹配到的所有报文的大小之积:bytes
    

    匹配条件

    基本匹配条件
    扩展匹配条件
        隐式扩展
        显式扩展
    

    注意:多重条件之间的隐含逻辑为“与”操作

    基本匹配条件:

    [!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围
    
    [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围
    
    [!] -p, --protocol protocol:检查报文中传输层的协议类型,支持tcp, udp,  udplite, icmp,  icmpv6,esp,  ah, sctp, mh,或者 "all"
    
    [!] -i, --in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD  and  PREROUTING
    
    [!] -o, --out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING
    
    -m, --match match:显式指明要使用的扩展模块
    
    -j, --jump target:跳转目标
    

    扩展匹配条件:

    隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展

    -p tcp:可直接使用tcp协议对应的扩展选项
        [!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口
        [!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口
        [!] --tcp-flags mask comp
            SYN,ACK,FIN,RST,URG,PSH
            mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST
            comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0
                --tcp-flags SYN,ACK,FIN,RST SYN
        [!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN
    
    iptables -A INPUT -s 10.1.0.0/16 -d 10.1.43.1 -p tcp -dport 21:23 -j ACCEPT
    iptables -A OUTPUT -s 10.1.43.1 -d 10.1.0.0/16 -p tcp -sport 21:23 -j ACCEPT
    iptables -A INPUT -s 10.1.0.0/16 -d 10.1.43.1 -p tcp -dport 80 --syn -j ACCEPT
    iptables -A OUTPUT -s 10.1.43.1 -d 10.1.0.0/16 -p tcp -sport 80 -j ACCEPT
    
    -p udp:可直接使用udp协议对应的扩展选项;
        [!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口
        [!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口
    
    -p icmp:可直接使用icmp协议对应的扩展选项;
        [!] --icmp-type {type[/code]|typename}
            --icmp-type 0/0:匹配对ping请求的响应报文
            --icmp-type 8/0:匹配ping请求报文
    
    iptables -A INPUT -s 10.1.0.0/16 -d 10.1.43.1 -p icmp --icmp-type 8 -j ACCEPT
    

    显式扩展

    必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项

    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 -A INPUT -s 10.1.0.0/16 -d 10.1.43.1 -p tcp -m multiport --dports 21:23,80 -j ACCEPT
    iptables -A ONUTPUT -s 10.1.43.1 -d 1-0.1.0.0/16 -p tcp -m multiport --sports 21:23,80 -j ACCEPT
    

    2、iprange

    以连续的ip地址范围指明多地址匹配条件

    [!] --src-range from[-to] :源IP
    [!] --dst-range from[-to] :目的IP
    
    iptables -A INPUT -m iprange --src-range 10.1.143.0-10.1.143.100 -d 10.1.43.1 -p tcp 80 -j ACCEPT
    iptables -A OUTPUT -s 10.1.43.1 -m iprange --dst-range 10.1.143.0-10.1.143.100 -p tcp 80 -j ACCEPT
    

    3、string

    对报文中的应用层数据做字符串匹配检测

    [!] --string pattern
    [!] --hex-string pattern
    --algo {bm|kmp}:字符串匹配检查算法;
    --from offset
    --to offset
    
    iptables -A OUTPUT -p tcp --sport 80 -m string --string "sex" -j DROP
    

    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...]
    
    iptables -A INPUT -d 10.1.43.1 -p tcp -dport 23 -m time --timestart 08:00:01 --timestop 18:00:01 --weekdays 1,2,3,4,5 -j ACCEPT
    

    5、connlimit

    根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求

    --connlimit-upto n:连接数小于等于阈值;<CentOS 6无此选项>
    --connlimit-above n:连接数超出阈值;
    
    iptables -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
    
    iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT
    

    7、state

    状态检测:连接追踪机制(conntrack)

    NEW:新连接
    ESTABLISHED:已建立的连接
    RELATED:相关联的连接
    INVALID:无法识别的连接
    UNTRACKED:未被追踪连接
    
    • 相关的内核模块:
    nf_conntrack
    nf_conntrack_ipv4
    nf_conntrack_ftp
    追踪到的连接:/proc/net/nf_conntrack文件中
    能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
        建议调整至足够大
    不同的协议的连接追踪时长
        /proc/sys/net/netfilter/
    
    [!] --state state
    

    如何开放被动模式的ftp服务

    (1) 装载追踪ftp协议的模块;
    
    # modprobe nf_conntrack_ftp
    
    (2) 放行入站命令连接
    
    # 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
    

    处理动作(跳转目标)

    -j tagetname [per-target-options]
        简单target:
            ACCEPT,DROP
        扩展target:
            REJECT:
                --reject-with type
                    icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默认为icmp-port-unreachable;
            LOG:
                Turn on kernel logging of matching packets.
                --log-level level:日记级别
                --log-prefix prefix:日志信息的前导信息
    

    12 保存和载入规则

    保存:iptables-save > /PATH/TO/SOME_RULE_FILE

    重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE

    -n, --noflush:不清除原有规则
    -t, --test:仅分析生成规则集,但不予提交
    
    注意:重载文件中的规则,会清除已有规则
    

    12.1 CentOS 6

    保存规则:service  iptables  save
        保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;
    
    重载规则:server iptables restart
        默认重载/etc/sysconfig/iptables文件中的规则
    
    脚本配置文件:/etc/sysconfig/iptables-config
        用于指明要装载的模块
    

    12.2 CentOS 7开机自动生效规则

    (1) firewalld服务;
    (2) shell脚本,直接记录iptables命令
    (3) 自定义unit file或init script
    

    13 规则优化的思路

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

    14 iptables/netfilter网络防火墙

    • 添加规则于FORWARD链,注意几个问题:
    (1) 请求和响应报文均会经由FORWARD链,要注意规则的方向性;
    
    第一条:iptables -I FORWARD  -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    (2) 如果可以启用conntrack机制,注意网关主机所能够追踪的连接数的最大数量要符合需要
    
    iptables -I FORWARD -s 192.168.22.0/24 -p tcp --dport 80 -j ACCEPT
    iptables -I FORWARD 2 -d 192.168.22.0/24 -p tcp -sport 80 -j ACCEPT
    iptables -I FORWARD -m state --state ESTABLISHED,RELATES -j ACCEPT
    iptables -I FORWARD 3 -s 192.168.22.0/24 -p udp -m multiport --dport 137,138 -m state --state NEW -j ACCEPT
    

    15 NAT

    源地址转换:SNAT,POSTROUTING
        静态转换
        动态转换
    
    目标地址转换:DNAT,PREROUTING
    
    PAT:Port Address Translation
    

    15.1 target:<以下都是target>

    SNAT:

    This  target  is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
    
    --to-source [ipaddr[-ipaddr]]
    
    iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -j SNAT --to-source 10.1.43.1
    

    MASQUERADE:

    This target is only valid in the nat table, in the POSTROUTING chain.  It  should  only  be  used  with  dynamically assigned  IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
    
    动态地址转换
    

    DNAT:

    This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains  which  are only  called from those chains.
    
    --to-destination [ipaddr[-ipaddr]][:port[-port]]
    
    iptables -t nat -A PREROUTING -d 10.1.43.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.22.2
    iptables -t nat -A PREROUTING -d 10.1.43.1 -p tcp --dport 22 -j DNAT --to-destination 192.168.22.2
    iptables -t nat -A PREROUTING -d 10.1.43.1 -p tcp --dport 22022 -j DNAT --to-destination 192.168.22.2:22
    

    REDIRECT:

    This  target  is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
    
    --to-ports port[-port]
    
    iptables -t nat -A PERROUTING -d 192.168.22.2 -p tcp 80 -j REDIRECT --to-ports 8080
    

    RETURN:返回

    注意:NAT可以和filter功能结合使用,来实现对地址的转换,以及对特定用户的某些行为进行拒绝

    16 自定义链:

    iptables -N CHIAR-NAME
    
    iptables -A CHIAR-NAME ..... <语法同INPUT表>
    

    16.1 引用自定义链:

    iptables -I FORWARD -d 192.1.68.22.0/24 -p tcp --dport 80 -j CHIAR-NAME
    

    后记

    基于状态放行telnet, ftp, ssh, http, samba, icmp等服务

    (1) 对本机的ping请求每分钟不得超出20个
    (2) 每客户端对本机的ssh的并发连接数不得超过3个
    (3) 本机的telnet服务仅允许工作时间内访问
    
    [root@node1 ~]# vim iptables.sh
    iptables -A INPUT -d 10.1.41.5 -p tcp -m state --state ESTABLISHED -j ACCEPT
    iptables -A INPUT -d 10.1.41.5 -p udp -m state --state ESTABLISHED -j ACCEPT
    iptables -A INPUT -d 10.1.41.5 -p tcp -m multiport --dports 21:23,80,139,445 -m state --state NEW -j ACCEPT
    iptables -A INPUT -d 10.1.41.5 -p tcp -m state --state RELATED -j ACCEPT
    iptables -A INPUT -d 10.1.41.5 -p udp --dport 137:138 -j ACCEPT
    iptables -A INPUT -d 10.1.41.5 -j DROP
        
    iptables -A OUTPUT -d 10.1.41.5 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -d 10.1.41.5 -j DROP
        
    iptables -I INPUT 3 -d 10.1.41.5 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
    iptables -I INPUT 3 -d 10.1.41.5 -p icmp -m limit --limit 20/minute -j ACCEPT
    iptables -I INPUT 4 -d 10.1.41.5 -p tcp --dport 23 -m time --timestart 08:00:01 --timestop 18:00:01    #此处未完结
    --weekday 1,2,3,4,5 -j ACCEPT
    [root@node1 ~]# iptables -F
    [root@node1 ~]# bash iptables.sh
    [root@node1 ~]# iptables-save /etc/sysconfig/iptables
    
  • 相关阅读:
    jeecms 强大的采集功能优化 转载 https://blog.csdn.net/jeff06143132/article/details/7099003
    JEECMS自定义标签开发步骤
    jeecms之全文检索
    jeecms怎么修改后台访问路径?
    jeecms 基本架构研究
    Java JNI初探
    《高效程序员的45个习惯》
    Java并发编程:Thread类的使用
    Thread详解
    JAVA多线程实现的四种方式
  • 原文地址:https://www.cnblogs.com/evescn/p/12194323.html
Copyright © 2011-2022 走看看