先说说数据包表头的基本组成:

请求首部/[响应首部] --- 源端口/目标端口 --- 源IP/目标IP ---  源MAC/目标MAC

iptables 是利用封包过滤的机制, 他会分析封包的表头数据。根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃.

iptables 里面有多个表格 (table) ,每个表格都定义出自己的默认政策与规则,且每个表格的用途都不相同。

Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。另外我们还可以自定义额外的链

filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table !
   INPUT:主要与想要进入我们 Linux 本机的封包有关;
   OUTPUT:主要与我们 Linux 本机所要送出的封包有关;
   FORWARD: 他可以『转递封包』到后端的计算机中,与 nat table 相关性较高。

nat (地址转换):这个表格主要在进行来源与目的 IP 或 port 的转换,主要于Linux 主机后的局域网络内计算机较有相关。
   PREROUTING:在进行路由判断之前所要进行的规则(DNAT --> 目标地址转换)。
   POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)--> 源地址转换
   OUTPUT:与发送出去的封包有关

mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关,把数据包首部拆开,修改修改再包装  主要包含 PREOUTING, INPUT,OUTPUT,FORWARD,POSTROUTING,较少使用。

raw    : 主要包含PREOUTING , OUTPUT
优先级: 高--> 低 raw-->mangle-->net -->filter

分类:
  包过滤开型防火墙  --> 效率高,根据tcp首部或ip首部数据进行判断
      (1)简单包过滤  tcp,ip
      (2)带状态检测的包过滤
            NEW                新连接        只有SYN=1
            ESTABLISHED        数据传送
            INVALID            非法的状态
            RELATED            数据连接和命令连接相关连的数据传输
  应用层网关防火墙    --> 效率低,主要根据数据包传输的实际数据进行判断
  

命令用法及相关参数
 #  iptable [-t TABLE] COMMAND  CHAIN  [creteria]  -j  ACTION 
               ^        ^        ^        ^              ^
              表       命令      链      匹配条件        动作

  -t  [raw|mangle|nat|filter]  ,默认filter
   链大写,表小写
   -j : 跳转
 

COMMAND:
   规则管理类
  -A    -->  append (添加)  #  iptables  -A  INPUT  -s 192.168.0.2/24  -d 172.16.45.1  -j  ACCEPT
  -I  #   --> insert    (插入)   #  iptables  -I  OUTPUT     2  -d 172.16.45.1  -p tcp --dport  80  -j  ACCERT
  -D  #   -->  delet    (删除)     #  iptables  -D  INPUT  3
  -R  #   --> 替换(编辑)         #  iptables  -R  OUTPUT  -p tcp --dport  80  -j  DROP
  链接管理类
  -F     --> flush(清空链)                # iptables  -F
  -N     --> new,(新建链)通过跳转实现        # iptables -N clear_in        
  -X     --> delete(只能删除自定义的空链)
  -E     --> rename(重命名)
                            

默认策略
  -P     --> policy                # iptables  -P OUTPUT  DROP
计数器
  -Z     --> zero(清空计数器)
                每条规则(包括默认策略)都有两个计数器;
                   被此规则匹配到的所有数据包的个数
                   被此规则匹配到的数据包的大小
 查看类
   -L    --> list
   -n    --> numeric            不进行 IP 与 HOSTNAME 的反查
   -v    --> verbose(详细信息)
       -vv
       -vvv                       # iptables -L -n -vv
   -x    --> exactly(精确值)
   --line-numbers  (行号)   

清除本机防火墙 (filter) 的所有规则,但不会清除默认策略
       # iptables -F
       # iptables -X
       # iptables -Z
    

creteria     -->    匹配条件
基本匹配
   -s   --> SOURCE: IP, NETWORK
   -d   --> (目标地址)
   -p   --> 协议{tcp|udp|icmp}
   -i  INTEFACE  -->数据从哪个接口进来    只能用于INPUT ,FORWARD ,PREROUTING        # iptables -A  INPUT  -i lo  -j  ACCEPT 
   -o   OUTFACE  -->流出接口    只能用于 OUPUT ,FORWARD , POSTROUTING 

扩展匹配:(调用iptables 的模块,以便扩展iptables的匹配功能 -m)
     -m    
   隐含扩展: --> -m可省略
      -p    tcp
          --sport      PORT   -->     20:80    表示20到80端口
          --dport      PORT          # iptables -A INPUT  -p tcp --dport  22  -j ACCEPT
          --tcp-flags  ACK,SYN,RST,FIN   SYN,ACK       第一个列表是要检查的标志位 ,出现在第二个列表中的标志位要为1,没出现的要为0
          --tcp-flags  等同于  --syn    默认为SYN ,ACK,RST,FIN    SYN
                  # iptables -A INPUT ! --syn -p tcp -m state NEW -j DROP
      -p udp
          --sport    PORT
          --dport    PORT
      -p icmp
          --icmp-type   -->主要用于ping命令
              8: echo-request  --> ping 请求     # iptables -A INPUT -p icmp -d 255.255.255.255 -j DROP
              0: echo-reply    --> ping 响应

   显式扩展    -->必须要指定-m
      -m  state          --> 状态检测
          --state  NEW,[NEW,ESTABLISHE,INVAI,RELATED]
             # iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
            
     -m multiport        -->多端口合并
         --source-ports [!] port[,port[,port:port...]]

         --destination-ports [!] port[,port[,port:port...]]

         --ports [!] port[,port[,port:port...]]           
         eg: # iptables -R INPUT 2  -d 192.168.0.2 -p tcp  -m state --state NEW -m multiport --destination-ports 22,53,80 -j ACCEPT
            
     -m  iprange       --> 指定ip范围
           [!]--src-range ip-ip

           [!]--dst-range ip-ip

        eg:# iptables -A INPUT -m iprange --src-range 172.16.100.190-172.16.100.210 -d 172.16.45.1 -p --dport 23 -m state --state NEW -j ACCEPT
    -m -connlimit         限定来自同一ip的最大连接数
           [!] --connlimit-above n

           --connlimit-mask bits
                 # iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT        --> 超过2个就拒绝,否则就使用默认规则(ACEEPT)

                 # iptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT    -->不超过2个就接受,否则就使用默认规则(DROP)

        # limit the nr of parallel http requests to 16 per class C sized network (24 bit netmask)
           iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
    -m limit      -->限定匹配到的数据包的个数
           --limit  rate       -->  # eg: 3/hour   5/minite
           --limit-burst  number    峰值速率(并非使用所有空的令牌)
         eg: # iptables -A INPUT -d 172.16.45.1 -p tcp --dport 80 -m state --state NEW -m limit  --limit 1/second  --limit-burst 3 -j ACCEPT
              对web服务限制 每秒发起的新请求为1个,最多可以同时发起3个, 可以把keepAlive关闭测试效果
             # iptables -A FORWARD -d 192.168.100.2 -p icmp --icmp-type 8 -m limit --limit 3/second --limit-burst 3 -m state --state NEW -j ACCEPT
    -m string
           --algo  bm|kmp        (bm=Boyer-Moore,kmp=Knuth-Pratt-m    -->编码方式)
           --string  "STRING"         指定页面中包含“string”
                      # iptables -A OUTPUT  -d 172.16.45.1  -p tcp --dport 80 -m string --algo bm --string "magedu" -j REJECT
     -m time
           --timestart  value 
           ----timestop  value
           --days listofdays  

 

-j        处理法则 
         ACCEPT   --> 接受
         DROP     --> 拒绝(悄悄丢弃,不响应)
          REJECT  --> 拒绝(此路不通--踩两脚,再吐两口)


      
过滤非正常的请求:               
     # ipatbles -A INPUT ! --syn -p tcp -m state --state NEW -j DROP
     # iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
     # iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
     # iptables -A INPUT -p icmp -d 255.255.255.255 -j DROP
     # iptables -A IPNUT -p icmp -d 192.168.0.255  -j DROP
 

地址转换
     -j SNAT 
        --to-source  192.168.100.1            用于外网地址是固定的ip
                # iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source  192.168.100.1
     -j  MASQUERADE (地址伪装)  主要用于ADSL连接方式上网的方式,比SNAT会消耗更多的资源
               
     -j DNAT
        --to-destination  192.168.100.2[:PORT]
  
     # iptables -t nat  -A PRETROUTING  -d 172.16.100.1  -p tcp --dport 80 -j DNAT  --to-destination 192.168.100.2
     # iptables -t nat  -A PRETROUTING  -d 172.16.100.1  -p tcp --dport 80 -j DNAT  --to-destination 192.168.100.2:8080
     -j LOG            日志记录
        --log-prefix  "DNAT for web:"        -->/var/log/messages
             # iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -j LOG --log-prefix "DNAT for web"
             # iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -j DROP
             # iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --dport 80 -m limit --limit 3/minite --limit-burst 3 -j LOG --log-prefix "DNAT For Web"