zoukankan      html  css  js  c++  java
  • linux iptables规则介绍

    今天又学习了一下iptables,做一点总结来方便以后查阅。

    Netfilter(网络过滤器)是Linux操作系统核心层内部的一个数据包处理模块,主要负责数据包的拦截和转发,而iptables是NetFilter的一种应用化,为了方便定义规则和配置。

    iptables工作在linux的内核空间,它通过内核空间的接口与用户空间通信,控制数据包在内核空间上的接口(就是经常说到的port)之间转发。

    这是一条典型的iptables的配置语句,我从这里开始发散思维:

     iptables -t nat -A PREROUTING -d 172.30.1.8 -p tcp --dport 80 -j DNAT --to-destination 192.168.9.25
    

     这条语句的功能是:在PREROUTING链的nat表上添加一条规则将来自172.30.1.8的80端口的请求转发到192.168.9.25。

    语句指定了七个部分:链,表,源,目的,协议,端口和动作,我就从之七个方面分别记录。

    1、链(chain)

    iptables共有五个规则链:   

            1.INPUT (数据包流入内核空间)      
            2.OUTPUT(数据包流出内核空间)
            3.FORWARD (数据包在port之间的转发)
        4.PREROUTING (目的地址转换)
            5.POSTROUTING(源地址转换)
    其中PREROUTING和POSTROUTING分别对应着目的地址转换(DNAT)和源地址转换(SNAT),我的理解是,网卡是一个物理设备,在系统之外的层次,数据包的流入流出都需要通过网卡,路由是发生在内核空间,在数据包通过网卡而未到达内核中的这一段时间,由POSTROUTING来定义。而在数据包通过了内核而未到达网卡的这一段时间,由PREROUTING来定义。简单来说,数据包上记录着数据的源地址和目的地址,PREROUTING链记录了数据包的目的地址的修改,而POSTROUTING链记录了数据包原地址的修改,数据包在内核会先经过路由表的路由,路由之后在经过iptables的处理,处理后新的数据包再进行转发。因为,我认为从某种意义上来说,iptables的PREROUTING和POSTROUTING也可以简单的看成修改数据包的源地址和目的地址。
    每一条规则在链中的匹配原则是从上到下
    链的选项:
      -P chain :设置链的默认策略
         -A chain :在链的最后新增一个规则
       -F  chain:清除链的所有规则
       -N chain: 支持用户新建一个链
         -X chain: 用于删除用户自定义的空链,删除链之前需要将链清空
         -E chain newchain: 用来给用户自定义的链重命名
         -I chain num: 将当前规则插入为指定链的第几条
         -R chain num:修改指定链的第几条规则
         -D chain num:删除指定链的第几条规则
    示例:
     清空或删除规则:(必须同时指定表和链
    iptables -F PREROUTING -t nat
    iptables -D POSTROUTING 1 -t nat
    
        
    2、表(table)
      表有什么存在的意义?  难道仅仅是方便管理和查看?目前常用的表有三个,filter用来定义允许或不允许,nat用来定义地址转换,mangle用来修改报文原数据。
        -t table: 匹配表,不指定则默认适用于所有表
     
    3、源
      -s address:指定源地址
    4、目的
     -d address:指定目的地址
     
    5、协议
      -p proto:匹配协议
      匹配的协议有三种,tcp、udp和icmp。其中icmp是ping的协议,iptables允许ping的语句:
    iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
    

    6、端口

    --sport num: 指定源端口

    --dport num: 指定目的端口

    --dport XX-XX:指定多个端口,不能指定多个非连续端口

    -m  --dports 21,23,80:表示启用多端口扩展,可以指定多个非连续端口

    开放服务器的3306和90端口:

    iptables -A INPUT  -p tcp -m multiport  --dport 3306,90 -j ACCEPT
    iptables -A OUTPUT  -p tcp -m multiport  --sport 3306,90 -j ACCEPT
    

     7、动作

    -j ACTION: 对数据包的处理

    常见的ACTION:

       DROP:丢弃
         REJECT:拒绝
         ACCEPT:接受
         custom_chain:转向一个自定义的链
         DNAT:目的地址转换
         SNAT:源地址转换
         MASQUERADE:源地址伪装,改写数据包来源 IP 为防火墙 NIC IP
         REDIRECT:重定向,主要用于实现端口重定向
         MARK:打防火墙标记
         RETURN:返回
         LOG:记录数据包信息
     
      示例:
    将90端口重定向到80端口:
    iptables -I PREROUTING 1  -t nat -p tcp --dport 90 -j REDIRECT --to-ports 80
    

    将通过端口79-80的数据包改写源 IP:

    iptables -A POSTROUTING -t nat -p tcp  -j MASQUERADE --to-ports 79-81
    

     将的80端口重定向到百度:

    iptables -A PREROUTING -t nat -p tcp -d 119.29.23.152 --dport 80 -j DNAT --to-destination 14.215.177.38:80
    iptables -A postrouting -t nat -p tcp -d 14.215.177.38 --dport 80 -j SNAT --to-source 119.29.23.152 
    echo 1 > /proc/sys/net/ipv4/ip_forward   #开启服务器的转发功能
    

     还有一些其他的匹配选项:

        -i eth0:从eth0网卡流入的数据包
        -o eth0:从eth0网卡流出的数据包

    简单的iptables规则基本介绍完了,下面是查看命令:

    iptables -L  -n     #以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名
    iptables -L  -v     #显示详细信息
    iptables -L  -vv
    iptables -L  -vvv  #越多越详细
    iptables -L  -x     #在计数器上显示精确值,不做单位换算
    iptables -L  --line-numbers    #显示规则的行号
    iptables -L  -t nat     #显示nat表所有的信息
    

    另外,我们在终端编辑的iptables规则只是临时生效,要想在服务器重启后还能生效,需要将规则保存在配置文件/etc/sysconfig/iptables中,并且etc/sysconfig/iptables中的规则都是永久生效的。执行service iptables save命令,会使当前定义的规则保存到/etc/sysconfig/iptables中。若想将当前规则备份起来,备份iptabales规则命令是iptables-save > /etc/sysconfig/iptables.bak。若想要使用自己写的iptables配置文件或者手动加载备份的iptables配置文件,使用iptables-restore < /etc/sysconfig/iptables.bak命令。

    才开始写博客,文采不好思维凌乱格局纠结分类糟糕,如有错误的地方,或者有什么提高的地方,欢迎批评指正。另外,现在的我肯定对技术了解不深,今后有什么完善的地方,我会对博客进行补充的。

        
      
         参考网址:http://blog.rekfan.com/articles/237.html
           http://blog.chinaunix.net/uid-22780578-id-3346350.html
                       
  • 相关阅读:
    Android画图最基本的三个对象(Color,Paint,Canvas)
    搭建Android开发环境之旅
    对象序列化与反序列化
    JUnit 3.8 演示递归删除文件目录的 测试类程序 .
    JUnit 3.8 让所有测试程序 实现 复合的测试(TestSuite)
    JUnit 3.8 通过反射测试私有方法
    Java NIO
    Java泛型 类型变量的限定
    组织领导层在信息化建设中须要解决的问题
    bootstrap之鼠标操作
  • 原文地址:https://www.cnblogs.com/nat-zhu/p/6839014.html
Copyright © 2011-2022 走看看