iptables

 

iptables(1)

Firewall:隔离工具;Packets Filter Firewall;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)
进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件;
    硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现; 
    软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;

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

iptables/netfilter:
    netfilter:防火墙框架,framework;位于内核空间;
    iptables:命令行工具程序,位于用户空间;规则管理工具;

    netfilter:
        hooks function
            prerouting
            input 
            forward 
            output 
            postrouting

    iptables:
        CHAINS:
            PREROUTING
            INPUT
            FORWARD
            OUTPUT
            POSTROUTING

        报文流向:
            到本机某进程的报文:PREROUTING --> INPUT 
            由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
            由本机的某进程发出报文:OUTPUT --> POSTROUTING

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

        优先级次序(由高而低):
            raw --> mangle --> nat --> filter 

        功能<-->钩子:
            raw:PREROUTING,OUTPUT
            mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
            nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
            filter:INPUT,FORWARD,OUTPUT

    iptables规则的组成部分:
        匹配条件:
            网络层首部:Source IP, Destination IP
            传输层首部:Source Port, Destination Port
            扩展检查机制:
        处理动作:target
            ACCEPT,DROP,REJECT

安装:
    netfilter:位于内核中的tcp/ip协议栈报文处理框架;
    iptables:
        CentOS 5/6:iptables命令编写规则;
            # iptables -t filter -F
            # service iptables save
        CentOS 7:firewalld,firewall-cmd, firewall-config
            # systemctl disable firewalld

        程序包:iptables, iptstate

    iptables命令:

        规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
            匹配条件:
                基本匹配条件:源地址,目标地址,传输层协议
                扩展匹配条件:需要借助于扩展模块进行指定的匹配条件
                    隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;
                    显式扩展:隐式扩展之外的其它扩展匹配条件;
            处理动作:
                基本动作:ACCEPT,DROP,...
                扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作;

        添加规则时需要考量的问题:
            (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;

    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,显示计数器的精确值; 

        计数器:
            每条规则以及链的默认策略分别有各自的两个计数器:
                (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(2)

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

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

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

        基本匹配条件:
            [!] -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 

                -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请求报文

            显式扩展:必须使用-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
                    --to offset

                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...]

                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

                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:日志信息的前导信息;


保存和载入规则:
    保存: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;

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

练习:基于状态放行telnet, ftp, ssh, http, samba, icmp等服务;
    (1) 对本机的ping请求每分钟不得超出20个;
    (2) 每客户端对本机的ssh的并发连接数不得超过3个;
    (3) 本机的telnet服务仅允许工作时间内访问;

iptables总结

Linux的网络功能由内核提供,所以大部分网络功能都是在内核中实现的。主机上的所有ip都属于内核。

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

iptables介绍

iptables也是模块化的结构软件。 依赖关系: netfilter是内核的功能。位于内核中的tcp/ip协议栈报文处理框架。默认内核都有的。

iptables:管理规则表,并提交给内核。已关机就没有了。 规则是放到内存中的,不是永久有效。

写成脚本(包含iptables命令的脚本),或文件(由iptables在开机时自动调用的文件)

iptables不需要服务,只需要开机可以读取规则文件即可。不需要作为守护进程在内存中。 centos6中要通常要使用service启动或重启…但是也不是以服务运行

centos6中清空规则 iptables -F

centos7:为iptables提供了一个前端工具。使用firewalld服务(也不是服务,不是守护进程) firewalld为系统提供了众多的规则。清空规则如下,iptables在7中没有启动service

centos7上先 systemctl stop firewalld,再systemctl disable firewalld(会清空默认规则)

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

防火墙

按实现机制

    硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现; (部分功能基于单独硬件,实现报文处理,由软件综合管理)

    软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;
        全部由软件实现。

按服务范围区分

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

iptables有四张表

filter:访问控制,规则匹配
nat:地址转发
mangle:修改数据包,改变包头中的内容(TTL,MARK等)
raw:数据报状态跟踪,分析

5链

iptables 调用内核 Netfilter 进行 IP 访问控制设置,而 Netfilter 在网络层有 5 个钩子:

PRE_ROUTING
INPUT
OUTPUT
FORWARD
POST_ROUTING

对应了 iptables 的 5 条链: PREROUTING INPUT OUTPUT FORWARD POSTROUTING

4张表和链的关系

          filter:
              This  is  the  default table (if no -t option is passed). It contains the built-in chains INPUT (for packets destined to local sockets), FORWARD
              (for packets being routed through the box), and OUTPUT (for locally-generated packets).

          nat:
              This table is consulted when a packet that creates a new connection is encountered.  It consists of three built-ins:  PREROUTING  (for  altering
              packets  as soon as they come in), OUTPUT (for altering locally-generated packets before routing), and POSTROUTING (for altering packets as they
              are about to go out).  IPv6 NAT support is available since kernel 3.7.

          mangle:
              This table is used for specialized packet alteration.  Until kernel 2.4.17 it had two built-in chains: PREROUTING (for altering incoming packets
              before  routing)  and OUTPUT (for altering locally-generated packets before routing).  Since kernel 2.4.18, three other built-in chains are also
              supported: INPUT (for packets coming into the box itself), FORWARD (for altering packets being routed through the  box),  and  POSTROUTING  (for
              altering packets as they are about to go out).

          raw:
              This  table is used mainly for configuring exemptions from connection tracking in combination with the NOTRACK target.  It registers at the net‐
              filter hooks with higher priority and is thus called before ip_conntrack, or any other IP tables.  It provides the  following  built-in  chains:
              PREROUTING (for packets arriving via any network interface) OUTPUT (for packets generated by local processes)


          security:
              This table is used for Mandatory Access Control (MAC) networking rules, such as those enabled by the SECMARK and CONNSECMARK targets.  Mandatory
              Access Control is implemented by Linux Security Modules such as SELinux.  The security table is called after the filter table, allowing any Dis‐
              cretionary  Access  Control (DAC) rules in the filter table to take effect before MAC rules.  This table provides the following built-in chains:
              INPUT (for packets coming into the box itself), OUTPUT (for altering locally-generated packets before routing), and FORWARD (for altering  pack‐
              ets being routed through the box).
        ###被linux内核的安全模块调用

应用比较广泛的主要是filter和nat

filter 对应的chians是 INPUT、OUTPUT、FORWARD 可以实现过滤所有流量,出入本机的流量,经本机转发的流量。

nat 对应的chians是 PREROUTING、POSTROUTING、OUTPUT OUTPUT:for altering locally-generated packets before routing 路由前变更本地产生的数据包

可以实现nat功能
nat功能都是在出接口上配置。物理网卡上至少两个网卡,连接内网外网。
nat都是在连接外网的网卡接口上做配置

nat地址转换类型

对内网段主机实现nat 内网网段的其他主机的数据包 进入本机后查找路由表,在查找转发表,实现转发 在FORWARD上转发给出接口,在出接口上重新封装报文的ip报头实现nat转换。

源地址转换
    规则应用在路由之后,应用在POSTROUTING链上

目标地址转换
    规则应用在路由之前,应用在PREROUTING链上

对本机访问外网实现nat

本机数据包的地址转换。(本机不直接暴露于外网接口上。本机的通信全部nat出去)
标准目的地址NAT(DNAT)
    iptables -t nat -A OUTPUT -o <outgoing interface> ... -j DNAT --to-destination <address>[-<address>][:port-port]
    目的地址用来替换数据包中的原始目的地址,多为本地服务器地址

报文处理流程:

iso7层

物理层 数据链路层 网络层 传输层 会话层 表示层 应用层

linux主机要能够转发本地网络数据报文,需要开启内核的核心转发功能。

本地网络主机发送的报文到本机的处理流程

路由决策时使用钩子,PREROUTING,POSTROUTING

报文转发时使用的钩子是 FORWARD

凡是发送给本机(目的地址是本机)或本机发出(源地址是本机)的报文使用的钩子,INPUT,OUTPUT

钩子运作关键节点

进入网卡的数据--PREROUTING--路由决策--POSTROUTING--INPUT--本机得到数据报文

本机发往本地网络的ip报文---OUTPUT--PREROUTING--路由决策--POSTROUTING--本地网卡流出

ip报文进入本地网卡的数据--PREROUTING--路由决策--POSTROUTING--FORWARD--PREROUTING--路由决策--POSTROUTING--经本地外网网卡发出

表与钩子的关系

filter:过滤,一般用来实现防火墙功能,过滤不必要的数据,仅放行指定的数据通过

实现filter功能,主机与外部网络通信,filter需要使用的钩子为INPUT和OUTPUT即可,
               主机转发不同网络之间的数据流量,使用的钩子为FORWARD

NAT:实现地址转换

    都是在出接口上实现。数据进出出接口时做NAT

    本地网络的NAT    
        数据出出接口时,一般使用源地址转换,实现隐藏本地网络使用公网地址上网。本地数据经过路由决策使用被发往出接口,DNAT此时使用链为POSTROTING,对路由后的数据进行重新封包。更改源地址。
        数据包进入出接口,要访问内网时。数据应先做SNAT,改变目的地,才能进入路由表访问本地网络,使用PREROUTING.


    仅本机实现NAT,不影响本地网络的路由转发
    就要在本机的出接口上做配置。,本机数据流量的节点使用的链是INPUT和OUTPUT
        本机的IP地址都是属于内核的。故本机的INPIT和OUTPUT链就是出接口。仅本机NAT就使用这连个链。

centos7中的表,6中的表可能不太一样

nat [root@localhost ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

filter [root@localhost ~]# iptables  -vnL Chain INPUT (policy ACCEPT 98 packets, 9600 bytes) pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 39 packets, 6360 bytes)
 pkts bytes target     prot opt in     out     source               destination

匹配规则

匹配条件

网络层首部:
    源地址和目的地址

传输层首部:(协议类型)
    源端口和目的端口

扩展检查机制:(需要模块支持,进行指定的匹配地址)
    需要明确指明使用哪个扩展
        隐式扩展:无需明确指明
            已经在基本匹配条件中指明的协议的相关扩展

        显示扩展:明确要指明的扩展

处理动作 ACCEPT,DROP,REJECT 有些处理动作需要扩展模块实现。iptables中的文件纯小字母的模块,扩展动作,但是无需显示指定。仅需指明动作

target--模块都有选项。

iptables实验

iptables命令

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

cretieria 匹配条件 -m 隐式扩展无需此选项,显示扩展必须给出 -j targetname 执行的动作。执行动作也有选项,可以不给。

不使用 -t 指定表 默认使用的是filter

Chain INPUT (policy ACCEPT 98 packets, 9600 bytes)  ##INPUT链匹配到多少个报文,总计大小
 pkts bytes target(执行的动作)     prot opt in     out     source               destination

针对链的的操作参数 和链、动作都使用大写

-P 修改指定链的默认规则 -A 为指定链追加规则,不加规则序号,默认为最后一个 -I 为指定链的插入规则 不加规则序号,默认加为第一个 -D 删除指定的规则,可以使用序号,也可以将规则完整给出。 -L 查看指定链的规则,一般使用 -vnL 不指定显示全部 -v 查看详细信息 -n 不对端口号或ip地址进行解析 -R 替换指定链的规则(修改) -S 显示指定链的规则,以添加时的命令形式显示。不指定显示全部 -X 删除自定义的空的计数器为0的链 -E 重命名自定义的引用计数为0的链 -F 清空指定的链,或删除指定链上的规则 -N 自定义规则链;仅在默认通过某规则进行调用方可生效;因此自定义链有引用计数 -Z 清楚柜子里链上的计数器 对自定义链的操作 -N 创建自定义规则链 -Z 先清空规则链上的引用计数,才能改名 清空自定义链上的引用计数,清空规则才能删除自定义链-X -F -X

链管理 -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]]

cretieria 匹配条件 -m 隐式扩展无需此选项,显示扩展必须给出 -j targetname 执行的动作。执行动作也有选项,可以不给。

匹配条件

网络层首部:
    源地址和目的地址

传输层首部:(协议类型)
    源端口和目的端口

扩展检查机制:(需要模块支持,进行指定的匹配地址)
    需要明确指明使用哪个扩展
        隐式扩展:无需明确指明
            已经在基本匹配条件中指明的协议的相关扩展

        显示扩展:明确要指明的扩展

注意多条件之间必须同时满足,与关系


filter

禁止访问本机的一般都放在INPUT链上做规则

为指定表上的指定链设定默认规则

iptables -t filter -P INPUT DROP 设置filter表的INPUT的默认规则为DROP

[root@localhost ~]# iptables -S INPUT
-P INPUT DROP
-A INPUT -s 192.168.127.1/32 -j ACCEPT  ##要精确定义ip地址必须使用32位掩码
允许192.168.127.1访问本机

允许或拒绝指定ip/网络的主机访问

[root@localhost ~]# iptalbles -A INPUT -s 192.168.127.1/32 -j ACCEPT

查询链

[root@localhost ~]# iptables -t filter -S INPUT 
-P INPUT DROP
-A INPUT -s 192.168.127.0/24 -j ACCEPT
-A INPUT -s 192.168.127.0/24 -j ACCEPT
-A INPUT -s 192.168.127.1/32 -j ACCEPT

iptables -t filter -vnL INPUT 查询表上的指定链的规则

    [root@localhost ~]# iptables -t filter -vnL  INPUT 
    Chain INPUT (policy DROP 244 packets, 20909 bytes)
     pkts bytes target     prot opt in     out     source               destination         
     1170  105K ACCEPT     all  --  *      *       192.168.127.0/24     0.0.0.0/0           
        0     0 ACCEPT     all  --  *      *       192.168.127.0/24     0.0.0.0/0           
      846 82279 ACCEPT     all  --  *      *       192.168.127.1        0.0.0.0/0 

iptables -t filter -vnL --line-numbers 查询指定表上的所有链的序号

    [root@localhost ~]# iptables -vnL --line-numbers 
    Chain INPUT (policy DROP 1 packets, 143 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        9   780 ACCEPT     all  --  *      *       192.168.127.0/24     0.0.0.0/0           
    2      846 82279 ACCEPT     all  --  *      *       192.168.127.1        0.0.0.0/0           

    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         

    Chain OUTPUT (policy ACCEPT 7 packets, 972 bytes)
    num   pkts bytes target     prot opt in     out     source               destination

删除指号的规则

iptables -t filter -D INPUT 1 
iptables -t filter -D INPUT -s 192.168.127.1/32 -j ACCEPT

添为指定表的指定链加规则

iptables -t filter -A INPUT 2 -s 192.168.127.0/24 -j ACCEPT
iptables -t filter -I INPUT 2 -s 192.168.127.0/24 -j ACCEPT

如果不指定规则号-A则添加在该链规则的尾部,-I则添加在该链规则的首部

清空规则链

iptables -t filter -F INPUT

注意:如果不指定链则删除该表的所有链上的规则

修改指定表上的指定链上的规则

[root@localhost ~]# iptables -t filter -R INPUT 2 -s 192.168.127.0/24 -j ACCEPT

匹配条件命令

匹配条件中可以使用!意为取反 可以指定单个匹配条件,也可以指定多个匹配条件,但是只有都满足时才生效

例如:-s 192.168.1.1 -d 192.168.1.3,192.168.1.4 -p tcp|udp|icmp|all

添加匹配源地址的规则

iptables -A INPUT -s 192.168.127.1/32 -j ACCEPT 
!-s 是取反

添加匹配目标地址的规则

iptables -A INPUT -d 192.168.127.0/24 -j ACCEPT !-d是取反,可以使用逗号指定多个离散的ip

匹配协议 常用协议tcp/udp/icmp/all

iptables -A INPUT -d 192.168.127.0/24 -p tcp --j ACCEPT

匹配报文的流入接口

iptables -A INPUT --in-interface 
iptables -A INPUT -i INTERFACENAME -j ACCEPT

[root@localhost ~]# iptables -t filter -A INPUT --in-interface eno33554960 -j ACCEPT

注意:–in-interface 只能应用在 INPUT和PREROUTING链上FORWARD 实际生产环境不建议使用该选项。建议指定ip做规则 一般是用pppoe等拨号上网接口上,控制用户上网

匹配报文的流出接口

iptables -A OUTPUT --out-interface 
iptables -A OUTPUT -o INTERFACE -j ACCEPT

注意:–out-interface 只能应用在OUT和POSTROUTING链上FORWARD 实际生产环境不建议使用该选项。建议指定ip做规则 一般是用pppoe等拨号上网接口上,控制用户上网

使用扩展匹配条件

man iptables-extensions

都可以使用!号取反

-m 显示扩展

    -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 

    -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请求报文
        针对不同类型的报文做限制效果不一样。

显示扩展:
    必须使用-m 扩展名称 扩展选项

    多端口匹配
        multiport:以离散或连续的多端口匹配条件,最多允许一次给出15个端口(参数中15个端口数量)
            -m multiport --sport 18,20,23:80  指定逗号隔开单个端口连续端口使用冒号
                --sport
                --dport
        [root@localhost ~]# iptables -t filter -A INPUT -p TCP -m multiport --sport 22,23,25,80 -j ACCEPT

    多ip指定
        iprange 
        --src-range from[-to]
        --dst-range from[-to]
                192.168.1.1-192.168.1.30

        [root@localhost ~]# iptables -t filter -A OUTPUT -p tcp -m iprange --src-range 192.168.1.1-192.168.1.80 -j ACCEPT

    关键字符匹配
        string
        --string PATTREN
        --hex-string PATTERN
        --algo {bm|kmp} 指定算法

        --from OFFSET
        --to OFFSET
        不指定偏移量就是对整条报文匹配,加上偏移量可减少系统负担。
        iptables -t filter -A INPUT -s 10.1.0.33 -p tcp --sport 80 -m string --string "sex" --algo bm -j ACCEPT
        阻断源地址10.1.0.33 的80 端口发送报文中含有字符sex字符的报文

    匹配时间
        time
        --datestart
        --datestop

        --timestart
        --timestop

        --monthdays 3,5,7 
        --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun

        iptables -I INPUT -d 10.0.1.3 -p tcp --dport 23 -m time --timestart 16:00 --timestop 09:00 --weekdays Sat,Sun-j DROP

连接限制
connlimit
    --connlimit-upto #  连接数小于等于阈值 
        一般使用ACCEPT

    --connlimit-above #  连接数超出阈值
        一般使用DROP

速率匹配
    limit
    --limit RATE[/second/minute/hour/day]
    承诺速率
    --limit-burst #
    峰值

    iptables -A INPUT -d 10.1.0.6 icmp --icmp-type 8 -m limit --limit-burst3 --limit 20/minute -j ACCEPT

状态监测
    state:状态监测,连接追踪机制
    需要内核模块支持 modinfo nf_conntrack
                            nf_conntrack_ftp 追踪ftp连接的                           nf_nat nat的连接追踪模块

        NEW         新连接
        ESTABLISHED 已建立的连接
        RELATED     相关联的连接
        INVALID     无法识别的连接
        UNTRACKED   未被追踪的连接

iptables -A INPUT -m state --state ENSTABLISHED -j ACCEPT   简化规则 ,有状态的连接只需匹配词条规则就可以了。
iptables -A INPUT -d 10.1.0.6 -p tcp -m multiport --dports --22,23,80 -m state --state NEW ESTABLISHED -j ACCEPT 新连接需要配置此规则

iptables -A OUTPUT -m state --state ESTABLISHED RELATED -j ACCEPT  方向关联和ESTABLISHED的连接

追踪ftp协议,需要装载相应模块 modprobe nfconntrackftp

动作

-j --jump TARGET

target:
    ACCEPT
    DROP
    REJECT
    也可以是用户自己定义的链。

总结默认规则都改为ACCEPT这样不会因为不小心清空规则而不能远程登录主机

开启状态监测。对所有的服务端口放行。INPUT方向允许NEW ESTABLISHED RELATED

在OUTPUT方向放行 ESTABLISHED RELATED。防止主机内部主动访问外部连接。

规则保存

保存和载入规则

保存规则
iptables-save
    取出规则,发送到标准输出。使用输出重定向即可。

重载规则
iptables-restore
    载入规则,会将当前表的规则给清空
    -n,--noflush 不清空当前表的规则
    -t,--test 仅生产规则集但是不予提交给内核。不生效

centos6
    保存规则service iptables save
    /etc/sysconfig/iptables,保存操作会清楚文件中原有的内容
    重载规则:service iptables restart 

    脚本配置文件
        /etc/sysconfig/iptables-config
        指明要装在的模块,只需写入即可,会将依赖的模块一起载入
    将该脚本设为开机启动即可。

centos7
    firewalld管理iptables
    可以禁用firewalld然后编写一个iptables的unit file


防火墙

主机防火墙
filter
    input
    output

网络防火墙
    forward 
本机打开核心转发功能。

iptables/netfilter网络防火墙:

添加规则于FORWARD链,注意几个问题:

forward链上的所有规则都不针对本机,源地址目的地址源端口目的端口..

抓包工具 tcpdump -i eth1 -nn icmp  打开核心转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward 发送给本机的报文是不经过forward链的,尽管不是一个网段的地址也可以互相通信,因为本机有该路由。

网络防火墙实验配置

内网客户端,内网服务器,网关服务器,外网主机

分别使用2个虚拟网络,全部使用桥接 vm2,3

主机环境 清空防火墙规则,centos7先关闭firewalld再disable,再iptables -F 配置好主机地址。内网主机和网关主机内网网卡是一个ip地址段 外网主机与网关主机的外网网卡是一个ip地址段 将内网主机的网关指向网关。将外网主机的网关指向网关主机。这样就不需要,内外网主机通信时写路由了。

防火墙配置

默认规则不要修改,设定一个规则拒绝全部,以上规则匹配不上才拒绝
iptables -A FORWARD -state --state RELATED,ESTABLISED -j ACCEPT  ####放行有状态的连接规则
iptables -A FROWARD -s 192.168.1.0/24 -p tcp -m multiport --dport 21,22,23,80,139,445 -m state --state NEW -j ACCEPT ###放行新连接仅允许内网主机连接外网
iptables -A FORWARD -j ACCEPT  ###拒绝所有

在网关主机上加载状态监测,监测ftp 的模块 
modprobe nf_conntrack_ftp
这时内网主机就可以连接外网主机的ftp服务

做好本机的防护,防止内网或外网主机攻击本机。在INPUT和OUTPUT上做好规则 注意追踪连接数设置,以防有大量连接被拒绝 为了防止配置错误连接不上主机可以设置任务计划。每多长时间清一次规则。

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  411 30017 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
   12   710 ACCEPT     tcp  --  *      *       192.168.1.0/24       0.0.0.0/0           multiport dports 21,22,23,80,139,445 state NEW 
  112 11267 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination  

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -s 192.168.1.0/24 -p tcp -m multiport --dports 21,22,23,80,139,445 -m state --state NEW -j ACCEPT 
-A FORWARD -j DROP

NAT网关配置

iptables–NAT功能与FORWARD没有关系(前提没有做防火墙过滤)。 NAT 不管是SNAT还是DNAT都是在出接口上做配置。(出接口就是网关连接外网的网卡接口)

nat

源地址转换
    静态地址转换
    动态地址转(需要有地址池)

    用在PREROUTING链上

    PAT:端口地址转换

SNAT  代理用户访问互联网

仅用于POSTROUTING和OUTPUT链上
--to-source[ipaddr[-ipaddr]][:port[-port]]
使用地址池的方式,主机会以轮询的方式提供访问,也可以随机NAT

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT –to-source 10.1.1.1 将源地址为192.168.1.0/24的地址去往任意地址的报文,转换源地址为10.1.1.1(外网出接口地址)

DNAT 外网用户访问内网用户

仅用于PREROUTING和INPUT

iptables -t nat -A PREROUTING -d 10.0.1.1 -p tcp –dport 80 -j DNAT -to-destination 192.168.1.254:80   ###:80可以不用写,也可以定义成别的端口,但要与内网提供服务的端口一致 将目标地址为10.1.1.1(网关外网接口地址)的tcp 80端口的请求的报文,转换目标地址为10.1.1.1

REDIRECT 本机主机的端口映射

本机的httpd服务端口为8080
客户端主机使用80服务访问本主机的http服务主机自动转换80为8080
    添加在PREROUTING链上
本机访问其他主机上的服务,例如其他主机上的httpd服务使用8080端口。可以将报文的端口改为80后去访问。
    添加在OUTPUT链上。

MASQURADE 地址伪装,源地址转换 主要用于,主机外网地址是动态的,不方便定义规则,MASQURADE指定网卡,会自动将内网地址转换为外网网卡地址。指定用在POSTROUTING链上 无需指定要转换为什么地址,静态地址不建议使用MASQURADE

自定链

自定义链,就上将某个功能,服务,分类。但是还需要默认链的引用才能生效。

例如用户上网管理,有可以nat上网的,有的可以上网,但是不能访问某个服务的。将这个功能放到一个自定义链上。

注意:自定义链是建在表内的。常用的表为fliter和nat

创建自定义链 iptables -N web-in iptables -A web-in …  ##定义链上的规则,可以定义很多关于web访问控制的规则。

调用 需要默认链引用。引用方式 -j web-in 注意:自定义链是要被默认链引用。故规则应用在哪个链上,效果还是不要一样的。引用时需注意。 如果匹配不上,回到引用自定义链的位置往下匹配。直到匹配或指定默认规则。

也可以指定匹配不上跳回  iptables -A web-in -j RETURN  ##默认会自动跳回,但还是加上RETURN 这个规则

也可以给自定义链设定一个匹配所有的默认规则。放在最下面。


(1) 请求和响应报文均会经由FORWARD链,要注意规则的方向性;
            第一条:iptables -I FORWARD  -m state --state ESTABLISHED,RELATED -j ACCEPT
(2) 如果可以启用conntrack机制,注意网关主机所能够追踪的连接数的最大数量要符合需要

NAT:
    源地址转换:SNAT,POSTROUTING
        静态转换:
        动态转换:
    目标地址转换:DNAT,PREROUTING

PAT:Port Address Translation 

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]]

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]]

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]

RETURN:返回

自定义链:

练习:INPUT和OUTPUT默认策略为DROP;

    1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
    2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
    3、开放本机的ssh服务给172.16.x.1-172.18.x.100中的主机,x为你的学号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
    4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
    5、允许本机ping别的主机;但不开放别的主机ping本机;

练习:判断下述规则的意义:

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

    # iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
    # iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
    # iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
    # iptables -A clean_in -d 172.16.100.7 -j RETURN 


    # iptables -A INPUT -d 172.16.100.7 -j clean_in

    # iptables -A INPUT  -i lo -j ACCEPT
    # iptables -A OUTPUT -o lo -j ACCEPT


    # iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
    # iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
    # iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP
    # iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP

    # iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT

补充:利用iptables的recent模块来抵御DOS攻击: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP

ssh: 远程连接,

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP


iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;

2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。

下面对最后两句做一个说明:

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用

3.iptables的记录:/proc/net/xt_recent/SSH


也可以使用下面的这句记录日志:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"

CentOS 6:

    http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/

    layer7:第三方扩展;

    iptables实现七层访问过滤:

        模块:layer7
            识别应用层协议

        iptables/netfilter
            iptables -m state, 
            netfilter state

        对内核中的netfilter,打补丁layer7,重新编译内核
        对iptables打补丁,补上layer7模块,重新iptables

diff/patch:文本操作工具

        diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的核心工具之一。其用法非常简单:
          # diff <变动前的文件> <变动后的文件>

        由于历史原因,diff有三种格式:
          * 正常格式(normal diff)
          * 上下文格式(context diff)
          * 合并格式(unified diff)

        1、正常格式的diff
            例如,对file1(变动前的文件)和file2(变动后的文件)进行比较可使用如下命令:
            # diff file1 file2
            显示结果中,第一行是一个提示,用来说明变动位置。它分成三个部分:前面的数字,表示file1的第n行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"(a,代表addition)和"删除"(d,代表deletion);

        2、上下文格式的diff
            上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。它的使用方法是加入-c选项(即context)。
            # diff -c f1 f2
            结果分成四个部分。第一部分的两行,显示两个文件的基本情况:文件名和时间信息,"***"表示变动前的文件,"---"表示变动后的文件。第二部分是15个星号,将文件的基本情况与变动内容分割开。第三部分显示变动前的文件,即file1。
            另外,文件内容的每一行最前面,还有一个标记位。如果为空,表示该行无变化;如果是感叹号(!),表示该行有改动;如果是减号(-),表示该行被删除;如果是加号(+),表示该行为新增。
            第四部分显示变动后的文件,即file2。

        3、合并格式的diff
            如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。
            它的使用方法是加入u参数(代表unified)。
          # diff -u f1 f2
            其结果的第一部分,也是文件的基本信息。"---"表示变动前的文件,"+++"表示变动后的文件。第二部分,变动的位置用两个@作为起首和结束。第三部分是变动的具体内容。
            除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。

        diff 
            -u

        patch

        尽管并没有指定patch和diff的关系,但通常patch都使用diff的结果来完成打补丁的工作,这和patch本身支持多种diff输出文件格式有很大关系。patch通过读入patch命令文件(可以从标准输入),对目标文件进行修改。通常先用diff命令比较新老版本,patch命令文件则采用diff的输出文件,从而保持原版本与新版本一致。

        patch的标准格式为
            patch [options] [originalfile] [patchfile]

        如果patchfile为空则从标准输入读取patchfile内容;如果originalfile也为空,则从patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。绝大多数情况下,patch都用以下这种简单的方式使用:


        patch命令可以忽略文件中的冗余信息,从中取出diff的格式以及所需要patch的文件名,文件名按照diff参数中的"源文件"、"目标文件"以及冗余信息中的"Index:"行中所指定的文件的顺序来决定。

        -p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。

            patch
                -p
                -R

mockbuild

总结:操作步骤

        1、获取并编译内核

        # useradd mockbuild
        # rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm
        # cd rpmbuild/SOURCES
        # tar linux-2.6.32-*.tar.gz -C /usr/src
        # cd /usr/src
        # ln -sv 

        2、给内核打补丁
        # tar xf netfilter-layer7-v2.23.tar.bz2
        # cd /usr/src/linux
        # patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
        # cp /boot/config-*  .config
        # make menuconfig

按如下步骤启用layer7模块

        Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
        <M>  “layer7” match support

        3、编译并安装内核
        # make
        # make modules_install
        # make install

        4、重启系统,启用新内核

        5、编译iptables

        # tar xf iptables-1.4.20.tar.gz
        # cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
        # cp /etc/rc.d/init.d/iptales /root
        # cp /etc/sysconfig/iptables-config /root
        # rpm -e iptables iptables-ipv6 --nodeps
        # ./configure  --prefix=/usr  --with-ksource=/usr/src/linux
        # make && make install

        # cp /root/iptables /etc/rc.d/init.d
        # cp /root/iptables-config /etc/sysconfig

        6、为layer7模块提供其所识别的协议的特征码

        # tar zxvf l7-protocols-2009-05-28.tar.gz
        # cd l7-protocols-2009-05-28
        # make install

7、如何使用layer7模块

        ACCT的功能已经可以在内核参数中按需启用或禁用。此参数需要装载nf_conntrack模块后方能生效。
        net.netfilter.nf_conntrack_acct = 1



        l7-filter uses the standard iptables extension syntax 
        # iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action] 


        # iptables -A FORWARD -m layer7 --l7proto qq -j REJECT



编译内核:
make menuconfig
make -j #
make modules_install
make install

清理内核源码树:

提示:xt_layer7.ko依赖于nf_conntrack.ko模块

博客:前述iptables的所有应用


Linux主机处理报文也是根据IOS协议模型处理

处理顺序

物理层 数据链路层 默认都是以太网,都是以太二型,靠arp和arap协议传输 网络层 一般都是使用IPv4协议。

传输层协议 例如tcp udp icmp 会话层 表示层层 应用层

linux的网络功能都是在内核中完成。

以ip报文为例 传输过程。 内核处理完物理层,数据链路层,之后该处理ip报文

任何ip报文的接收都要先检查路由表,检查目的地址路由表中是否能匹配上

如果是本地地址(本机有多个地址多网卡,一个网卡多地址),则直接送给INPUT处理,由本机做出处理。

如果不是本机地址,但是路由表中由相应的下一跳,则经过forward处理,将数据包的目的MAC进行替换成下一跳主机的MAC。

原创文章,作者:yyw,如若转载,请注明出处:/56550

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:guoqibee.com  万达直属  万达娱乐直属QQ  万达娱乐开户  万达娱乐注册  万达主管  万达娱乐主管  万达直属  万达娱乐  万达招商QQ