Iptables linux防火墙

前言:iptable基于内存的防火墙,添加规则后临时保存生效,机器重启后则失效;

          添加规则后注意保存 :
     iptables规则配置保存:
  (1) 方法一:
    # service iptables save
  (2) 方法二:
    # iptables-save > /etc/sysconfig/iptables

注意:iptables-save是连在一起的,是一个命令,不是参数;
        iptables-save 仅仅是列出当前设置,并不是将配置保存


 

 

 

    历史介绍: linux 内核2.0     RedHat 5.1       ipfwadmin
                            linux 内核2.2     RedHat 7.x       ipchains
                            linux 内核2.4     RedHat 9.x       iptables
                                                        centos 7           firewall

 
其实linux内核中运行的是 netfilter,用户通过iptables命令来调用 netfilter。
 
 
         iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙。
        首先介绍iptables的结构:
          iptables -> Tables -> Chains -> Rules.
简单地讲,tables由chains组成,而chains又由rules组成。
 
        如果把linux当做网络防火墙的话,需要在执行iptables  之前激活ip数据包的转发功能。
因为普通的主机只能处理目标地址为自己的单播数据包,而防火墙需要把符合规则的、且目标地址为其他的机器的数据包进行转发,这样必须激活ip的转发功能(路由功能),激活命令|
    echo"1">/proc/sys/net/ipv4/ip_forward      此命令一次有效 
   编辑 /etc/sysctl.conf    设置net.ipv4.ip_forward=1    执行命令  #sysctl -p      永久生效
 
 
一、iptables的表与链
iptables具有Filter, NAT, Mangle, Raw四种内建表:
1. Filter表(过滤)
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
INPUT链 – 处理来自外部的数据。
OUTPUT链 – 处理向外发送的数据。
FORWARD链 – 将数据转发到本机的其他网卡设备上。

2. NAT表
NAT表有三种内建链:
PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链 – 处理本机产生的数据包。

3. Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING


4. Raw表
Raw表用于处理异常,它具有2个内建链:
PREROUTING chain
OUTPUT chain
 
Iptables linux防火墙 - 朝鲜程序员 - 朝鲜程序员的博客
Iptables linux防火墙 - 朝鲜程序员 - 朝鲜程序员的博客
 
 
 

 iptables定义规则的方式比较复杂:
 格式:
      iptables [-t table]  COMMAND chain [match]  [-j  ACTION]
Iptables linux防火墙 - 朝鲜程序员 - 朝鲜程序员的博客
                                           A增加 D删除 R替换   -p 协议   
                                           I插入   L列表      -s源地址 -d 目的地址
                                            F清除所有                   -i进入网卡
                                            X清除用户的              -o流出网卡
                                            Z统计归零         
--sport源端口   --dport 目的端口 
                                    N 新建链   P内置链策略
                                               E链改名
 
 
-t table :3个filter nat mangle  省略即默认为 filter表
 COMMAND:执行的命令
 chain:指定操作的链,当定义策略的时候,是可以省略的
 match :指定匹配模板
 -j ACTION :指定如何进行处理
 
 
 
详解COMMAND:
1.链管理命令(这都是立即生效的)
         -P :设置默认策略的(设定默认门是关着的还是开着的,只试用于内置链)
                      默认策略一般只有两种
                iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的
                            比如:
                             iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,                                                                         所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
        -F: FLASH,清空规则链的(注意每个链的管理权限)
                           iptables -t nat -F PREROUTING
                           iptables -t nat -F 清空nat表的所有链
        -N:NEW 支持用户新建一个链
            iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
        -X: 用于删除用户自定义的空链
            使用方法跟-N相同,但是在删除之前必须要将里面的链给清空了
            只能删除用户自定义的链
        -E:用来Rename chain主要是用来给用户自定义的链重命名
            -E oldname newname   只更改名字  不影响规则
        -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
            iptables -Z :清空
 
2.规则管理命令
         -A:追加,在当前链的最后新增一个规则
                               iptables -A INPUT -j ACCEPT    向默认(filter表)追加一条
                  -I num : 插入,把当前规则插入为第几条。其它规则依次向后移
                               iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT 
                 -R num:Replays替换/修改第几条规则
                                格式:iptables -R 3 …………
                 -D num:删除,明确指定删除第几条规则
                              iptables -D INPUT -p tcp --dport 80 -j DROP   完整
                              iptables -D INPUT 1                                            简洁
        
3.查看管理命令 “-L”
   iptables [-t 表] -L 
 附加子命令:
 -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
 -v:显示详细信息
 -vv
 -vvv :越多越详细
 -x:在计数器上显示精确值,不做单位换算
 --line-numbers : 显示规则的行号
 -t nat:显示所有的关卡的信息
 
 
四:详解匹配(match)标准
 
1.通用匹配:源地址目标地址的匹配
 -s:源ip 指定作为源地址匹配,这里不能指定主机名称,必须是IP
                              IP | IP/MASK | 0.0.0.0/0.0.0.0     而且地址可以取反,加一个“!”表示除了哪个IP之外
                            iptables -A INPUT -s 192.168.1.1 -j ACCEPT
                                                            -s 192.168.1.0/24
                                                           
-s ! 192.168.1.1
                -d:目的ip 表示匹配目标地址
                            iptables -A INPUT -d 10.0.0.2
                
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
                            iptables -A INPUT -p tcp|udp|
icmp -j ACCEPT
                                                            -p ! tcp 
                                                            -p all
                 -i eth0: 指定数据包进入的网卡,流入一般用在INPUT和PREROUTING上
                                 -i 只能用在input  forward  prerouting链上
                            iptables -A INPUT -i eth0 -j ACCEPT
                                                            -i eth+ 
                                                            -i ! eth0
                -o eth0:从这块网卡流出的数据   流出一般在OUTPUT和POSTROUTING上
                                -o 只能用在output  forward  prerouting链上   
                              iptables -A FORWARD -o eth0 -j ACCEPT                  
        
2.扩展匹配
2.1隐含扩展:对协议的扩展
    -p tcp :TCP协议的扩展。一般有三种扩展
 --dport: XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
         --dport 21  或者 --dport 21-23 (此时表示21,22,23)  或  --dport ! 21
 --sport:指定源端口
 --tcp-fiags:TCP的标志位(SYN同步,ACK确认,FIN结束,PSH强推,RST重置,URG紧急)
    对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
iptables -A INPUT -p tcp --tcpflags syn,ack,fin,rst syn  
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的                 第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
                 --tcpflags syn,ack,fin,rst syn   =    --syn
    -p udp:UDP协议的扩展
        --dport
       --sport
    -p icmp:icmp数据报文的扩展
        --icmp-type
             iptables -A -p icmp --icmp-type 8 -j ACCEPT
echo-request(请求回显),   用8来表示   --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)用0来表示   --icmp-type 0
                  
2.2显式扩展(-m)
     扩展各种模块
      -m multiport:表示启用多端口扩展
          --port  接受源端口号和目的端口号都为为20,21,80,110的连接
                   iptables -A INPUT -p tcp -m multiport --port 20,21,80,110 -j ACCEPT
          --destination-port  接受目的端口号为20,21,80,110的连接:
                   iptables -A INPUT -p tcp -m multiport --destination-port 20,21,80,110 -j ACCEPT
          
--source-port        接受源端口号为20,21,80,110的连接:
                   iptables -A INPUT -p tcp -m multiport --source-port 20,21,80,110 -j ACCEPT
  
      
-m limit流量限制
           --limit          流量限制
          --limit-burst    触发条件
                   iptables -A INPUT -m limit --limit 3/m --limit-burst 5 -j ACCEPT
                   单位时间超过5个包后,触发 3个/每分钟 的限制
      -m mac --mac-source : mac地址限制 不能用在output和postrouting链上
                   iptables -A INPUT -m mac --mac-source 00:60:X:X:X -j DROP
                   拒绝源mac为xx的主机数据
      -m owner --uid-owner :匹配本机特定用户发送的数据包  只能用在output链
                                      iptables -A OUTPUT -m owner --uid-owner 1000 -j DROP
                                      拒绝本机中uid为1000的用户发出的数据包
                             
 --gid-owner :匹配本机特定用户组发送的数据包  只能用在output链
                                      iptables -A OUTPUT -m owner --uid-owner 1000 -j DROP
                                      拒绝本机中uid为1000的用户组发出的数据包
          -m state --state :匹配连接状态
                                    iptables -A INPUT -m state --state RELATED.ESTABLISHED -j ACCEPT 
                                   接受连接状态为……的数据包(允许已建立的连接进入本机)

五 详解-j ACTION
 
 常用的ACTION:
 -j DROP:     悄悄丢弃   一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
 -j REJECT: 明示拒绝
                     iptables -A INPUT -s 10.0.0.2 -p tcp --dport 80 -j REJECT --reject-with icmp-proto-unreachable
                     拒绝源地址为10.0.0.2 访问80的数据包 并回应拒绝理由
 -j ACCEPT:接受
 -j REDIRECT:重定向:主要用于实现端口重定向 完成后 继续匹配其它规则
 -j 
MASQUERADE:源地址伪装  可将源ip改为防火墙ip  一般用在linux做网关 代理局域网内电脑上网
 -j LOG 符合匹配的信息记录在日志,此步骤完成后会继续匹配其它规则
              iptables -A INPUT -p tcp -j LOG --log-prefix "my INPUT packets"
 -j SNAT  将符合匹配的数据包源ip 改写为某个特定ip(或ip范围) 完成后跳往先一个规则链 还可设置端口
 -j DNAT  将符合匹配的数据包目的ip 改写为某个特定ip(或ip范围) 完成后跳往先一个规则链 可设置端口
 -j MIRROR  数据包镜射 将包的源ip与目的ip对调 又将该包返回 处理完后 中断过滤
             iptables -A INPUT -p tcp --dport 80 -j MIRROR   (此功能redhat9中加入,RHEL4.0需冲边内核)
             其它主机访问80时 最终访问的是自己的80端口
 -j RETURN:返回  结束当前链的处理 返回调用该链的规则继续处理

 -j MARK:打防火墙标记的  将符合规则的数据包打上标记 作为后续过滤的条件 完成后会继续匹配其它规则
             iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1


六 nat表应用
   这个nat表实现的功能和 思科ios等等的nat功能非常相似
NAT表有三种内建链:
PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链 – 处理本机产生的数据包。

1.SNAT 
  
修改封包表头的『来源』项目,即修改源 ip。一般局域网内的内网机器 访问外网时 ,网关将数据包的源ip(内网地址)转换为网关ip(外网地址),再进行发送。
    iptables -t NAT -A POSTROUTING -s 10.0.7.0/24 -o eth2 -j SNAT --to-source 202.204.1.31
    
iptables -t NAT -A POSTROUTING -s 10.0.7.1 -o eth2 -j SNAT --to-source 202.204.1.31
    iptables -t NAT -A POSTROUTING -s 10.0.7.0/24 -o eth2 -j SNAT --to-source 202.204.1.31-202.204.1.35
          将数据包的源ip10段 转换为202.204.1.31 
     ip的转换可以是  多对一    一对一   多对多     多种映射
 
2.DNAT
修改数据包的目的ip地址,一般使用在 PREROUTING链上,
    iptables -t NAT -A PRETROUTING  -i eth2 -p tcp --dport 80 -j DNAT --to 10.0.0.2:80  
    
iptables -t NAT -A PRETROUTING  -i eth2 -p tcp --dport 21 -j DNAT --to 10.0.0.2:21
    iptables -t NAT -A PRETROUTING  -i eth2 -p tcp --dport 22 -j DNAT --to 10.0.0.2:22  
 开放内网的80 21 22 端口

 
 

 

posted @ 2017-10-10 21:55  乌托邦眺望  阅读(240)  评论(0编辑  收藏  举报