Linux进阶——iptables

  netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

iptabels基础

Netfilter组件

  • Ø内核空间,集成在linux内核中
  • Ø扩展各种网络服务的结构化底层框架
  • Ø内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、 FORWARD、PREROUTING、POSTROUTING而这五个hook function 向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
  • Ø由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则 被分组放在链(chain)上

三种报文流向

  • Ø流入本机:PREROUTING --> INPUT-->用户空间进程
  • Ø流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
  • Ø转发:PREROUTING --> FORWARD --> POSTROUTING

四表五链

  filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包

  nat表:network address translation 地址转换规则表

  mangle:修改数据标记位规则表

  raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度

规则链:

  1.INPUT——进来的数据包应用此规则链中的策略

  2.OUTPUT——外出的数据包应用此规则链中的策略

  3.FORWARD——转发数据包时应用此规则链中的策略

  4.PREROUTING——对数据包作路由选择前应用此链中的规则

    (记住!所有的数据包进来的时侯都先由这个链处理)

  5.POSTROUTING——对数据包作路由选择后应用此链中的规则

    (所有的数据包出来的时侯都先由这个链处理)

 

链表关系图

 

 

 

报文流入过滤匹配过程

 

 


内核中数据包的传输过程

  • Ø 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的 IP判断是否需要转送出去
  • Ø 如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包 到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些 数据包经过OUTPUT链,然后到达POSTROUTING链输出
  • Ø 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过 FORWARD链,然后到达POSTROUTING链输出

规则表之间的优先顺序:

  Raw——mangle——nat——filter

Iptables语法

规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动 作作出处理

  • Ø 匹配条件:默认为与条件,同时满足

      基本匹配:IP,端口,TCP的Flags(SYN,ACK等)

      扩展匹配:通过复杂高级功能匹配

  • Ø处理动作:称为target,跳转目标

      内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...

      自定义处理动作:自定义chain,利用分类管理复杂情形

          规则要添加在链上,才生效;添加在自定义上不会自动生效  

    链chain:

      内置链:每个内置链对应于一个钩子函数

      自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;

        只有 Hook钩子调用自定义链时,才生效

iptables命令的管理控制选项

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]-+ 

-t 不写默认为默认为filter;其它可用的有raw, mangle, nat;

iptables命令选项

-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
  
-n:numeric,以数值格式显示;
  -v:verbose,显示详细格式信息;
  -vv, -vvv
  -x:exactly,计数器的精确结果;
  --line-numbers:显示链中的规则编号;
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)
-P策略,定义默认策略

防火墙处理数据包的四种方式

ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

iptables防火墙规则的保存与恢复

iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载

使用命令iptables-save来保存规则。一般用

iptables-save > /etc/sysconfig/iptables

生成保存规则的文件 /etc/sysconfig/iptables,

也可以用

service iptables save

它能把规则自动保存在/etc/sysconfig/iptables中。

当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

匹配条件:

多重条件:逻辑关系为“与”;

基本匹配条件:!表示可取反,基本条件若不写则默认为最大值
  [!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;

  [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
  [!] -p, --protocol protocol:
    protocol:{tcp|udp|icmp}
  [!] -i, --in-interface name:数据报文的流入接口;INPUT, FORWARD and PREROUTING
  [!] -o, --out-interface name:数据报文的流出接口; FORWARD, OUTPUT and POSTROUTING

 


扩展匹配条件
  隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;
    -p tcp:隐含了-m tcp;
    [!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
    [!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
    [!] --tcp-flags mask comp
      mask:要检查的标志位列表,以逗号分隔;
      comp:必须为1的标志位列表,余下的出现在mask列表中的标志位则必须为0;
    --tcp-flags SYN,ACK,FIN,RST SYN
    [!] --syn:
      相当于--tcp-flags SYN,ACK,FIN,RST SYN
    -p udp:隐含了-m udp:
    [!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
    [!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
    -p icmp:隐含了-m icmp:
      [!] --icmp-type {type[/code]|typename}
      8:echo-request
      0:echo-reply

显式扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;

常用的iptables规则

在iptables规则中没有匹配到规则则使用默认规则进行处理

  iptables -P INPUT DROP
  iptables -P OUTPUT ACCEPT
  iptables -P FORWARD DROP

配置SSH规则

  iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

  如果你把OUTPUT 设置成DROP,就需要加上这个规则,否则SSH还是不能登录,因为SSH服务职能进不能出。

只允许192.168.0.3的机器进行SSH连接

  iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT

如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.

允许loopback回环通信

  IPTABLES -A INPUT -i lo -p all -j ACCEPT
  IPTABLES -A OUTPUT -o lo -p all -j ACCEPT

目的地址转换,映射内部地址

  iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.2:80
  iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.1-192.168.0.10

源地址转换,隐藏内部地址

  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10

地址伪装,动态ip的NAT

  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

masquerade和snat的主要区别在于,snat是把源地址转换为固定的IP地址或者是地址池,而masquerade在adsl等方式拨号上网时候非常有用,因为是拨号上网所以网卡的外网IP经常变化,这样在进行地址转换的时候就要在每次都要修改转换策略里面的ip,使用masquerade就很好的解决了这个问题,他会自己去探测外网卡获得的ip地址然后自动进行地址转换,这样就算外网获得的ip经常变化也不用人工干预了。

开启转发功能

  iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 只允许已建连接及相关链接对内转发
  iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 允许对外转发

过滤某个MAC

  iptables -A FORWARD -m mac --mac -source MAC地址 -j DROP

报文经过路由后,数据包中原有的MAC信息会被替换,所以在路由后的iptables中使用mac匹配没有意义。

数据包整流

  iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
  iptables -A FORWARD -d 192.168.0.1 -j DROP

多端口匹配

  iptables -A INPUT -p tcp -m muliport --dport s 21,22,25,80,110 -j ACCEPT

丢弃非法连接

  iptables -A INPUT -m state --state INVALID -j DROP
  iptables -A OUTPUT -m state --state INVALID -j DROP
  iptables-A FORWARD -m state --state INVALID -j DROP

存储于恢复iptables规则

  iptables-save > somefile
  iptables-restore < somefile

 

posted @ 2018-11-07 10:32  正在来的4号  阅读(139)  评论(0编辑  收藏  举报