iptables

iptables


一、基础概念

1、防火墙概念

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

如果没有防火墙,你的本机的所有端口都会被别人访问到!

2、分类

  • 硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现;
    5
  • 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;

  • 主机防火墙:服务范围为当前主机;
  • 网络防火墙:服务范围为防火墙被的局域网;

3、防火墙的两个层面 — iptables/netfilter:

netfilter:防火墙框架,framework;位于内核空间;

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

  • netfilter:防火墙框架

      hooks function
          prerouting 路由之前
          input     入栈
          forward 转发
          output 出栈
          postrouting     路由之后
    
  • iptables:为了驱动内核防火墙框架创造5条链

      CHAINS:链
          PREROUTING
          INPUT
          FORWARD
          OUTPUT
          POSTROUTING
    

4、Linux下防火墙如何实现?

1、iptables,这个只是方便用户编写各类规则交由netfilter处理执行。

2、一部分是基于TCP/IP协议栈的netfilter安全框架,通过“数据报文进入主机,内核处理完成,交由用户空间处理,在由内核处理完成并响应给客户”, 数据报文的处理路径设置了各种规则链,根据规则链的顺序或者特点, 又在规则链中增加功能表,通过在不同的功能表中设置具体的规则,来达到安全访问。

那么netfilter的规则定义是如何来达到安全访问的效果呢?

首先我们应该知道主机之间的通信是数据流,是参考OSI七层模型来包装用户的数据,OSI七层包括了应用层,表示层,会话层,传输层,网络层,数据链路层,物理层,每一层都有其自己的功能,netfilter就是通过识别每一层功能中的数据是否符合我们定义的规则,从而达到监控,修改,丢弃,转发的目录。        

5、报文流向:

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

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

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

6、tables:

  • filter:过滤,防火墙;
  • nat:network address translation,网络地址转换;
  • mangle:拆解报文,做出修改,并重新封装;盖戳
  • raw:关闭nat表上启用的连接追踪机制;

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

raw –> mangle –> nat –> filter

iptables

功能<–>钩子:

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

iptables

7、iptables规则的组成部分:

匹配条件:

  • 网络层首部:Source IP, Destination IP

  • 传输层首部:Source Port, Destination Port

  • 扩展检查机制:拓展了可以检查应用层首部,需要指明使用了那些扩展

处理动作:target

  • ACCEPT:允许
  • DROP :丢弃
  • REJECT:拒绝后并回应

二、安装:

1、内核要确保安装netfilter这个协议框架

netfilter:位于内核中的tcp/ip协议栈报文处理框架;对于任何发行版来说这都是必备的功能

2、iptables 工具:
iptables并不是一个服务,它只是内核中的一个功能而已,只要内核在,这个功能就在。我们并不需要启动!虽然我们在centos 6上会用到service但只是用它来加载配置文件的!

CentOS 5/6:iptables命令编写规则;

    # iptables -t filter -F
    # service iptables save

CentOS 7:firewalld,firewall-cmd, firewall-config

    # systemctl disable firewalld

注意:firewalld 我们并不建议使用,因为这只是在redhat这一个分支上使用并不能通用!
由于这个应用,centos7就没有unit file文件,这需要我们自己加载配置的防火墙规则!

程序包:iptables, iptstate

三、iptables命令:

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

匹配条件

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

处理动作:

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

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

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

四、iptabls命令的使用格式:

    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 [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]

    -t table:指明要管理的表; 默认为filter;

iptables

iptables [-t table] COMMANDS:

链管理:

  • -P chain target
    定义链的默认策略;其target一般可使用ACCEPT或DROP;

  • -N chain
    自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;

  • -X [chain]
    删除自定义的空的引用计数为0的链;如果后边不加名的话就会删除所有符合的自定义链

  • -F [chain [rulenum]] [options…]
    清空指定的链,或删除指定链上的规则,不指名就会删除所在表上的所有链

  • -E old-chain-name new-chain-name
    重命名自定义的引用计数为0的链;

  • -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,
    将指定的链上的指定规则替换为新的规则;

查看:-vnL

-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
    -n:数字格式;
    -v:verbose,详细格式信息;
    -vv, -vvv 
    --line-numbers:显示链上的规则的编号;
    -x:exactly,显示计数器的精确值; 

计数器:

    每条规则以及链的默认策略分别有各自的两个计数器:
    (1) 匹配到的报文的个数:pkts
    (2) 匹配到的所有报文的大小之积:bytes

总结

iptables/netfilter

四表:raw, mangle, nat, filter
五链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

iptables命令:

iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]
    COMMANDS:
        链管理:-P,-N,-X,-E,-F,-Z
        规则管理:-A,-I,-D,-R
        查看:-L,-n, -x, -v, --line-numbers

iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]

匹配条件

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

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

1.基本匹配条件:

  • [!] -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:跳转目标;

我们设置防火墙规则时 一般都是要把入栈进程阻断!不过最好INPUT OUTPUT都要阻断最好

练习1.设置防火墙规则为默认禁止所有人访问,只允许自10.1.250.28主机进行访问
iptables
练习2、在上提基础上加上允许10.1.0.0/16网络上的主机都能访问但10.1.249.175不能访问
iptables
练习3、删除练习1的记录条目两种方法
iptables

iptables
练习4、仅允许10.1.0.0/16网段对本机(10.1.6.72)tcp开放
iptables

2.扩展匹配条件:

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

  • -p tcp:可直接使用tcp协议对应的扩展选项;
    [!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;

    [!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;

    [!] --tcp-flags mask(所有标志位) comp(标志位为1)
        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 
        表示匹配 tcp标志位中的SYN,ACK,FIN,RST,且其中只有SYN为1其他为0的位
        TCP握手的第一次,初次连接
  • -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请求报文

例1.:仅开放本机(10.1.6.72)tcp 22号端口给本网段
iptables

iptables

例2、在1的基础上允许别人ping本地主机
iptables

例3、在此基础上允许自己ping其他主机
iptables

(2)显式扩展:必须使用-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]...‘:’匹配此处指定的源或目标端口;

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

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

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

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

    [!] --string pattern
    [!] --hex-string pattern
        --algo {bm|kmp}:字符串匹配检查算法;
        --from offset  不检查from之前的字符
        --to offset        到达的to字符之后的字符

    iptables -I OUTPUT -s 10.1.0.6 -p tcp --sport 80 -m string --string "haha" --algo bm -j REJECT
        表示定义到达本机(10.1.0.6)上的tcp 80端口用 bm算法匹配到含有字符为 “haha” 的就拒绝并回    

:服务端对 “haha“字符做了限制
iptables

iptables

客户端也可以对请求的网页做限制
iptables

iptables

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 -I INPUT -d 10.1.6.72 -p tcp –dport 23 -m time –timestart 16:00:00 –timestop 09:00:00 ! –weekdays Sat,Sun -j REJECT
iptables

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

    --connlimit-upto n:连接数小于等于阈值;
    --connlimit-above n:连接数超出阈值;

~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
        单个ip的请求的连接请求大于 2个就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

iptables
设置令牌桶为3 每分钟20个

7、state *重要

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

相当于在连接前建立了一个表,每次连接前都要与这个表中的ip匹配,这张表中的内容会有默认的保存时间! 不要随意打开这个连接追踪器,因为如果访问并发数非常大的话就会导致某些请求相应不了!

    NEW:新连接

    ESTABLISHED:已建立的连接,
        NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态

    RELATED:相关联的连接
        如ftp协议的命令连接与数据连接之间的关系;
            modprobe nf_conntrack_ftp   要先打开这个
    INVALID:无法识别的连接

    UNTRACKED:未被追踪连接;

    [!] --state state

相关的内核模块:
    nf_conntrack
    nf_conntrack_ipv4
    nf_conntrack_ftp
  • 已经追踪到并记录下的连接:

      /proc/net/nf_conntrack
    
  • 能追踪的最大连接数量定义在:

      /proc/sys/net/nf_conntrack_max
          建议调整至足够大;和内存空间有关系
    
  • 不同的协议的连接追踪时长:

      /proc/sys/net/netfilter/
    
          [!] --state state
    

iptables

iptables

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

(1) 装载追踪ftp协议的模块;
    # modprobe nf_conntrack_ftp

    这个模块是Netfilter专门用来处理FTP这个复杂协议的模块,它能够将FTP的数据包标识为RELATED状态,从而允许使用被动模式访问。
    使用命令: modprobe   nf_conntrack_ftp   加载该模块,之后客户端就能以被动模式连接至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

1.处理动作(跳转目标):

-j tagetname [per-target-options]
  • 简单target:
    ACCEPT,DROP

  • 扩展target:
    REJECT:

–reject-with type
默认为icmp-port-unreachable;

        icmp-net-unreachable, 网络不可达 
        icmp-host-unreachable,  主机不可达
        icmp-port-unreachable,     端口不可达
        icmp-proto-unreach‐able, 协议不可达
         icmp-net-prohibited,  网络被禁止    
        icmp-host-prohibited,     主机被禁止
        icmp-admin-prohibited,    管理禁止
        *  表示所有

LOG: 要在拒绝之前使用

        Turn  on  kernel  logging of matching packets.

        --log-level level
        --log-prefix prefix:日志信息的前导信息;
        -j LOG --log-prefix prefix "内容表示 日志信息的前缀"

规则优化的思路:

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

保存和载入规则:

    保存: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
            用于指明要装载的模块;
        IPTABLES_MODULES="nf_conntrack_ftp"就会把依赖的模块装载,先要touch 一个/etc/sysconfig/iptables 就能装载此文件了

    CentOS 7开机自动生效规则:

        (1) firewalld服务;
        (2) shell脚本,直接记录iptables命令;
        (3) 自定义unit file或init script;
    自动生效规则文件中的规则:
        把iptables命令放在脚本文件中,让脚本文件开机自动运行
                /etc/rc.d/rc.local
                iptables-restore < /PATH/TO/SOME_RULE_FILE 
                或者此文件内写上脚本的路径 /usr/bin/iptables.sh

练习:

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

  • (1) 对本机的ping请求每分钟不得超出20个;
  • (2) 每客户端对本机的ssh的并发连接数不得超过3个;
  • (3) 本机的telnet服务仅允许工作时间内访问;
iptables -I INPUT -d 10.1.6.72 -p icmp --icmp-type 8 -m limit --limit-burst 1 --limit 20/minute    
    设置对本机的ping请求不超过20/min

~]# iptables -I INPUT -d 10.1.6.72 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT    
    设置22端口 ssh的连接数不能大于3个

iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --weekdays Sat,Sun --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
    设置周六周天拒绝telnet服务

iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --timestart 10:00:00 --timestop 00:00:00 --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
    设置非工作时间禁止使用telnet

iptables -A INPUT -d 10.1.6.72 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    设置允许RELATED ESTABLISHED

 ~]# iptables -A INPUT -d 10.1.6.72 -p tcp -m multiport --dport 21:23,80,139,445 -m state --state NEW -j ACCEPT
     设置对21:22:80:139:445第一次请求不限制
iptables -A INPUT -d 10.1.6.72 -p udp -m multiport --dport 138,139 -m state --state NEW -j ACCEPT
    设置对138,139号udp端口的第一次相应不限制

iptables -A INPUT -d 10.1.6.72/32 -j REJECT
    禁止其他对端口的访问


iptables -A OUTPUT -s 10.1.6.72 -p udp -m state --state ESTABLISHED -j ACCEPT

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

iptables -I OUTPUT -s 10.1.6.72 -p icmp -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 10.1.6.72/32 -j REJECT            

原创文章,作者:qzx,如若转载,请注明出处:http://www.178linux.com/54715

(0)
qzxqzx
上一篇 2016-10-26
下一篇 2016-10-26

相关推荐

  • Linux之bash shell脚本编程入门篇(一)

    什么是bash shell脚本编程? 答:Linux里面有多种shell,而CentOS和redhat的默认shell是bash shell。至于shell脚本,这个跟windows操作系统里面的批处理文件有点像(.bat的文件)。不知道大家还是否记得Linux的哲学思想吗?其中有那么两点点:由众多目的的单一应用程序组成:一个程序只做一件事,且做好;组合目的…

    Linux干货 2016-08-15
  • rsyslog学习

    一、rsyslog日志服务简介 二、rsyslog的配置详解 三、实现日志服务器收集日志及last、lastb、dmseg命令的使用 四、实现日志存储在mysql中 一、rsyslog日志服务简介 日志的概念好理解,日志作用可用于排障和追溯审计的等 1、rsyslog是一个C/S架构的服务,可监听于某套接字,帮其它主机记录日志信息,在linux系统中可以分类…

    Linux干货 2016-10-24
  • Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

    Nginx基础 前言 apache在设计的时候已经考虑了并发访问模型,select()机制可以响应1024个访问,但是当数量再大,千万级别的时候http就响应不过来了。这个时候,nginx的出现解决了这一个问题。nginx是一个安装简单、配置文件简单、占用内存少、稳定性高、处理并发能力非常强、灵活好用等有点聚集于一身的轻量级服务器。在Linux操作系统中,N…

    Linux干货 2016-12-24
  • 推荐-运维学习笔记-Puppet应用配置的工作原理

    背景知识 Puppet的核心功能是配置管理。一般来说,用户在master上集中做配置,同时,被管理节点上的agent会定期从master上下载配置数据,再应用(apply)到本地,从而使管理节点的状态(用户,组,文件,安装包,服务等的设置和运行状态)与masters上定义的保持一致。 有时,出于测试的目的,并不希望真的应用配置,那么就需要执行puppet a…

    2016-06-01
  • find命令简单总结

     find     字符串类查询:            -type   //根据文件类型查找       &…

    Linux干货 2015-09-14