2016122402411349462.jpg  

Iptalbes的规则链:
   PREROUTING
   INPUT
   FORWARD
   OUTPUT
   POSTROUTING
Iptalbes的表    :
   filter(过滤):表
      INPUT
      OUTPUT
      FORWARD
   nat(地址转换):表
      PREROUTING
      OUTPUT
      POSTROUTING
   mangle(拆开、修改、封装):表
      PREROUTING
      INPUT
      FORWARD
      OUTPUT
      POSTROUTING
   raw():
      PREROUTING
      OUTPUT


1、iptables详解
   iptables [-t TABLE] COMMAND CHAIN [num] 匹配条件 -j 处理动作(target)

   命令:
      管理规则
         -A:附加一条规则,添加在链的尾部
         -I CHAIN [num]: 插入一条规则,插入为对应CHAIN上的第num条;
         -D CHAIN [num]: 删除指定链中的第num条规则;
         -R CHAIN [num]: 替换指定的规则;
      管理链:
         -F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
         -P CHAIN: 设定指定链的默认策略;
         -N:自定义一个新的空链
         -X: 删除一个自定义的空链
         -Z:置零指定链中所有规则的计数器;
         E: 重命名自定义的链;
      查看类:
         -L: 显示指定表中的规则;
            -n: 以数字格式显示主机地址和端口号;
            -v: 显示链及规则的详细信息
            -vv:
            -x: 显示计数器的精确值
            --line-numbers: 显示规则号码

   匹配条件
      通用匹配
         -s, --src: 指定源地址
         -d, --dst:指定目标地址
         -p {tcp|udp|icmp}:指定协议
         -i INTERFACE: 指定数据报文流入的接口可用于定义标准的链:PREROUTING,INPUT,FORWARD
         -o INTERFACE: 指定数据报文流出的接口可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
      扩展匹配
         隐含扩展
            -p tcp
            --sport PORT[-PORT]: 源端口
            --dport PORT[-PORT]: 目标端口
            --tcp-flags mask comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
               --tcp-flags SYN,FIN,ACK,RST SYN = --syn
               --syn
            -p icmp
               --icmp-type
               0: echo-reply        ping的回应
               8: echo-request   请求ping
            -p udp
               --sport
               --dport
            -p tcp --dport
         显式扩展: 使用额外的匹配机制
            -m EXTESTION --spe-opt
            state: 状态扩展
               结合ip_conntrack追踪会话的状态
                  NEW: 新连接请求
                  ESTABLISHED:已建立的连接
                  INVALID:非法连接
                  RELATED:相关联的
                  -m state --state NEW,ESTABLISHED -j ACCEPT

                  首先要装载ip_conntrack_ftp和ip_nat_ftp模块
                  iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
            multiport: 离散的多端口匹配扩展
               --source-ports
               --destination-ports
               --ports
               -m multiport --destination-ports 21,22,80 -j ACCEPT

   动作(target):
      ACCEPT:放行
      DROP:丢弃
      REJECT:拒绝
      DNAT:目标地址转换
      SNAT:源地址转换
      REDIRECT:端口重定向
      MASQUERADE:地址伪装
      LOG:日志
      MARK:打标记
2、iptables实例
   1)清理主机上的iptables , 重新配置 , 先设置INPUT , OUTPUT 为ACCEPT , 防止一iptables -F 阻挡了所有的链接 , 我们连ssh也连不上去操作

    #iptables -P INPUT ACCEPT
    #iptables -P OUTPUT ACCEPT
    #iptables -F


      注释 :用法iptables -P [CHAIN] [TARGET] 设定链的默认规则
          Iptables -F 是清除所有规则 , 只剩下默认链规则

   2)开放22的规则ssh , 192.168.1.0网段的ip本机的ip为10.0.0.9

      #iptables -t filter -A INPUT -s 192.168.1.0/24 -d 10.0.0.9 -p tcp --dport 22 -j ACCEPT
      #iptables -A OUPUT -s 10.0.0.9 -d 192.168.1.0/24    -p tcp --sport 22 -j ACCEPT


      注释 : INPUT和OUTPUT是对应 , 数据进行了就要进行相应 , 如果只开启一个的话 , 将无法访问。 -t filter 可以省略 , 默认为filter 表 , -s 或 -d 省略则表示为所有地址

      #iptables -P INPUT DROP
      #iptables -P OUTPUT DROP
      #iptables -P FORWARD DROP


      注释 :阻止所有端口访问 , 如果是远程操作 , 请先开发远程操作的端口

   3) 开放httpd服务

      # iptables -A INPUT -d 10.0.0.9 -p tcp --dport 80 -j ACCEPT
      # iptables -A OUTPUT -s 10.0.0.9 -p tcp --sport 80 -j ACCEPT



   4) 开放ftp服务

      #lsmod | grep  //查看ip_conntrack_ftp.ko , ip_nat.ko , ip_nat_ftp.ko是否加载
                            //如果没加载得预先加载
      #insmod /lib/modules/2.6.18-308.el5/kernel/net/ipv4/netfilter/ip_conntrack_ftp.ko
      #insmod /lib/modules/2.6.18-308.el5/kernel/net/ipv4/netfilter/ip_nat.ko
      #insmod /lib/modules/2.6.18-308.el5/kernel/net/ipv4/netfilter/ip_nat_ftp.ko
      #iptables -A INPUT -d 10.0.0.9 -p tcp --dport 21 -j ACCEPT
      #iptables -A OUTPUT -s 10.0.0.9 -p tcp --sport 21 -j ACCEPT
      #iptables -A INPUT -d 10.0.0.9 -m state --state ESTABLISHED,RELATED -j ACCEPT
      #iptables -A OUTPUT -s 10.0.0.9 -m state --state ESTABLISHED,RELATED -j ACCEPT


      注释 :-m state是指定状态 , --state 是状态 , ESTABLISHED是已经建立的链接 , RELATED保持的链接

   5)开启ping回环地址

      #iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
      #iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT


      注释 :-i是指定报文流入接口 , -o 是指定保温流出接口 , lo是回环接口

   6)允许ping别人的ip , 不允许ping自己

      #iptalbes -t filter -A OUTPUT -s 10.0.0.9 -p icmp --icmp-type 8 -j ACCEPT
      #iptables -t filter -A INPUT -d 10.0.0.9 -p icmp -icmp-type 0 -j ACCEPT



   7) 修改或者替换规则

      #iptables -L -line-numbers

         Chain INPUT (policy DROP)
         num  target     prot opt source         destination     
         1    ACCEPT     tcp  --  0.0.0.0/0      10.0.0.9      tcp dpt:22
         2    ACCEPT     tcp  --  0.0.0.0/0      10.0.0.9      tcp dpt:80
         Chain FORWARD (policy DROP)
         num  target     prot opt source         destination     

         Chain OUTPUT (policy DROP)
         num  target     prot opt source         destination     
         1    ACCEPT     tcp  --  10.0.0.9       0.0.0.0/0        tcp spt:22
         2    ACCEPT     tcp  --  10.0.0.9       0.0.0.0/0        tcp spt:80

      #iptables -D INPUT 2 //删除INPUT链中的第三条规则
      #iptables -R OUTPUT 2-s 10.0.0.9 -p tcp -sport 21 -j DROP   //修改OUTPUT链中第四条规则

   8) 过滤具有特殊字符的字符串 , 结合httpd实现

      #iptables -I OUTPUT -s 10.0.0.9 -m string --algo kmp --string "h7n9" -j REJECT



   9) 结合开启22端口 , 80 端口 ,ftp端口 外 , 防止其他的规则不给进入

      #iptables -P INPUT ACCEPT
      #iptables -P OUTPUT ACCEPT
      #iptables -F
      #iptables -A INPUT -d 10.0.0.9 -m state --state ESTABLISHED,RELATED -j ACCEPT
      #iptables -A INPUT -d 10.0.0.9 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
      #iptabels -A OUTPUT -s 10.0.0.9 -m state --state ESTABLISHED,RELATED -j ACCEPT //只要是已经建立或者保持的链接就放行
      #iptables -P INPUT DROP
      #iptables -P OUTPUT DROP
      #iptables -L -n


   10)开启22端口 , 80 端口 ,ftp端口 外 , 允许主机访问其他服务器

      #iptables -P INPUT ACCEPT
      #iptables -P OUTPUT ACCEPT
      #iptables -F
      #iptables -A INPUT -d 10.0.0.9 -m state --state ESTABLISHED,RELATED -j ACCEPT
      #iptables -A INPUT -d 10.0.0.9 -p tcp -m multiport -destination-ports 21,22,80 -m state --state NEW -j ACCEPT
      #iptables -P INPUT DROP

      注释:直接放通OUTPUT的数据 , 在INPUT中允许已经建立链接的数据进来

   11) 本例需要3台虚拟主机

    iptable_demo_2.png  
      1、设置A主机

         #iptables -F
         #vi /etc/sysctl.conf
         //将net.ipv4.ip_forward=1
         #sysctrl net.ipv4.ip_forward=1
         #ifconfig eth0 192.168.1.1
         #ifconfig eth1 10.0.0.1


      2、设置B主机

         #iptables F
         #ifconfig eth0 10.0.0.2
         #route del -net 0.0.0.0
         #route add default gw 10.0.0.1
         #ping 10.0.0.1
         #ping 192.168.1.1


      3、设置C主机

         #iptables F
         #ifconfig eth0 192.168.1.3
         #route del -net 0.0.0.0
         #route add default gw 192.168.1.1
         #ping 192.168.1.1
         #ping 10.0.0.1


      4、B主机操作

         #ping 192.168.1.3 //ping C主机看是否会通 , 如果通了就可以了
         #yum install httpd -y //安装httpd服务
         #service httpd start



      5、A主机操作 , 假设B主机是外网 , C主机是内网, C主机要通过 A 主机去访问外网B主机,首先我们要先把B主机的默认网关去掉(#route del -net 0.0.0.0)

         # iptables -t nat -P POSTROUTING DROP
         # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.0.0.1 (A主机的外网网卡)

         这样C主机就可以通过A主机访问外网B主机了
       
      6、设置A主机 , 只允许通过80 , 21 ,22端口出去访问

         #iptalbes -P FORWARD DROP
         #iptalbes -A FORWARD -m state --state ESTABLISHED,RElATED -j ACCEPT
         #iptalbse -A FORWARD -s 192.168.1.0/24 -tcp --dport 80 -m state --state NEW -j ACCEPT
         #iptabels -A FORWARD -s 192.168.1.0/24 -icmp --icmp-type 8 -m state --state NEW  -j ACCEPT
         #iptables -A FORWARD -s 192.168.1.0/25 -tcp --dsport 21 -m state --state NEW -j ACCEPT

版权声明:未经博主允许不得转载。http://smister.com/post-6/iptable_strategy.html