linux之iptables 基础详解

2020-07-22 02:01:27 浏览数 (1)

一、简介

       iptables是Linux系统上的防火墙,是一个包过滤型的防火墙,能够根据事先定义好的检查规则对进出本机或者本地网络的报文进行匹配检查,并对于能够被规则匹配的报文作出相应的处理动作。iptables有五个内置规则链(名称需大写),分别为:

  1. PREROUTING
  2. INPUT
  3. FORWARD
  4. OUTPUT
  5. POSTROUTING

      这五个内置规则分别对应的iptables在linux系统中作用的五个位置,分别为:

  1. PREROUTING 对应 从网卡进入到内核空间中
  2. INPUT 对应 从内核空间到用户空间
  3. FORWARD 对应 从一个网卡转发到另一个网卡
  4. OUTPUT 对应 从用户空间到内核空间
  5. POSTROUTING 对应 从内核空间到网卡

      五个内置规则链对应的图解如下:

       如上图,五个规则链分别在不同的逻辑位置对进入到系统中的报文按照事先定义的规则进行匹配检查过滤。由于一个链中通常包含着不止一条规则,因此当数据想要通过这些规则链的时候,必须得一条一条去匹配通过他们的规则,其形式类似于串行,这也就是为什么规则链被称为链的原因。

       当这些内置链中拥有着大量的规则,其中肯定包含着不同类型的规则,如过滤Ip或端口的规则、修改报文的规则等等,而iptables把这些具有相同功能的规则作为表而管理存放。不同的规则链中所能包含的规则类型是不一样的,有些链可能可以有地址转换规则,有些链却不能设置。那么就iptables自身内置的四种功能表其所包含的规则能被哪些链所使用,其分类如下:

  1. filter:过滤表,能被INPUT、FORWARD、OUTPUT这三个规则链使用。
  2. nat:网络地址转换表,能被PREROUTING、OUT、POSTROUTING(centos7中还包含着INPUT)使用。
  3. mangle:报文修改表,能被PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING使用。
  4. raw:一般是为了不再让iptables对数据包进行跟踪,提高性能,能被PREROUTING,OUTPUT使用。

       除此之外规则链中的规则是链式结构,按理来说执行的时候是有一定的顺序的,但是不同的规则属于不同的表,那么表之间的优先顺序是怎么区分的呢?其实当一个规则链当中包含了四个表filter,nat,mangle,raw时,那么当要执行这个规则链中的规则时,其执行的顺序是raw>mangle>nat>filter的,也就意味着同一个规则链中,表的优先级为:raw>mangle>nat>filter。

二,iptables 命令规则及设置

对于iptables的规则来说,它的功能就是根据匹配条件来尝试匹配报文,一旦匹配成功,就按照规则定义的处理动作来处理报文,其命令的使用语法为:

代码语言:javascript复制
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]

详细解释其常用选项包括:

代码语言:javascript复制
-t table:
 默认为filter;其它可用的有raw, mangle, nat;
				
COMMAND:
 链:
	-P:policy,策略,定义默认策略; 一般有两种选择,ACCEPT和DROP;
	-N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效;[-j  chain_name];
	-X:drop,删除自定义的引用计数为0的空链;
	-F:flush,清空指定的链;
	-E:重命名自定义的引用计数和为0的链;
规则:
	-A:append,追加,在指定链的尾部追加一条规则;
	-I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;
	-D:delelte,删除,删除指定的规则;
	-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换;
查看:
	-L:list,列出表中的链上的规则;
	-n:numeric,以数值格式显示;
    -v:verbose,显示详细格式信息; 
	-vv, -vvv
	-x:exactly,计数器的精确结果;
	--line-numbers:显示链中的规则编号;

chain:                 (1) 内建链;                 (2) 自定义链;

iptables的规则由匹配条件和处理动作组成,其中匹配条件分为基本匹配条件和扩展匹配条件。

1,匹配条件

a) 基本匹配条件,基本匹配条件为内建条件,由iptables(netfilter)自行提供,无需加载任何模块。常见的基本匹配条件有:

  1. [!] -s, --source address[/mask][...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
  2. [!] -d, --destination address[/mask][...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
  3. [!] -p, --protocol protocol:指定匹配的协议,常见协议包括:TCP、UDP、ICMP等;
  4. [!] -i,--in-interface name:数据报文流入的接口,只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
  5. [!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;

b) 扩展匹配条件,需加载扩展模块方可生效,而扩展匹配条件又分为隐式扩展和显示扩展。

  • 隐式扩展不需要手动加载扩展模块,因为其实对协议的扩展,因此当使用-p选项指明了协议的时候,就表示已经指明了要扩展的模块。其常见条件包括:
  1. [!] --source-port, --sport port[:port]:匹配报文的源端口;可指定端口范围;
  2. [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可指定端口范围;
  3. [!] --tcp-flags:指定tcp的标记,如:SYN,ACK,FIN,RST等;
  4. [!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
  5. [!] --icmp-type {type[/code]|typename}:用于指定icmp协议的类型,如--icmp-type 8;
  • 显示扩展则必须手动加载扩展模块,需使用-m选项指明要调用的扩展模块,其格式为[-m matchname [per-match-options]]。常见的matchname及其各自的子规则如下:
代码语言:javascript复制
1、multiport:以离散或连续的方式定义多端口匹配条件,最多不超过15个端口;
  [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
  [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
  [!] --ports port[,port|,port:port]...:指明多个端口;
2、iprange:指明连续的IP地址范围
  [!] --src-range from[-to]:源IP地址;
  [!] --dst-range from[-to]:目标IP地址;
3、time:根据将报文送到的时间与指定的时间范围进行匹配;
  --kerneltz:用系统本地时区代替默认的UTC时区;
  --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定从什么日期开始;
  --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定到什么日期停止;
  --timestart hh:mm[:ss]:指定从何时开始;
  --timestop hh:mm[:ss]:指定从何时结束;
  [!] --monthdays day[,day...] :指定规则生效的日月
  [!] --weekdays day[,day...] :指定规则在星期几生效;
  通常后两个选项不会同时使用
4、string:用于对报文中的应用层数据做字符串模式匹配检查;
  --algo {bm|kmp}:字符串匹配检测算法;
  [!] --string pattern:要检测的字符串模式;
  [!] --hex-string pattern:要检测的字符串模式,16进制格式;
5、connlimit:根据每个客户端的Ip做并发连接数数量匹配检查;
  --connlimit-upto n:连接的数量小于等于n时匹配;
  --connlimit-above n:连接的数量大于n时匹配;
6、limit:对收发报文的速率做条件匹配;
  --limit rate[/second|/minute|/hour|/day]:将匹配的报文限制速率为每second|/minute|/hour|/day发送rate次;
  --limit-burst number:限制当达到多个报文后,执行限制;
7、state:根据”连接追踪机制“去检查连接的状态;
  [!] --state state:state的类型包括如下:
      NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
      ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
      RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
      INVALID:无效的连接;
      UNTRACKED:未进行追踪的连接;

对于iptables的匹配条件来说,大部分条件均可在条件的前方添上一个!表取反之意,即匹配除了指定的匹配条件之外的内容。

2、处理动作

处理动作相对于匹配条件来说,没有那么复杂,其格式类似如下:

代码语言:javascript复制
-j targetname [per-target-options]

其中targetname即动作有如下类型:

代码语言:javascript复制
ACCEPT:放开
DROP:丢弃
REJECT:拒绝
    ---reject-with type:可指定拒绝报文的类型,如:icmp-net-unreachable,  icmp-host-unreachable,  icmp-port-unreachable等等。
RETURN:返回调用链;
REDIRECT:端口重定向;
    --to-ports port[-port]:将匹配的端口重定向为此处指定的端口;
LOG:记录日志;
    --log-level:可指定记录的日志等级;
    --log-prefix:指定记录的日志路径,默认路径为:/var/log/messages;
MARK:做防火墙标记;
DNAT:目的地址转换
    --to-destination [ipaddr[-ipaddr]][:port[-port]]:将目的地址转换成内网网段的指定ip和端口;
SNAT:源地址转换;
    --to-source [ipaddr[-ipaddr]]:将源地址转换成指定的IP;
MASQUERADE:当要转换的出口地址为动态IP时,MASQUERADE可自行判断要转换为的地址;
自定义链名:调用自定义链作为处理动作;

对于匹配条件和处理动作的相关帮助手册可使用命令man iptablesman iptables-extensions进行查看。

3、iptables规则的保存与恢复

在Centos6中iptables的规则保存于/etc/sysconfig/iptables 文件中,可使用命令service iptables save进行规则的保存,而iptables启动或重启的时候也是会读取/etc/sysconfig/iptables中的配置来生成相应的规则。 对于Centos7来说,其规则的保存和恢复则使用下面两个命令来实现:

代码语言:javascript复制
保存:iptables-save >/PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE

其本质上就是通过将现有的iptables规则导出到指定的文件中,然后当规则需要进行还原恢复的时候,再从该指定文件中读取恢复。

iptables规则优化:         (1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;         (2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;         (3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;         (4) 设置默认策略;             (a) 最后一条规则设定;             (b) 默认策略设定; 

0 人点赞