一、iptables的4表-5链

4表:

filter : 对报文做过滤

nat : 网络地址转换; 一般为源地址转换,目标地址转换

mangle : 拆解报文,做出修改后,封装报文

raw : 可以通过启用连接追踪机制,来确认哪些访问的报文之前来过;如果启用连接追踪,要尽量使用大内存


优先级从低到高: filter ---> nat --->mangle ---> raw


5链

PREROUTING :第一次路由决策做出处理

INPUT: 进入本机内部的

FORWARD: 从本机转发出去的,需要开启路由转发功能;可实现网络防火墙的功能

OUTPUT:从本机内部发出的

POSTROUTING:第二次路由决策做出处理


路由发生的位置:

报文进入本机后,判断目标主机 

报文离开本机之前,判断从哪个网卡接口送往下一跳


规则和链有计数器 --- 可以通过 #iptables -L -n -v 查看

    pkts:由规则或链所匹配到的报文的个数

    bytes:由规则或链匹配到的 


二、添加规则时的考量点: 

(1)要实现哪种功能:判断添加在哪张表上                         

(2)报文流经的路径:判断添加在哪个链上                                                    

链:链上规则的次序,即为检查的次序,因此隐含一定的法则                          

(1)同类规则(反问同一应用),匹配范围小的放上面,检查规则更严格,可提高效率                     

(2)不同类规则(反问不同应用),匹配到报文频率大的放上面                            

(3)将那些可由一条规则描述的多个规则合并为一个规则                               

(4) 设置默认策略 (白名单--默认为拒绝)


三、iptables常用选项总结

-t {filter,nat,mangle,raw} : 指定表

-A {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } :指定向哪个链中追加规则

-I {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING }  [rulenum] : 指定向哪个链中插入规则,可以指定规则的编号,不加编号表示插入到该表的第一行

-D {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } rulenum :指定删除哪个链中的哪条规则

-R {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } rulenum :指定替换哪个链中的哪条规则

-N 自定义链名: 创建一条新的自定义链

-Z {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING,自定义链} : 将某个或全部链ptks和bytes置0;

-X [自定义链名] :删除用户自定义的规则链,必须为空的规则链 

-P {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } target :设置某个链的处理策略

-E:rename,重命名自定义链;引用计数不为0的自定义链(-j TARGET),无法改名,无法删除  

-F {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING,自定义链}:清空规则链; 省略链,表示清空指定表上的所有链  

-L:list,列出指定链上的所有规则 

     -n:以数字格式显示地址和端口号,不反解

     -v:verbose,显示详细信息 

     --line-numbers:显示规则编号 

     -x:显示计数器计数结果的精确值(不自动取整)


四、iptables的规则

组成部分:报文的匹配条件,匹配到之后的处理动作

4.1匹配条件:

①基本匹配

-s : 源ip地址

-d :  目标ip地址

-p {tcp,udp,icmp} :  要匹配的协议,一般使用列出的3种 

-i interface : 报文流入的接口

-o interface : 报文流出的接口


②扩展匹配

  额外检查/usr/lib64/xtables/*.so ; 大写的为target,小写为匹配条件 

         格式: -m match_name --spec_options      

         例如: -m tcp --dport 22  

 隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项 

  -p tcp 

 --dport PORT[-PORT] : 目标端口,可以是单个端口或连续多个端口 

        --sport PORT[-PORT] : 源端口,可以是单个端口或连续多个端口 

        --tcp-flags LIST1 LIST2 : 检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记为必须为1,而余下的必须为0,没有LIST1中指明的,不作检查 

                           SYN,ACK,FIN,RST,PSH,URG   //tcp协议常用的标志位

       --tcp-flags SYN,ACK,FIN,RST  SYN

       --syn:检查tcp3次握手的第一次

-p udp 

--dport PORT[-PORT] : 目标端口,可以是单个端口或连续多个端口 

                --sport PORT[-PORT] : 源端口,可以是单个端口或连续多个端口 

 -p icmp  

                --icmp-type   类型 :可用数字表示; 

                使用的时候要注意好报文的流向,目标地址和源地址的问题 

                 0 ===> 表示ping应答 ;   

                 8 ===> 表示ping请求 ;    


 ③显示扩展:必须使用-m选项指定使用的扩展模块(# rpm -ql iptables | egrep "[[:lower:]]+.so$") 

 1、multiport扩展 :以离散方式定义多端口的扩展,最多指定15个 

 [!] --sports port[,port|,port:port]...:指明多个离散的源端口;

[!] --dports port[,port|,port:port]...:指明多个离散的目标端口;


2、iprange扩展 :指定连续的ip地址范围 

[!] --src-range from[-to]:指明连续的源IP地址范围;

[!] --dst-range from[-to]:指明连续的目标IP地址范围;



3、string扩展 :检查报文中出现的字符串 

--algo {bm|kmp} ;指定2种算法之一 

 --string ‘###’: 指定要匹配的字符串,使用单引号


4、time扩展: 根据报文到达的时间与指定的时间范围进行匹配

--datestart : 开始日期 

--datestop : 结束日期

--timestart hh:mm[:ss] :开始时间

--timestop hh:mm[:ss] : 结束时间

--monthdays [1-31] :一个月中的某天;取值为1-31

--weekdays day[,day] :一周中的某天;取值为1-7 


5、connlimit扩展: 单ip并发连接数的数量匹配限制 

--connlimit-above n : 连接数量大于n;一般要拒绝(默认处理策略为允许时候使用)

                --connlimit-upto n :连接的数据小于等于n;一般要允许 (默认处理策略为拒绝时使用)


        6、limit扩展 : 基于收发报文的速率做检测的    

            基于令牌桶过滤器来作速率检测的

             --limit rate[/second | /minute | /hour | /day] :速率 

             --limit-burst n : 峰值


        7、state扩展: 根据连接追踪机制检查连接的状态;记录连接是否曾经访问过,无关什么协议;

                  --state STATE1, STATE2,... :指定下列4种状态即可


        调整连接追踪功能所能够容纳的最大连接数量;

       /proc/sys/net/nf_conntrack_max  //注:这个数值在不得不启用连接追踪的情况,一定要调大些

       已经追踪到并记录下的连接

        /proc/net/nf_conntrack (连接追踪模板)    

              注:#modprobe nf_conntrack ==>让内核加载模块才可以使用连接追踪的功能  

       不同协议或连接类型追踪的时长

        /proc/sys/net/netfilter/   


       追踪的连接状态有4种

          NEW : 新发出的请求,连接追踪模板中不存在此连接相关的信息条目 

          ESTABLISHD :NEW状态之后,连接追踪模板中为其建立的条目在其建立的条目失效之前的连接状态

          RELATED :有关联的连接; 有ftp协议的命令连接和数据连接这类有关系的连接

          INVALIED : 无法识别的连接 

       注: 这种状态追踪的防火墙机制,能够防御反弹式***(只允许出去的报文状态是ESTABLISHED或RELATED,不允许为NEW)可以在一定程度上增强安全性,需要打开连接追踪的功能,而这种功能又在一定程度上会消耗资源并降低效率的;如果不得不使用的话,建议使用大的物理内存。


4.2处理动作:-j target 

   target: 

ACCEPT :允许

DROP :丢弃

REJECT :拒绝

MARK : 防火墙标记

RETURN : 返回调用链

REDIRECT : 端口重定向

DNAT : 目标地址转换

SNAT : 源地址转换

LOG : 记录日志

MASQUERADE  :伪装(主要用于地址转换)


示例1:允许tcp的22端口;

[root@puppetmaster ~]# iptables -t filter -A INPUT -d 172.16.116.250 -p tcp --dport 22 -j ACCEPT
[root@puppetmaster ~]# iptables -t filter -A OUTPUT -s 172.16.116.250 -p tcp --sport 22 -j ACCEPT
[root@puppetmaster ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 6 packets, 1838 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  145 10584 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.16.116.250       tcp dpt:22
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         
   23  2644 ACCEPT     tcp  --  *      *       172.16.116.250       0.0.0.0/0            tcp spt:22


示例2、修改所有filter表的链处理策略为DROP

[root@puppetmaster ~]# iptables -P INPUT DROP
[root@puppetmaster ~]# iptables -P FORWARD DROP
[root@puppetmaster ~]# iptables -P OUTPUT DROP


示例3、允许本机ping外部的主机

[root@puppetmaster ~]# iptables -A OUTPUT -s 172.16.116.250 -p icmp --icmp-type 8 -j ACCEPT
[root@puppetmaster ~]# iptables -A INPUT -d 172.16.116.250 -p icmp --icmp-type 0 -j ACCEPT
[root@puppetmaster ~]# ping 172.16.0.1
PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
64 bytes from 172.16.0.1: icmp_seq=53 ttl=64 time=2.57 ms
64 bytes from 172.16.0.1: icmp_seq=54 ttl=64 time=1.98 ms


示例4、显示扩展multiport应用:放行22、80端口;并删除上面示例1定义的规则 

[root@puppetmaster ~]# iptables -t filter -I INPUT -s 172.16.0.0/16 -d 172.16.116.250 -p tcp -m multiport --dports 22,80 -j ACCEPT
[root@puppetmaster ~]# iptables -t filter -I OUTPUT -d 172.16.0.0/16 -s 172.16.116.250 -p tcp -m multiport --sports 22,80 -j ACCEPT
[root@puppetmaster ~]# iptables -D INPUT 2   
[root@puppetmaster ~]# iptables -D OUTPUT 2   
[root@puppetmaster ~]# iptables -L -n -v
Chain INPUT (policy DROP 17 packets, 2696 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  394 28088 ACCEPT     tcp  --  *      *       172.16.0.0/16        172.16.116.250       multiport dports 22,80
    5   420 ACCEPT     icmp --  *      *       0.0.0.0/0            172.16.116.250       icmptype 0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  138 15120 ACCEPT     tcp  --  *      *       172.16.116.250       172.16.0.0/16        multiport sports 22,80
   70  5880 ACCEPT     icmp --  *      *       172.16.116.250       0.0.0.0/0            icmptype 8


示例5、修改示例4的规则,只允许172.16.116.1-172.16.116.250地址范围的主机访问;放行22,23,80端口

# iptables -R INPUT 1 -d 172.16.116.250 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.116.1-172.16.116.250 -j ACCEPT
# iptables -R OUTPUT 1-s 172.16.116.250 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.116.1-172.16.116.250 -j ACCEPT


示例6:禁止访问含有指定字符串‘bad’的网页 

# vim /var/www/html/test.html   
<h1>this is a bad test.</h1>
[root@puppetmaster ~]# iptables -I OUTPUT -m string --algo kmp --string 'bad' -j REJECT
[root@puppetmaster ~]# iptables -L -n -v
Chain INPUT (policy DROP 30 packets, 6450 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1632  149K ACCEPT     tcp  --  *      *       172.16.0.0/16        172.16.116.250       multiport dports 22,23,80
    5   420 ACCEPT     icmp --  *      *       0.0.0.0/0            172.16.116.250       icmptype 0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   40 15464 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "bad" ALGO name kmp TO 65535 reject-with icmp-port-unreachable
 1063  179K ACCEPT     tcp  --  *      *       172.16.116.250       172.16.0.0/16        multiport sports 22,23,80
   70  5880 ACCEPT     icmp --  *      *       172.16.116.250       0.0.0.0/0            icmptype 8


示例7 :禁止用户访问80端口的web服务,处于测试,全天都不允许

[root@puppetmaster ~]# iptables -I INPUT -d 172.16.116.250 -p tcp --dport 80 -m time --timestart 00:00 --timestop 23:59 -j REJECT


示例8 : 限制22端口的访问;即同一ip地址最多连接为3个

[root@puppetmaster ~]# iptables -I INPUT -d 172.16.116.250 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
[root@puppetmaster ~]# iptables -L -n -v
Chain INPUT (policy DROP 69 packets, 11013 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   152 REJECT     tcp  --  *      *       0.0.0.0/0            172.16.116.250       tcp dpt:22 #conn src/32 > 3 reject-with icmp-port-unreachable

wKiom1ZHVYmz1KxdAAAr8JA2ly8034.png

示例9:使用state状态追踪机制进行iptables的相关配置;简单配置

[root@puppetmaster ~]# iptables -A INPUT -p tcp -m multiport --dports 21:23,80 -m state --state NEW -j ACCEPT
[root@puppetmaster ~]# iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
[root@puppetmaster ~]# iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
[root@puppetmaster ~]# iptables -L -n -v
Chain INPUT (policy DROP 119 packets, 19174 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  578 41931 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    2   104 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 21:23,80 state NEW
    1    60 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 state NEW
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  961  102K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED


五、如何开放被动模式的ftp服务??实现过程

5.1、 装载ftp追踪时的专用模块

     手动装载模块 modprobe nf_conntrack_ftp

     注:centos6上,如果想启动iptables服务的时候自动装载ftp模块,

     需修改 /etc/sysconfig/iptables-config文件中的IPTABLES_MODULES="nf_conntrack_ftp" ;

     如果有多个模块需要装载,模块之间用空格分开即可

5.2、 放行请求报文

命令连接: 状态:NEW, ESTABLISHED

[root@puppetmaster ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
[root@puppetmaster ~]# iptables -A INPUT -p tcp -m multiport --dports 21:23,80 -m state --state NEW -j ACCEPT

数据连接: 状态: RELATED

[root@puppetmaster ~]# iptables -A INPUT -m state --state RELATED -j ACCEPT

5.3、放行响应报文

状态:ESTABLISHED

[root@puppetmaster ~]# iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT

wKiom1ZHVJHgqWB-AAA6ujEIQ68696.png

到此,iptables防火墙的基础介绍完毕~~ O(∩_∩)O!!!