iptables 防火墙详解

iptables 概述

Linux 内核 2.4 版本以后,包过滤机制是 netfilter,管理防火墙规则的命令工具是 iptables

  • netfilter  指的是 Linux 内核中实现包过滤防火墙的内部结构,不以程序和文件的形式存在,属于 内核态。
  • iptables  指的是管理 Linux 防火墙的命令工具,属于 用户态

iptables 的规则表 和 链

iptables 采用了表和链的分层结构,每个规则表相当于内核空间的一个容器,根据处理数据包的时机不同,表容器内包含不同的规则链。共有四个规则表,五个规则链。

  • raw 表 包含 OUPUT PREROUTING
  • mangle 表 包含 五个规则链  PREROUTING POSTROUTING INPUT OUTPUT FORWARD
  • nat 表 包含  PREROUTING POSTROUTING OUTPUT
  • filter 表 包含 INPUT FORWARD OUTPUT

iptables 的基本语法格式

参考网址:http://man.linuxde.net/iptables

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

常用命令选项简介

  • -A  在指定链的末尾添加(--append) 一条新的规则
  • -D 删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则
  • -I 在指定链中插入(--insert)一条新的规则,若未指定插入位置,则默认在链的开头插入
  • -L 列出(--list)指定链中所有规则进行查看,若未指定列名,则列出表中所有链的内容
  • -F 清空(--flush)指定链中的所有规则,若未指定链名,则清空表中所有链的规则
  • -P 设置指定链的默认策略(--policy)
  • -n 使用数字形式显示输出结果,如显示主机的 IP 地址而不是主机名
  • -v 查看规则表时显示详细的信息
  • --line-numbers  查看规则表时,同时显示规则在链中的顺序号

条件匹配

  • 通用条件匹配
  1. 协议匹配:用于检查数据包的网络协议,允许使用的协议名包含在 /etc/protocols 文件中,常见的为 tcp udp icmp all.  iptables 命令中使用 “-p 协议名的形式”

             iptables -I INPUT -p icmp -j  ACCEPT  # 允许 ping 主机操作

         2. 地址匹配:用于检查数据包的 IP 地址,网络地址。在 iptables 命令中 -s "源地址"  -d “目标地址”

             iptables -I FORWARD -s 192.168.0.0/24 -j ACCEPT

         3. 网络接口匹配:用于检查数据包从防火墙的哪一个接口进入或离开。 在 iptables 中使用 “-i 网络接口名”  和 “-o 网络接口名”

             iptables -I INPUT -i  eth1  -s 192.168.0.0/16 -j DROP

  •  隐含(implicit)条件匹配

          1. 端口匹配: 用于检查数据包的TCP 或 UDP 端口号。需要以 “-p tcp ” 和 “-p udp”  匹配为前提。在 iptables 命令中使用 “--sport 源端口” 和 "--sport 目标端口" 的形式

              iptables -I  INPUT -p tcp --dport 80 -s 192.168.0.0/24 -j ACCEPT  #  端口范围用: 例如: 20:1024

           2. TCP 标记匹配:用于检查数据包的 TCP 标记位 (--tcp-flags) ,需要以 "-p tcp" 匹配为前提。 在 iptables 命令中使用 "--tcp-flags  检查范围,被设置的标记" 的形式

              参考博客:http://blog.chinaunix.net/uid-22780578-id-3346350.html

              iptables -I INPUT -i eth1 -p tcp --tcp-flags  SYN,RST,ACK,SYN -j REJECT  # 拒绝访问防火墙本机的数据包

              iptables -I INPUT -i eth1 -p tcp --tcp-flags  ! SYN,RST,ACK,SYN -j ACCEPT   # 允许响应防火墙TCP 请求的数据包进入

           3. ICMP 类型匹配:用于检查 ICMP 数据包的类型(--icmp-type), 需要以 "-p icmp" 匹配为前提,在 iptables 命令中使用 "--icmp-type ICMP 类型" 的形式

               ICMP 类型: Echo-Request (数字代码为 8) Echo-Reply (数字代码为 0)  Destination-Unreachable (数字代码为3)  分别对应 ICMP 协议的请求,回显,目标不可达数据.

               经典案例:禁止其他主机 ping 防火墙主机,允许从防火墙上 ping 其他主机.  (有个模块叫 state,也可以实现类似功能)

               iptables -A INPUT -p icmp --icmp-type  Echo-Request  -j DROP

               iptables -A INPUT -p icmp --icmp-type  Echo-Reply  -j ACCEPT

               iptables -A INPUT -p icmp --icmp-type  Destination-Unreachable -j ACCEPT

  • 显示(Explicit)条件匹配  # 在 iptables 命令中使用 "-m 模块关键字" 的形式调用显示匹配

          1. mac 地址匹配: 主要用于检查数据包的源 MAC 地址,在 iptables 命令中使用 "-m mac" "--mac-source MAC 地址" 的形式

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

          2. 多端口匹配:检查数据包的源端口,目标端口,用于匹配多个不连续的端口号。在 iptables 命令中使用 "--dports 端口列表" 和 "--sports 端口列表" 的形式,模块使用 "-m multiport"

              iptables -A INPUT -p tcp -m multiport  --dport 80,443,22, 1024:1080  -j ACCEPT

          3. 多 IP 地址匹配:检查数据包的源地址,目标地址时,用于匹配一段范围内的 IP 地址,在 iptables 命令中使用 "--src-range IP 地址范围"  或者 "--dst-range IP 地址范围" 的形式, 模块使用 -m iprange

             iptables -A FORWARD -p tcp  -m iprange --src-range  192.168.100.1-192.168.100.50  -j DROP

          4. 状态匹配: 基于iptables 的状态跟踪机制,检查数据包的连接状态。在 iptables 命令中使用 "--state 数据包状态" 的形式,模块使用 -m state 。

             常见数据包状态: NEW (与任何连接无关的)  ESTABLISHED(响应请求或者已经建立连接的)  RELATED (与已有连接有相关性的,如 FTP 数据连接)

             案例:

             拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包

             iptables -A INPUT -p tcp -m state --state  NEW -J DROP

             iptables -A INPUT -p tcp -m state --state ESTABLISHED RELATED -j ACCEPT

             设置防火墙策略:开放本机 80,443,22 端口,放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包均予以丢弃处理

             iptables -I INPUT -p tcp -m multiport  --dport 80,443,22 -j ACCEPT

             iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

             iptables -P INPUT DROP

数据包控制

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

       LOG 配置案例:记录 SSH 访问数据.

       iptables -I INPUT -p tcp --dport 22 -j LOG    # 个人建议不要记录

       iptables -I INPUT -p tcp --dport 22 -m limit  --limit  2/minute  --limit-burst 8 -j LOG  #  限制日志记录频率

导入导出防火墙规则

  1. 防火墙配置文件: /etc/sysconfig/iptables
  2. iptables-save:此命令会将当前内存中的防火墙规则输出到终端
  3. iptables-save > /etc/sysconfig/iptables : 保存内存中的防火墙规则到配置文件
  4. iptables-restore < /etc/sysconfig/iptables :从配置文件中导入防火墙规则到内存

编写防火墙脚本注意事项

  1. 脚本中要善于应用变量
  2. 开启路由转发功能:/sbin/sysctl -w net.ipv4.ip_forward=1   或者 echo 1 > /proc/sys/net/ipv4/ip_forward   # 在防火墙脚本中设置
  3. 清空用户自定义的链,清空已经存在的防火墙规则,设置 filter 表的默认策略

 防火墙高级应用

SNAT 策略

  • SNAT 策略简介:更改数据包的源 IP 地址,典型应用是局域网共享上网 ,pptp vpn 访问外网
  • 策略应用详解

          SNAT 只能用于 nat 表的 POSTROUTING 链,使用 iptables 命令设置 SNAT 策略时,需要结合 "--to-soure IP 地址"

          案例:局域网段 192.168.1.0/24, 采用 SNAT 策略,使用共享 IP 上网

  1.  开启路由转发功能 : vim /etc/sysctl.conf   添加  net.ipv4.ip_forward = 1  然后执行  sysctl -p
  2.  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source  共享IP 
  3.  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE  #  动态获取共享 IP , 多用于 ADSL 环境

DNAT 策略

  • DNAT策略简介:更改数据包的目标 IP 地址,典型应用是通过一个 IP, 不同端口,访问局域网服务器
  • 策略应用详解

         DNAT 只能用于 nat 表的 PREROUTING 链和 OUTPUT 链中。使用 iptables 命令设置 SNAT 策略时,需要结合 "--to-destination IP 地址"

         案例: 访问网关 80 端口的数据包,将目标地址更改为网站服务器的内网地址

  1.  开启路由转发功能 : vim /etc/sysctl.conf   添加  net.ipv4.ip_forward = 1  然后执行  sysctl -p
  2.  iptables -t nat -A PREROUTING -i eth0  -d 公网 IP -p tcp --dport 80 -j DNAT --to-destination 内网地址 或 内网地址:端口号

      

   

             

            

            

         

                    

 

              

          

        

       

 

posted @ 2018-02-07 11:19  步绍训  阅读(335)  评论(0)    收藏  举报