全国业务电话:
9.5 防火墙(Netfilter/Iptables)
9.5 防火墙(Netfilter/Iptables)
 
9.5.1 防火墙(Netfilter/Iptables)介绍
 
  netfilter/iptables(简称 iptables)组成 Linux 平台下的包过滤防火墙,可以完成封包过滤,封包重定向和网络地址转换(NAT)等功能。用户可以根据自己特定的需求来配置防火墙,在防火墙解决方案上节省费用和对IP信息包过滤具有完全控制权。netfilter/iptables IP 信息包过滤系统可用来添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 CGSL 内核中。 在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。下文将详细讨论这些规则以及如何建立这些规则,并将它们分组在链中。
 
9.5.2 建立规则和链
 
  通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,以设置相关规则来控制信息包的过滤。 通过使用 netfilter/iptables 系统提供的特殊命令 iptables,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:
 
    $ iptables [-t table] command [match] [target]  

  表(table)
 
  [-t table]表是包含仅处理特定类型信息包的规则和链的信息包过滤表。 有三种可用的表选项:filter、nat 和 mangle。该选项不是必需的,如果未指定,则 filter 用作缺省表。
 
  filter 表用于一般的信息包过滤,它包含 INPUT、OUTPUT 和 FORWARD 链。nat 表用于要转发的信息包,它包含 PREROUTING、OUTPUT 和 POSTROUTING 链。如果信息包及其头内进行了任何更改,则使用 mangle 表。该表包含一些规则来标记用于高级路由的信息包,该表包含 PREROUTING 和 OUTPUT 链。
 
  :PREROUTING 链由指定信息包一到达防火墙就改变它们的规则所组成,而 POSTROUTING 链由指定正当信息包打算离开防火墙时改变它们的规则所组成。
 
  命令(command)
 
  上面这条命令中具有强制性的 command 部分是 iptables 命令的最重要部分。它告诉 iptables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。以下是最常用的一些命令:
 
  ●-A 或--append:该命令将一条规则附加到链的末尾。
 
  示例:
 
    $ iptables -A INPUT -s 205.168.0.1 -j ACCEPT  
 
  该示例命令将一条规则附加到 INPUT 链的末尾,确定来自源地址 205.168.0.1 的信息包可以 ACCEPT。
 
  ●-D 或--delete:通过用-D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则。下面的示例显示了这两种方法。
 
  示例:
 
    $ iptables -D INPUT --dport 80 -j DROP  
 
    $ iptables -D OUTPUT 3  
 
  第一条命令从 INPUT 链删除规则,它指定 DROP 前往端口 80 的信息包。第二条命令只是从 OUTPUT 链删除编号为 3 的规则。
 
  ●-P 或--policy:该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略。
 
  示例:
 
    $ iptables -P INPUT DROP  
 
  该命令将 INPUT 链的缺省目标指定为 DROP。这意味着,将丢弃所有与 INPUT 链中任何规则都不匹配的信息包。

  ●-N 或--new-chain:用命令中所指定的名称创建一个新链。
 
  示例:
 
    $ iptables -N allowed-chain  
 
  ●-F 或--flush:如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除。
 
  示例:
 
    $ iptables -F FORWARD  
 
    $ iptables -F  
 
  ●-L 或--list:列出指定链中的所有规则。
 
  示例:
 
     $ iptables -L allowed-chain  
 
  匹配(match)
 
  iptables 命令的 match 部分(可选项)指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。下面是一些重要且常用的通用匹配及其示例和说明:
 
  ●-p 或--protocol:该通用协议匹配用于检查某些特定协议。协议示例有 TCP、UDP、ICMP、用逗号分隔的任何这三种协议的组合列表以及 ALL(用于所有协议)。ALL 是缺省匹配。可以使用 ! 符号,它表示不与该项匹配。示例:
 
    $ iptables -A INPUT -p TCP, UDP  
 
    $ iptables -A INPUT -p ! ICMP  
 
  在上述示例中,这两条命令都执行同一任务—它们指定所有 TCP 和 UDP 信息包都将与该规则匹配。通过指定 ! ICMP,我们打算允许所有其它协议(在这种情况下是 TCP 和 UDP),而将 ICMP 排除在外。
 
  ●-s 或--source:该源匹配用于根据信息包的源 IP 地址来与它们匹配。该匹配还允许对某一范围内的 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。缺省源匹配与所有IP地址匹配。示例:
 
    $ iptables -A OUTPUT -s 192.168.1.1  
 
    $ iptables -A OUTPUT -s 192.168.0.0/24  
 
    $ iptables -A OUTPUT -s ! 203.16.1.89  
 
  第二条命令指定该规则与所有来自 192.168.0.0 到 192.168.0.24 的 IP 地址范围的信息包匹配。第三条命令指定该规则将与除来自源地址 203.16.1.89 外的任何信息包匹配。

  ●-d 或--destination:该目的地匹配用于根据信息包的目的地 IP 地址来与它们匹配。该匹配还允许对某一范围内IP地址进行匹配,可以使用 ! 符号,表示不与该项匹配。示例:
 
    $ iptables -A INPUT -d 192.168.1.1  
 
    $ iptables -A INPUT -d 192.168.0.0/24  
 
    $ iptables -A OUTPUT -d ! 203.16.1.89  
 
  目标(target)
 
  目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明:
 
  ●ACCEPT:当信息包与具有ACCEPT目标的规则完全匹配时,会被接受(允许它前往目的地),并且它将停止遍历链(虽然该信息包可能遍历另一个表中的其它链,并且有可能在那里被丢弃)。该目标被指定为 -j ACCEPT。
 
  ●DROP:当信息包与具有 DROP 目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为 -j DROP。
 
  ●REJECT:该目标的工作方式与DROP目标相同,但它比 DROP 好。和 DROP 不同,REJECT 不会在服务器和客户机上留下死套接字。另外,REJECT 将错误消息发回给信息包的发送方。该目标被指定为 -j REJECT。示例:
 
    $ iptables -A FORWARD -p TCP --dport 22 -j REJECT  
 
  ●RETURN:在规则中设置的 RETURN 目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如 INPUT 之类的主链,则使用该链的缺省策略处理信息包。它被指定为 -jump RETURN。示例:
 
    $ iptables -A FORWARD -d 203.16.1.89 -jump RETURN  
 
  还有许多用于建立高级规则的其它目标,如 LOG、REDIRECT、MARK、MIRROR 和 MASQUERADE 等。
 
  保存规则
 
  用上述方法所建立的规则会被保存到内核中,当重新引导系统时,会丢失这些规则。所以,将没有错误的且有效的规则集添加到信息包过滤表,同时希望在重新引导之后再次使用这些规则,那么必须将该规则集保存在文件中。可以使用 iptables-save 命令来做到这一点:
 
    $ iptables-save > iptables-script  
 
  现在,信息包过滤表中的所有规则都被保存在文件 iptables-script 中。无论何时再次引导系统,都可以使用 iptables-restore 命令将规则集从该脚本文件恢复到信息包过滤表,如下所示:
 
    $ iptables-restore iptables-script  
 
  如果您愿意在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化shell脚本中。
 
9.5.3 启动与关闭防火墙
 
  1.检查 iptables 的状态
 
    # systemctl status iptables  
 
  2.检查防火墙规则
 
    #iptables -L -n  
 
  3.检查防火墙 nat 规则
 
    #iptables -t nat -L -n  
 
  4.关闭防火墙
 
    # systemctl stop iptables  
 
  5.开启防火墙
 
    # systemctl start iptables  

  • 操作系统微信公众号

  • CPI微信公众号

© 2004-2020 广东中兴新支点技术有限公司  版权所有  (www.gd-linux.com)  粤ICP备15061780号-2

新支点OS业务:

QQ客服