首先理解防火墙是什么?

防火墙只是一个框架,真正想实现就需要规则,只有在出入口处定义防范策略,也才能识别好人还是坏人;

iptabels怎么来的? 
(1) iptables它只是命令行工具程序,位于用户空间且只是通用规则编辑管理工具; 
(2) 最早实现在内核中提供防火墙机制的是BSD UNIX,而Linux设计开发者参考了在BSD中的实现并开始引入到Linux内核当中来,最早的一代我们叫IPfirewall也是2.0之前的版本。 
(3) 2.2版本后叫ipchains,为了解决应对防火墙上的不同策略而浮生。 
(4) 2.4版本后叫iptables,为了解决防火墙上诸多功能与不同策略而浮生。 
ipfirewall是什么? 
ipfirewall简称ipfw,是在FreeBSD上开发的IP封包过滤程式,具备防火墙功能,由FreeBSD开发团队负责维护。它曾被移植到多个平台上,Mac OS X曾经采用它作为预设防火墙,直到Mac OS X 10.7 Lion 采用另一个FreeBSD程式PF来取代它。在94年艾伦·考克斯曾经将它移植到Linux 1.1上,作为Linux的预设防火墙,直到Linux 2.4被iptable来取代。(摘自wiki) 
iptables又是什么? 
我们在上面已经说过,它只是一个命令行工具,只是一个运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的流动与转送。在大部分的Linux系统上面,iptables是使用/usr/sbin/iptables来操作,文件则放置在手册页(Man page[2])底下,可以通过 man iptables 指令获取。通常iptables都需要内核层级的模块来配合运作,Xtables是主要在内核层级里面iptables API运作功能的模块。因相关动作上的需要,iptables的操作需要用到超级用户的权限。(摘自wiki) 
什么是Firewall? 
它是一种隔离工具(Packets Filter Firewall,即包过滤防火墙,带状态追踪机制的包过滤防火墙) 
工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件; 
组件可以是硬件级别或者是软件级别

硬件防火墙:在硬件级别实现部分过滤功能的防火墙;另一部分功能基于软件实现;
       提供通用功能支撑;
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;
       提供复杂逻辑;
主机防火墙:服务范围为当前主机;
       只为单台主机提供访问策略;
网络防火墙:服务范围为防火墙被的局域网;
       整个逻辑是在软件层实现的;

Linux系统内核级防火墙有两个层面的工具组成

netfilter与iptables
(1) Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架。该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想;
(2) Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能: 
    网络地址转换(Network Address Translate);
    数据包内容修改; 
    以及数据包过滤的防火墙功能; 
(3) Netfilter 平台中制定了数据包的五个挂载点(Hook Point,可理解为钩子函数,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容);
这5个挂载点分别是 PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING; 
(4) iptables:Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld

iptables的四表与五链

四表;tables
       filter:过滤,防火墙;
       nat:network address translation,网络地址转换;
       mangle:拆解报文,做出修改,并重新封装;
       raw:关闭nat表上启用的连接追踪机制;
五链;CHAINS
       prerouting 路由前
       input 入站
       forward 转发
       output 出站
       postrouting 路由后

四个表的功能讲解

filter表: 
主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP,ACCEPT,REJECT); 
filter 表对应的内核模块为iptable_filter,包含三个规则链: 
    INPUT链:针对哪些目的地是本地的包; 
    FORWARD链:过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包; 
    OUTPUT链:是用来过滤所有本地生成的包; 
nat表:
主要用于修改数据包的IP端口等信息(网络地址转换,如SNAT,DNAT,MASQUERADE,REDIRECT);
属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链: 
    PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址; 
    OUTPUT链:改变本地产生的包的目的地址; 
    POSTROUTING链:在包就要离开防火墙之前改变其源地址; 
mangle表:
主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛; 
包含五条规则链:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD ;
raw表:
是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表; 
包含两条规则链;OUTPUT与PREROUTING;

五个链的功能讲解

在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链;

从应用时间点的角度理解这些链:
(1) INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;
(2) OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则;
(3) FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时应用此链中的规则;
(4) PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT; 
(5) POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT;

iptables中数据包和4种被跟踪连接的4种不同状态:

(1) NEW:该包想要开始一个连接(重新连接或将连接重定向) ;
(2) RELATED:该包是属于某个已经建立的连接所建立的新连接; 
例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。–icmp-type 0 ( ping 应答) 就是–icmp-type 8 (ping 请求)所RELATED出来的; 
(3) ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包; 
(4) INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据;

报文的请求方式和报文的流向

报文的请求:

(1) 由本机流出的报文 
     请求别人; 
     响应别人; 
(2) 流入本机的报文 
     别人直接请求进来的; 
     自己请求出去别人响应进来的;

报文的流向:

(1) 到本机某进程的报文:PREROUTING –> INPUT;

(2) 由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING;

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

注意:接口本身没有方向,我们在写规则的时候要考虑报文的流经方向;

iptables规则的组成部分即数据包的处理方式

上面我们已经说过了四表五链(功能与钩子)的对应关系,而真正去管理实现防火墙的基本功能是需要iptables这个管理工具来实现; 
注意:整个防火墙的规则是由iptables来编写; 
那iptables规则的组成到底有哪些呢?

1、匹配条件:
对一个报文的检查部分有; 
    网络层首部:Source IP, Destination IP ;
    传输层首部:Source Port, Destination Port ;
    应用层首部:需借助于扩展检查机制方可实现; 
    扩展检查机制:需要iptables_netfilter扩充一些功能才能检查(以模块化呈现) ;

2、处理动作:target 叫处理目标 
    ACCEPT–接收允许,DROP–丢弃,REJECT–拒绝;

安装使用iptables/netfilter

安装信息摘要:
(1) 实验的系统环境:CentOS 7.2 
(2) netfilter是位于内核中的TCP/IP协议栈报文处理框架,可使用模块管理命令mod查看模块信息;
(3) iptables定义的规则是在用户空间定义的,然后送往内存中的内核上,重启自动消失; 
(4) iptables不是服务,即需要配置文件来保存规则也可写入脚本使其开机自动运行; 
(5) 针对CentOS平台不同系统版本的iptables管理实现: 
CentOS 5/6:iptables命令编写规则
    ~]# iptables -t filter -F 
    ~]# service iptables save 
    服务脚本: /etc/init.d/iptables (可复制到CentOS7上一样可运行) 
CentOS 7:firewalld(守护进程),firewall-cmd(命令行工具), firewall-config(配置文件) 
    ~]# systemctl disable firewalld (服务关闭,先disable后stop) 
iptables安装:
程序包:iptables(ipv4包过滤和NAT转换管理工具) 
iptstate(状态追踪工具) 
保证实验需要先安装应用程序: 
~]# yum install httpd samba telent vsftpd -y

用iptables命令去写规则时需要注意的问题

规则匹配方法:

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

规则匹配的条件:主要匹配IP层首部特征;
基本匹配条件:源地址,目标地址,传输层协议; 
扩展匹配条件:需要借助于扩展模块进行指定的匹配条件(有两种); 
    隐式扩展:已经在基本匹配条件中指明的协议相关的扩展; 
    显式扩展:隐式扩展之外的其它扩展匹配条件; 
处理动作: 
    基本动作:ACCEPT,DROP,… 
    扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作,大写都是指明扩展 ; 
添加规则时需要考量的问题(重点): 
(1) 报文流经的位置:用于判断将规则添加至哪个链; 
(2) 实现的功能:用于判断将规则添加至哪个表; 
(3) 报文的方向:用于判断哪个为“源”,哪个为“目标”; 
(4) 匹配条件:用于编写能够正确匹配目标报文的规则; 

举例:阻止来自于10.1.0.101访问本机的web服务

iptables命令的多种使用格式

通用规则管理格式: 

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

注意:-t table 表示指明要管理的表,默认为filter且优先级最低;

Linux防火墙(iptables )的功能详解一,不能再详细了_第1张图片

COMMANDS(子命令):

对链本身管理: 

-P:iptables [-t table] -P chain target,定义链的默认策略;其target一般可使用ACCEPT或DROP;            
    因为防火墙风格两种:白名单,黑名单 一但设置为DROP则外部访问全拒绝
    举例:~]# iptables -t filter -P INPUT DROP (改默认策略为DROP)
    
-N:chain,自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;    
    iptables [-t table] -N 
    举例:~]# iptables -N in_web (0 references=零次引用)             
    注意:自定义链规则不会送入到钩子上的,自定义链想要生效必须在内置链上去引用它;            
     每一个自定义链都会有被引用计数,为零表示没有被引用;
    
-X:iptables [-t table] -X [chain],删除自定义的空的引用计数为0的链;           
    举例:~]# iptables -X (慎用...如未加X选项表示删除所有链,且不可逆)
    
-F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ;
    
-E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链;    
    举例:~]# iptables -E in_web in_httpd
    
-Z:iptables [-t table] -Z  [chain [rulenum]] [options...] 置零计数器          
    每条规则以及链的默认策略分别有各自的两个计数器:
        (1) 匹配到的报文的个数:pkts
        (2) 匹配到的所有报文的大小之和:bytes    
    举例:~]# iptables -Z INPUT (多次刷新)

链的规则管理:

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

规则显示的字段表示的意思:

pkts:由此包所匹配到的报文个数;
bytes:由此规则所匹配到的包的大小之和/字节数;
target:表示匹配到的规则是target;
prot:表示被这个规则所匹配到的协议protocol;
opt选项:
in:报文限制从哪个接口流入;
out:报文限制从哪个接口流出;
source:源地址;
destination:目标地址;
注意:如果定义的链没有被任何规则所匹配,则默认被策略所匹配(policy ACCEPT 806 packets,94361 bytes);

查看:

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

iptables的匹配条件

匹配条件我们在上面已经讲过了,在这里注意一点就可以; 
即多重条件之间的隐含逻辑为“与”操作; 
基本匹配条件:       

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

举例:针对本机入站凡事来自于10.1.0.0/16网络请求都被允许,凡事来自于10.1.253.44访问本机的请求都拒绝;
    ~]# iptables -I INPUT -s 10.1.253.44 -j REGECT 
    ~]# iptables -t filter -A INPUT -s 10.1.0.0/16 -j ACCEPT 
把以上所拒绝的源网络地址匹配规则改为DROUP 
    ~]# iptables -R INPUT 1 -s 10.1.253.44 -j DROP 
不再阻断10.1.253.44报文请求,放行 
    ~]# iptables -vnL –line-numbers (先看规则处在哪个条目上) 
    ~]# iptables -D INPUT 1 不指明匹配条件,指明number数 
    ~]# iptables -D INPUT -s 10.1.253.44 -j DROP(指明匹配条件) 
举例:本机只允许本机上的tcp请求服务,请求放行 
    ~]# iptables -A INPUT -s 10.1.253.0.0/16 -d 10.1.253.43 -p tcp -j ACCEPT 
    ~]# iptables -R INPUT 1 -j REGECT 
注意:不同类别的规则,匹配机会更大,访问比较频繁的放在前面(注意先后顺序)

扩展匹配条件: 
隐式扩展: 

不用-m选项明确给出要使用的扩展机制的扩展;
此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;(不指定-m扩展即为隐式扩展) ;
-p tcp:可直接使用tcp协议对应的扩展选项; 
    [!] –source-port,–sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; 
        21:22:23 [:20,20:] 
    [!] –destination-port,–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; 
        21:22:23 [:20,20:] 
    [!] –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]:匹配报文中的传输层的源端口;可给出多个连接的端口; 
        21:22:23 [:20,20:] 
    [!] –destination-port,–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; 
        21:22:23 [:20,20:] 
-p icmp:可直接使用icmp协议对应的扩展选项,主要指定icmp类型用来探测主机或网络的可用性 
        [!] –icmp-type {type[/code]|typename} 
        –icmp-type 0/0:匹配对ping请求的响应报文 
        –icmp-type 8/0:匹配ping请求报文 
举例:只开放本机的openssh服务的22端口给本地网络(整个网络只放行openssh 22端口) 
    ~]# iptables -A INPUT -s 10.1.0.0/16 -d 10.1.253.43 -p tcp –dport 22 -j ACCEPT 入站 
入站整个网络我只放行22端口 
    ~]# iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.253.43 -p tcp –sport 22 -j ACCEPT 出站 
出站整个网络我只放行22端口 
    ~]# iptables -P INPUT DROP 
    ~]# iptables -P OUTPUT DROP 
举例:开放本机的ping请求 
ping请求报文:8/0 :请求报文是进入本机的 
    ~]# iptables -A INPUT -s 10.1.0.0/16 -d 10.1.253.43 -p icmp –icmp-type 8/0 -j ACCEPT 
抓包看一看 tcpdump -i eno16777736 -nnn icmp 
ping响应报文:0/0 :响应报文是由本机发出去的 
别人ping自己 
    ~]# iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.253.43 -p icmp –icmp-type 0/0 -j ACCEPT 
自己ping他人,出站 
    ~]# iptables -A OUTPUT -s 10.1.253.43 -d 0.0.0.0/0 -p icmp –icmp-type 8/0 -j ACCEPT 
先让你请求出现,不让你出去/状态是 
    ~]# iptables -A INPUT -d 10.1.253.43 -s 0.0.0.0/0 -p icmp –icmp-type 0/0 -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]...:匹配此处指定的源或目标端口;
    使用一条规则开放本机的21,22,23,80端口
        ~]# useradd centos
        ~]# iptables -A INPUT -d 10.1.253.43 -p tcp -m multiport --dports  21,22,23,80 -j ACCEPT 入站
        ~]# iptables -A OUTPUT -s 10.1.253.43 -p tcp -m multiport --sports 21,22,23,80 -j ACCEPT 出站
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
    举例:网站包含sex字段,响应时阻断 
        ~]# iptables -I OUTPUT -s 10.1.253.43 -p tcp --sports 80 -m string --string "sex" --algo bm -j REGECT
        ~]# curl 10.1.253.43/index.html
        ~]# curl 10.1.253.43/index2.html
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...]
    举例:阻断telnet在非工作时间访问
        ~]# iptables -I INPUT -d 10.1.253.43 -p tcp --dport 23 -m time --timestart 16:00:01 --timestop 09:59:00 --weekdays sat sun -j REJECT
            指定这天
        i~]# ptables -I INPUT -d 10.1.253.43 -p tcp --dport 23 -m time  --weekdays Thursday -j REJECT 
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
    举例:ssh服务,每个客户端单IP最大发出连接请求不可以超出2个
       ~]#  iptables -I INPUT -d 10.1.253.43 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REGECT
6、limit 
    基于收发报文的速率进行匹配;
        --limit rate[/second|/minute|/hour|/day]
        --limit-burst number
    举例:允许别人对本机发起ping请求,每3秒钟接收一次ping请求,
        ~]# iptables -A INPUT -d 10.1.253.43 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT 入站
        ~]# iptables -A OUTPUT -d 10.1.253.43 -p icmp --icmp-type 0 -j ACCEPT 出站
7、state (包) 
    状态检测:连接追踪机制(conntrack)
        NEW:新连接
        ESTABLISHED:已建立的连接 (注意)
        RELATED:相关联的连接 (注意)
        INVALID:无法识别的连接
        UNTRACKED:未被追踪连接;
    [!] --state state
    举例:只放行已建立连接指定端口并放行
       ~]#  iptables -A INPUT -d 10.1.253.43 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT 入站
       ~]#  iptables -R OUTPUT 1 -m state --state --state ESTABLISHED -j ACCEPT 出站
       ~]#  iptables -A INPUT -d 10.1.253.43 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT (只要是ESTABLISHED统统放行)
      ~]#   iptables -R INPUT 2 -d 10.1.253.43 -p tcp -m multiport --dports 21:23,80 -m state --state NEW -j ACCEPT(21,22,23,80只放行NEW)
如何开放被动模式的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
    done !

处理动作(跳转目标):

-j tagetname [per-target-options]

简单target:
    ACCEPT,DROP
    用rpm -ql iptables看到有很多大写小写模块,其大写用于指明target,小写用于指明条件对的
扩展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:日志信息的前导信息;
举例:他人访问我本机ssh服务时,都将记录到日志当中,怎么做?
~]# iptables -I INPUT 2 -d 10.1.253.43 -p tcp --dport 22 -j LOG --log-prefix "openssh from kernel"

保存和载入规则:

保存:iptables-save > /PATH/TO/SOME_RULE_FILE;
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE;
    -n, --noflush:不清除原有规则;
    -t, --test:仅分析生成规则集,但不予提交;
注意:重载文件中的规则,会清除已有规则;
针对不同CentOS版本的保存规则方法:
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) 建议在规则链的最后定义规则做为默认策略;

(5)重点:

    1.首先查本地arp cache信息,看是否有对方的mac地址和IP地址映射条目记录 

    2.如果没有,则发起一个arp请求广播包,等待对方告知具体的mac地址 

    3.收到arp响应包之后,获得某个IP对应的具体mac地址,有了物理地址之后才可以开始通信了,

    同时对ip-mac地址做一个本地cache 

    4.发出icmp echo request包,收到icmp  echo reply包

注意:往往很多人都忽略了上面3步,只知道有最后一步。

如果设置了默认规则都为DROP:则应该在进出口做相应放行策略,以免被自己杀掉自己

~]# iptables -A INPUT -d 10.1.253.43 -j DROP
~]# iptables -P INPUT ACCEPT
~]# iptables -A OUTPUT -d 10.1.253.43 -j DROP
~]# iptables -P OUTPUT ACCEPT

这一篇的主机防火墙知识就到到这里了。下一篇的文章会主要介绍网络防火墙与nat表的简要信息;
So...春节到了小生在这里祝福大家“新年快乐”,阖家安康。我们来年继续努力工作,努力学习...