一、防火墙介绍

    Linux系统上的防火墙是由 iptables 和 netfilter,其中 iptables 是规则的制定工具,netfilter 在内核协议框架中定义了5个卡点位置,并在这5个位置通过钩子函数对进出的数据包进行过滤,从而达到防火墙的功能。iptables工具工作在用户空间,他可以制定一些规则送到内核空间,结合 netfilter 的钩子函数及处理方法对数据包进行放行或者拒绝处理。

    Netfilter/Iptables是2.4.x/2.6.x版本Linux内核集成的IP信息包过滤系统。 Netfilter/Iptables 信息包过滤系统可以当成一个整体,netfilter是内核的模块实现,iptables是对上层操作工具。Netfilter是Linux核心中的一个通用架构,工作于内核空间。

    iptables 从字面意思上讲是由ip和tables组成,因为防火墙里面有许多个table,每个表格里面都定义许多的规则,并且每个表格的用途不同,iptables按用途和功能对其分类成四个表,这四个表又由五个链组成,这五个链对应上面五个钩子函数。

    iptables提供了一系列的表(tables),每个表由若干个链(chains)组成,每条链可以由一条或若干条规则(rules)组成,其规则由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。Iptables 是一个管理内核包过滤的工具,可以用来配置核心包过滤表格中的规则。运行于用户空间。chain的本质是Netfilter定义的不同过滤点。总共定义了5个过滤。INPUT,FORWARDING,OUTPUT,PREROUTING,POSTROUTIONG。Table的本质是Netfilter定义的不同功能的划分。

二、iptables的基本组件

2.1 规则

    规则(rules)是管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

2.2 链

    链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。每个链上都有默认的规则。

PREROUTING:数据包进入本机,进入路由器之前。可以用于目标地址转换(DNAT)。
INPUT:通过路由表后目的地为本机。
FORWARDING:通过路由表后,目的地不为本机。可以用于转发数据。
OUTPUT:由本机产生,向外转发。
POSTROUTIONG:通过路由表后,发送到网卡接口之前。可以用于转发数据(SNAT,MASQUERADE)

2.3 表

    表(tables)提供特定的功能,iptables有4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。表中的

规则写在链上。

filter表

    主要用于数据报文过滤。该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链,RORWARD链,OUTPUT链。在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改。

nat表

    主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT工作(SNAT,DNAT,PNAT),iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链,POSTROUTING链,OUTPUT链。nat规则表拥有 prerouting 和 postrouting 两个规则链,主要功能为进行一对一、一对多、多对多等网址转换工作(SNAT,DNAT),由于转换的特性,需进行目的地网址转换的数据包,就不需要进行来源网址转换,反之亦然,因此为了提升改写封包的效率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把数据包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转换外,请不要做其它用途。

mangle表

    主要用作功能修改数据报文的属性。比如TCP报文的6个标志位。在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)。mangle表主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)。

raw表

    只使用在PREROUTING链和OUTPUT链上,优先级最高,可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。

规则表之间的优先顺序:

raw > mangle > nat > filter

9d9eb1137ddbe72f8588a817b6245e5f.jpg

三、工作原理

3.1、iptables概述及原理

    从内核2.4之后使用全新的内核包过虑管理工具--iptables,这个工具使用户更易于理解其工作原理,更容易被使用,也具有更强大的功能。iptables只是一个管理内核包过滤的工具,可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正执行这些过滤规则的是netfilter(linux核心中一个通用架构)及其相关模块(如iptables模块和nat模块)。

    netfilter是linux核心中一个通用架构,它提供一系列的“表”(tables),每个表由若干“链”(chains)组成,而每条链中可以由一条或数条规则(rule)组成。可以这样理解,netfilter是表的容器,表是链的容器,链是规则的容器。

    系统缺省的表为“filter”,该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的:“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链 时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件,如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条 规则;最后,如果数据包不符合该链中任何一条规则,系统就会根据该链预先定义的策略(policy)来处理该数据包。

3.2、iptables传输数据包的过程

当数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有以下3种情况:

    1、数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。
    2、数据包的上的地址不是本机,也就是说这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。

    3、数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。

    用户可以给各链定义规则,当数据包到达其中的每一条链,iptables就会根据链中定义的规则来处理这个包。iptables将数据包的头信息与它所传 递到的链中的每条规则进行比较,看它是否和每条规则完全匹配。如果数据包与某条规则匹配,iptables就对该数据包执行由该规则指定的操作。例如某条 链中的规则决定要丢弃(DROP)数据包,数据包就会在该链处丢弃;如果链中规则接受(ACCEPT)数据包,数据包就可以继续前进;但是,如果数据包与 这条规则不匹配,那么它将与链中的下一条规则进行比较。如果该数据包不符合该链中的任何一条规则,那么iptables将根据该链预先定义的默认策略来决 定如何处理该数据包,理想的默认策略应该告诉iptables丢弃(DROP)该数据包。

c217e41ffb07bd6c6afb9b02aaeb6176.gif

四、iptables命令基本语法

iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET

1、-t table

    用来指明使用的表,有三种选项: filter,nat,mangle,raw。若未指定,则默认使用filter表。

2、SUBCOMMAND:对链的操作

指定iptables 对我们提交的规则要做什么样的操作。命令都都需要以chain作为参数。

    -F :flush,清空指定表的指定链上所有规则;省略链名时,清空表中的所有链;
    -P:policy,策略,定义默认策略; 一般有两种选择,ACCEPT和DROP;
    -N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效;[-j  chain_name];自定义链只能作为默认链上的跳转对象,即在默认链通过引用来生效自定义链;
    -X:drop,删除自定义的引用计数为0的空链;
    -E:重命名自定义的引用计数和为0的链;
iptables规则的管理:
    -A:append,追加,在指定链的尾部追加一条规则;
    -I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;
    -D:delelte,删除,删除指定的规则;
    -R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换;
查看:
    -L:list,列出表中的链上的所有规则;
    -L 还支持子选项:
        -n:numeric,以数值格式显示输出中的IP地址和端口号,而不是默认的名字,比如主机名、网络名、程序名等,即不反解;
        -v:verbose,显示规则的详细格式信息,包括规则计数器等; 
        -vv:更为详细的格式;
        -vvv:更更为详细的格式;
        -x:exactly,使--list输出中的计数器显示准确的数值,而不用K、M、G等估值;
         --line-numbers:该选项的作用是显示出每条规则在相应链中的序号,对插入新规则很有用;
        --modprobe:此选项告诉iptables探测并装载要使用的模块。这是非常有用的一个选项,若modprobe命令不在搜索路径中,就要用到了。
        有了这个选项, 在装载模块时,即使有一个需要用到的模块没装载上,iptables也知道要去搜索。

计数器:

    记录被当前规则所匹配到的规则,以及默认策略有专用的计数器;

        (1) 报文个数;

        (2) 字节总数;

重置规则计数器:

        -Z:zero,置0;

3、CHAIN:

                (1) 内建链;

                (2) 自定义链;

4、CRETERIA:匹配条件

    多重条件:逻辑关系为“与”;匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号。

基本匹配条件:

    [!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
    [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
    [!] -p, --protocol:检查报文中的协议,即ip首部中的protocols所标识的协议,protocol:{tcp|udp|icmp}三者之一;
    [!] -i, --in-interface name:数据报文的流入接口;通常只用于INPUT, FORWARD 和 PREROUTING 链上的规则;
    [!] -o, --out-interface name:数据报文的流出接口;通常只用于 FORWARD, OUTPUT 和 POSTROUTING链上的规则;

注:可同时指定多个条件,默认多条件要同时被满足。

扩展匹配条件

  使用 iptables 的模块实现扩展性检查机制,扩展匹配又分为隐式扩展和显式扩展。

    隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;如果在通用匹配上使用 -p 选项指明了协议的话,则使用-m 选项对其协议的扩展就变得可有可无了。

     -p tcp:隐含了-m tcp:针对 tcp 协议
        [!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
        [!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
        [!] --tcp-flags mask comp
            SYN,ACK,FIN,RST,URG,PSH;    
            mask:要检查的标志位列表,以逗号分隔;
            comp:必须为1的标志位列表,余下的出现在mask列表中的标志位则必须为0;
        [!] --syn:
            相当于--tcp-flags  SYN,ACK,FIN,RST  SYN 
    -p udp:隐含了-m udp:针对 udp 协议
        [!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
        [!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
    -p icmp:隐含了-m icmp:针对 icmp 协议
        [!] --icmp-type {type[/code]|typename}
            8:echo-request
            0:echo-reply

    显式扩展:必须使用-m选项指出matchname使用的扩展机制,有的match可能存在专用的选项;

 -m 模块名称
            每个模块会引入新的匹配机制;可以通过 rpm -ql iptables 来获取哪些模块可用,模块是以 .so 结尾的

1%]I[8CQ2R9VOITWPZ6@%8K.png

    1、multiport 扩展

      以离散或连续的方式定义多端口匹配条件;最多指定15个端口;

 -m 模块名称
            每个模块会引入新的匹配机制;可以通过 rpm -ql iptables 来获取哪些模块可用,模块是以 .so 结尾的

        [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
        [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
        [!] --ports port[,port|,port:port]...:指定多个端口;

    2、icmp 扩展

      基于发包速率作限制;

        --limit n[/second|/minit|/hour|/day]
        --limit-burst n

        icmp-type 8 请求

        icmp-type 0 应答

   3、iprange扩展

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

        [!] --src-range from[-to]:源IP地址;
        [!] --dst-range from[-to]:目标IP地址;

    4、set扩展

      依赖于ipset命令行工具;           

   5、string扩展

      检查报文中出现的字符串,对报文中的应用层数据做字符串匹配检测;

      字符串匹配检查算法:kmp,bm

        [!] --string pattern:要检测字符串模式;
        [!] --hex-string pattern:要检测的字符串模式,16进制编码;
         --algo {bm|kmp}

    6、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...]
        --kerneltz:使用内核中配置的时

   7、connlimit扩展

      基于连接数作限制,对每个IP能够发起的并发连接数作限制;根据每客户端IP做并发连接数匹配;

        --connlimit-upto n:连接数数量小于等于n,此时应该允许;
        --connlimit-above n:连接数数量大于n,此时应该拒绝;

    8、state扩展

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

      启用连接追踪模板记录连接,并根据连接匹配连接状态的扩展;启用连接追踪功能之前:简单包过滤防火墙;启用连接追踪功能:带状态监测的包过滤防火墙;

      连接追踪模板,用于记录各连接及相关状态;基于IP实现,与是否为TCP协议无关;通过倒计时的方式删除条目;记录连接的状态有:

        INVALID:无法识别的状态;

        ESTABLISHED:已建立的连接;NEW 状态之后,边距追踪模板中的条目删除之前所进行通信过程,都称为ESTABLISHED;

        NEW:新建立的连接,连接追踪模板中无相应的条目时,客户端第一次发出的请求;

        RELATED:相关联的连接,如ftp协议的命令连接与数据连接即为相关联的连接;

        UNTRACKED:未追踪的连接;

        [!] --state STATE

5、-j

        jump,跳转目标

6、TARGET:采取的动作

    target/jump决定符合条件的包到何处去,语法是--jump target或-j target。target可以被细分为两类,Target和Jump。jump的目标是一个在同一个表内的链。target的目标是具体的操作。

    target指定要对包做的操作,比如DROP和ACCEPT。不同的target有不同的结果。一些target会使包停止前进,也就是不再继续比较当前链中的其他规则或父链中的其他规则。而另外一些target在对包做完操作之后,包还会继续和其他的规则比较,如LOG,ULOG和TOS。它们会对包进行记录,然后让包通过,以便匹配这条链中的其他规则。有了这样的target,就可以对同一个包既改变它的TTL又改变它的TOS。有些target必须要有准确的参数(如TOS需要确定的数值),有些就不是必须的,但如果我们想指定也可以(如日志的前缀,伪装使用的端口,等等)。

      内置目标:

        ACCEPT:接受;当包满足了指定的匹配条件,就会被ACCEPT,允许包前往下一个目的地。不会再去匹配当前链中的其他规则或同一个表内的其他规则,但包还要通过其他表中的链,可能会被DROP。

        DROP:丢弃;当信息包与具有DROP目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为-j DROP。若包符合条件,该target就会将target丢掉,也就是说包的生命到此结束,效果就是包被阻塞了。在某些情况下,这个target会引起意外的结果,因为它不会向发送者返回任何信 息,也不会向路由器返回信息,这就可能会使连接的另一方的sockets因苦等回音而亡:) 解决这个问题的较 好的办法是使用REJECT target,(译者注:因为它在丢弃包的同时还会向发送者返 回一个错误信息,这样另一方就能正常结束),尤其是在阻止端口扫描工具获得更多的信息时,可以隐蔽被 过滤掉的端口等等(译者注:因为扫描工具扫描一个端口时,如果没有返回信息,一般会认为端口未打开或 被防火墙等设备过滤掉了)。还要注意如果包在子链中被DROP了,那么它在主链里也不会再继续前进,不管 是在当前的表还是在其他表里。总之,包死翘翘了。

        REJECT:拒绝;REJECT和DROP基本一样,区别在于它除了阻塞包之外, 还向发送者返回错误信息。target还只能用在INPUT、FORWARD、OUTPUT和它们的子链里,而且包含 REJECT的链也只能被它们调用,否则不能发挥作用。它只有一个选项,是用来控制 返回的错误信息的种类的。虽然有很多种类,但如果你有TCP/IP方面的基础知识,就很容易理解它们。拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

        以上连接追踪功能内核会在内存中开辟一段专用的空间用于存储连接的状态等,由于此段内存空间是有限的,因此就必须对连接追踪功能进行一些调整限制,有关参数有:

       nf_conntrack内核模块;

            当前追踪到的所有连接:/proc/net/nf_conntrack文件中;

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

                此值可自行定义,建议必要时调整到足够大;

            不同的协议的连接追踪的时长:/proc/sys/net/netfilter/

            日志:/etc/syslog.conf,将数据包相关信息纪录在 /var/log 中,进行完此处理动作后,将会继续比对其它规则。

五、保存及重载规则

centos 6:

    保存规则:

        (1)service iptables save

            /etc/sysconfig/iptables 文件

        (2)iptables-save > /PATH/TO/SOMEFILE

    重载规则:

        (1)service iptables restart

        (2)iptables-restore > /PATH/TO/SOMEFILE

centos 7:iptables 前端管理服务工具 firewalld

    firewalld 通过前端管理工具:firewalld-cmd 和 firewalld-config。为了保持和 centos 6 上同样使用 iptables 来管理规则,需要在centos7上先关闭和禁用 firewalld 服务,方法如下:

    systemctl stop firewalld.service
    systemctl disable firewalld.service

六、扩展示例

示例:

(1)multiport 扩展

1、获取服务端ip地址

W_4DP)]UM_UY}}Q`~J$2B0L.png

测试端ip地址

W@J1]183)BUY{3NMS)W924N.png

2、测试服务端和测试端是否可以相互通信

服务端

$3UE}]O0TWFG%@EU[9NXS`W.png

测试端

_4DTOEIQVGR0)(9_~TGA3]F.png

3、关闭防火墙

UUP~%5}VOYX$}3U)XR4U_0D.png

1KR7EI2_IZPUTHOW{@K2FZ6.png

4、清空指定表的指定链上所有规则

$7G[~B9V%_LG8A`AX[}4VZT.png

4C8IVQI$MUXHL6I(CDR$PLC.png

5、开启httpd、vaftpd、sshd服务

3(DWXKK06{L([D()FNL$O90.png

}0@7NUX)4EQME6@$HUI{E39.png

6、设置策略,禁止测试端服务访问服务端

LE}5``}Y1ONDP(K@LVY%ZSE.png

$8EB$DJNS[C(J8(8UWXX3_3.png

7、设置策略,仅允许21,22,80端口访问

X_PJA1%(_5B[PY9YL{UKKQ7.png

注:本策略需要放在最前面

8、结果

_O1U_[1QT[5%GAD0E{HM3SC.png

(2)icmp 扩展

示例1:

1、设置防火墙策略,禁止的所有icmp请求和应答

N5$EK(4WR`68M]7%%TYO5FO.png

2、结果

IIEQ$KI7N[4T9_$8HMZR02M.png

UW`6PU`JT690QJC9GQIE`[7.png

3、设置iptables策略,允许服务端可以与测试端通信,测试端不能与服务端通信

Z8JQU5`%XLZD(O(PD2YBWI1.png

4、测试结果

`CZ`WYXFG8EYRVNB~IQFI]4.png

]66XNWR)VOQ[T6HV6C{OA)5.png

示例2:

1、访问测试

ZD[[7F})J@}ATD0{VE8XJ7L.png

2、设置策略,每3秒发放一个包

7DWZJ[VEPA{`G0E[WLDJ)[X.png

3、测试

%I$UZ]FI_7$9Z5SC3UJ(@VX.png

(3)iprange扩展

1、准备测试环境

_O1U_[1QT[5%GAD0E{HM3SC.png

2、设置策略

A6%PGYRN]ZB[4TYG[~ABB45.png

3、结果

D1KL38Q0$CK)P7F~9$B_9L6.png

2@I@DOMDJZFO5B~ZM0`O}0V.png

6C_HV{)SI%RRDZ3KPHD~V}3.png

[A}B_50D@I2}9QBWU~DBPH6.png

(4)ipset 工具

1、查看 ipset 是否已经被安装

C33@HDW[QPF(@220D$)}Y~2.png

2、创建ipset列表,列表名字为httpdlist,模式指为net,最大允许10000个客户端规则

6}_6F[B4{({Y6LV}ES0IFI3.png

3、添加允许访问的ipset列表IP

39A8R05_KMF`BX6JLCKN8LP.png

4、添加防火墙策略

[root@mumu 7-1 ~]# iptables -I INPUT 1 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT
[root@mumu 7-1 ~]# iptables -I OUTPUT 1 -p tcp --sport 80 -m set --match-set httplist dst -j ACCEPT

I2JP19{4H9]N~H8L6V2XO3K.png

5、测试测试机是否可以访问服务端

QUKCHE)XMI$JGMOK9Q6~TH3.png

(5)和(6)time 扩展

示例1:

1、设置策略,禁止测试端服务访问服务端,并开放80端口

LE}5``}Y1ONDP(K@LVY%ZSE.png

P9D4RWAHQE~TM5(R(_M3OVQ.png

2、创建访问的文件

%Z_08NPWI@~B23X3`{52POL.png

3、测试测试端访问服务端是否可以访问

V$7V5@09U}U)34WC4Q53])V.png

4、添加策略,允许访问百度,不允许访问谷歌

U(DKN~GYR[])DSTJ1@`8AH2.png

5、结果

EF@B@ZS536S`%@Y%V)0[FJE.png

示例2:

1、设置策略,周六19点到19点58不可以访问百度

MWSM)}Z0V[63C``J((JOO[W.png

2、结果

19JG%QS{YK]9K6@MADIZ`{2.png

E`}EUVPW`%4S7GI1O}~7P]2.png

(7)connlimit 扩展

1、安装包

~LTC7}{TMO9_JN[6$MD6%16.png

2、设置策略,数据包同一时刻只能2个并发执行

OE@I_6JZYKGR3T[0RGK(3)V.png

3、测试

BZY4GE823Q{VKNZXU2$_S_O.png

RF[VZ```0~_MEPAN~OUOW~I.png

(8)state扩展:状态追踪

1、将ftp的模块装载进内核

O9D%4W@GH8S10@{X$N(%C$E.png

2、放行请求报文

旅行命令连接:NEW、ESTABLISHED

[root@mumu 7-1 ~]# iptables -I INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEP

旅行数据连接:RELATED、ESTABLISHED

[root@mumu 7-1 ~]# iptables -I INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEP

99V8B03FT4CN{)~69MLM)}N.png

3、旅行出站响应报文

旅行所有状态为ESTABLISHED的出站报文

[root@mumu 7-1 ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

}SVJF1OSZLE]YT$P~IO{JG5.png

4、启动ftp服务

I)LF2HPOFMSX4[A`DXMY3_K.png

5、测试结果

查看设置的端口策略是否开启

9%PE@{Q[K0G6_]4`JNRX[JJ.png

测试是否可以访问

T@{[$G0LGZB$9_~$(ILS}HS.png

查看端口监控状态

EC%P]7E3$_PJ(%ZL2@EX{LH.png

注:在测试端执行不同操作,端口会随之变化。

(9)日志

    -j LOG

1、设置策略

[root@mumu 7-1 ~]# iptables -I INPUT -p tcp --dport 80 -j LOG --log-prefix "new connection:"

[root@mumu 7-1 ~]# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

MTG)(`@4)CY[[DQW}243_3W.png

2、在测试机访问

A_A{Y8TI5NZ%`M5BJH_)K2Q.png

3、查看日志

9`M]8GHC1YTU)Y7L9TNZO3F.png

七、功能

1、NAT

    主要用于对IP和端口的修改伪装

2、SNAT

    主要用于实现让内网客户端访问外部主机时使用,要定义在 POSTROUTING 链,也可以在 OUTPUT 使用。

定义方法:

    iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j SNAT --to-source NAT 服务器上的某外网地址
    另一个TARGET: 地址伪装,能自行判断该转为哪个源地址;
    iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j MASQUERADE

3、DNAT

    主要用于发布内部服务器,让内网中的服务器在外网中可以被访问到,要定义在 PREROUTING 链;

定义方法:

    iptables -t nat -A POSTROUTING -d NAT 服务器上的某外网地址 -p 某协议 -dport 某端口 -j DNAT --to-destination 内网某服务器地址 [:PORT]