linux防火墙iptables详解

    一、Netfilter/iptables框架简介

            Netfilter/iptables能够对流入和流出的信息进行细化控制,且能够在一台低配置机器上很好地运行,被认为是Linux中实现包过滤功能的第四代应用程序。Netfilter/iptables包含在Linux 2.4之后的内核中,能够实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。ios

            netfilter工做在内核内部,而iptables则是让用户定义规则集的表结构。Netfilter/iptables从ipchains和ipwadfm(IP防火墙管理)演化而来,功能更增强大。web

            这里所说的iptables是ipchains的后继工具,但具备更强的可扩展性。内核模块能够注册一个新的规则表(table),并要求数据包流经指定的规则表。这种数据包选择用于实现数据报过滤(filter表),网络地址转换(NAT表)及数据报处理(mangle表)。Linux 2.4内核及其以上版本提供的这三种数据报处理功能都基于netfilter的钩子函数和IP表,都是相互间独立的模块,完美地集成到了由netfilter提供的框架中,如图1所示。netfilter主要提供了以下三项功能:安全

  1. 包过滤:filter表格不会对数据报进行修改,而只对数据报进行过滤。iptables优于ipchains的一个方面就是它更为小巧和快速。它是经过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。
  2. NAT:NAT表格监听三个netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。NF_IP_PRE_ROUTING实现对须要转发数据报的源地址进行地址转换,而NF_IP_POST_ROUTING则对须要转发的数据报目的地址进行地址转换。对于本地数据报目的地址的转换,则由NF_IP_LOCAL_OUT来实现。
  3. 数据报处理:mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册。使用mangle表,能够实现对数据报的修改或给数据报附上一些外带数据。当前mangle表支持修改TOS位及设置skb的nfmard字段。

Netfilter/Iptables框架结构示意图
            图1 Netfilter/Iptables框架结构示意图服务器

            根据实际状况,灵活运用Netfilter/iptables框架,生成相应的防火墙规则能够方便、高效地阻断部分网络攻击以及非法数据报(参见图2所示的工做原理)。然而,因为配置了防火墙,可能引发诸如FTP、QQ、MSN等协议和软件没法使用或者某些功能没法正常使用,也有可能引发RPC(远程过程调用)没法执行,这须要用户根据实际状况来配置相应的服务代理程序来开启这些服务。网络

            须要特别提醒注意的是,防火墙也可能被内部攻击,其并非万能的,还须要综合使用其余防御手段。内部人员因为没法经过Telnet浏览邮件或使用FTP向外发送信息,个别人会对防火墙不满进而可能对其进行攻击和破坏。并且,攻击的目标经常是防火墙或防火墙运行的操做系统,这极大地危害了防火墙系统甚至是关键信息系统的安全。app

Netfilter/Iptables框架工做原理示意
            图2 Netfilter/Iptables框架工做原理示意框架

 

    二、iptables基本原理

            经过向防火墙提供有关对来自某个源、到某个目的地或具备特定协议类型的信息包要作些什么的指令,规则控制信息包的过滤。经过使用Netfilter/iptables系统提供的特殊命令iptables,创建这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的通常语法以下:tcp

iptables [-t table] command [match] [target]

不难看出,一条iptables规则包含以下4个基本元素:函数

  1. 命令
  2. 匹配
  3. 目标

1) 表(table)工具

            [-t table]选项容许使用标准表以外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。

            有三种可用的表选项:filter、nat和mangle。该选项不是必需的,若是未指定,则filter用做默认表。

            filter表用于通常的信息包过滤,包含INPUT、OUTPUT和FORWAR链。

            nat表用于要转发的信息包,它包含PREROUTING、OUTPUT和POSTROUTING链。

            若是信息包及其头内进行了任何更改,则使用mangle表。该表包含一些规则来标记用于高级路由的信息包以及PREROUTING和OUTPUT链。

. [-t table] 指定规则表;
    内建的规则表有三个,分别是:nat、mangle 和filter,
    当未指定规则表时,则一概视为是filter。

    三个规则表的功能以下:
      nat:  此规则表拥有PREROUTING 和POSTROUTING 两个规则链,
             主要功能为进行一对1、一对多、多对多等网址转换工做(SNAT、DNAT),
             这个规则表除了做网址转换外,请不要作其它用途。

      mangle:此规则表拥有PREROUTING、FORWARD 和POSTROUTING 三个规则链。
              除了进行网址转换工做会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)
              或者是设定MARK(将封包做记号,以进行后续的过滤),这时就必须将这些工做定义在mangle 规则表中;
              因为使用率不高,咱们不打算在这里讨论mangle 的用法。

      filter: 这个规则表是默认规则表,拥有INPUT、FORWARD 和OUTPUT 三个规则链,
               这个规则表顾名思义是用来进行封包过滤的处理动做(例如:DROP、LOG、ACCEPT 或REJECT),
               咱们会将基本规则都创建在此规则表中。

 

2) 命令(command)

command部分是iptables命令的最重要部分,它告诉iptables命令要作什么,例如,插入规则、将规则添加到链的末尾或删除规则。经常使用命令以下:

命令:  -A, --append
范例:  iptables -A INPUT ...
说明:  新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。

命令:  -D, --delete
范例:  iptables -D INPUT --dport 80 -j DROP
       iptables -D INPUT 1
说明:  从某个规则链中删除一条规则,能够输入完整规则,或直接指定规则编号加以删除。

命令:  -R, --replace
范例:  iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明:  取代现行规则,规则被取代后并不会改变顺序。

命令:  -I, --insert
范例:  iptables -I INPUT 1 --dport 80 -j ACCEPT
说明:  插入一条规则,本来该位置上的规则将会日后移动一个顺位。

命令:  -L, --list
范例1: iptables -L INPUT
说明:  列出某规则链中的全部规则。
范例2: iptables -t nat -L
说明:  列出nat 表全部链中的全部规则。

命令:  -F, --flush
范例:  iptables -F INPUT
说明:  删除filter 表中INPUT 链的全部规则。

命令:  -Z, --zero
范例:  iptables -Z INPUT
说明:  将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

命令:  -N, --new-chain
范例:  iptables -N allowed
说明:  定义新的规则链。

命令:  -X, --delete-chain
范例:  iptables -X allowed
说明:  删除某个规则链。

命令:  -P, --policy
范例:  iptables -P INPUT DROP
说明:  定义过滤政策。也就是未符合过滤条件之封包, 默认的处理方式。

命令:  -E, --rename-chain
范例:  iptables -E allowed disallowed
说明:  修改某自定义规则链的名称。

 

3) 匹配(match)

            iptables命令的可选match部分指定信息包与规则匹配所应具备的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且经常使用的通用匹配及其说明:

参数:  -p, --protocol
范例:  iptables -A INPUT -p tcp
说明:  匹配通信协议类型是否相符,可使用! 运算符进行反向匹配,例如:
           -p !tcp
       意思是指除tcp 之外的其它类型,如udp、icmp ...等。
       若是要匹配全部类型,则可使用all 关键词,例如:
           -p all

参数:  -s, --src, --source
范例:  iptables -A INPUT -s 192.168.1.1
说明:  用来匹配封包的来源IP,能够匹配单机或网络,匹配网络时请用数字来表示子网掩码,
例如:
       -s 192.168.0.0/24
       匹配IP 时可使用! 运算符进行反向匹配,例如:
       -s! 192.168.0.0/24。

参数:  -d, --dst, --destination
范例:  iptables -A INPUT -d 192.168.1.1
说明:  用来匹配封包的目的地IP,设定方式同上。

参数:  -i, --in-interface
范例:  iptables -A INPUT -i eth0
说明:  用来匹配封包是从哪块网卡进入,可使用通配字符+ 来作大范围匹配,例如:
         -i eth+
      表示全部的ethernet 网卡
      也可使用! 运算符进行反向匹配,例如:
         -i !eth0

参数:  -o, --out-interface
范例:  iptables -A FORWARD -o eth0
说明:  用来匹配封包要从哪块网卡送出,设定方式同上。

参数:  --sport, --source-port
范例:  iptables -A INPUT -p tcp --sport 22
说明:  用来匹配封包的源端口,能够匹配单一端口,或是一个范围,例如:
          --sport 22:80
       表示从22 到80 端口之间都算是符合条件,若是要匹配不连续的多个端口,则必须使用
          --multiport 参数,详见后文。匹配端口号时,可使用! 运算符进行反向匹配。

参数:  --dport, --destination-port
范例:  iptables -A INPUT -p tcp --dport 22
说明:  用来匹配封包的目的地端口号,设定方式同上

参数:  --tcp-flags
范例:  iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明:  匹配TCP 封包的状态标志;
       参数分为两个部分,
         第一个部分列举出想匹配的标志,
         第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的。
       TCP 状态标志包括:
          SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急) 、PSH(强迫推送) 
       等都可使用于参数中,
       除此以外还可使用关键词ALL 和NONE 进行匹配。
       匹配标志时,可使用! 运算符行反向匹配。

参数:  --syn
范例:  iptables -p tcp --syn
说明:  用来表示TCP 通讯协议中,SYN 位被打开,而ACK 与FIN 位关闭的分组,即TCP 的初始链接,
       与iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的做用彻底相同,
       若是使用!运算符,可用来匹配非要求链接封包。

参数:  -m multiport --source-port
范例:  iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明:  用来匹配不连续的多个源端口,一次最多能够匹配15 个端口,
       可使用! 运算符进行反向匹配。

参数:  -m multiport --destination-port
范例:  iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明:  用来匹配不连续的多个目的地端口号,设定方式同上

参数:  -m multiport --port
范例:  iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明:  这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上。
       注意:在本范例中,若是来源端口号为80目的地端口号为110,这种封包并不算符合条件。

参数:  --icmp-type
范例:  iptables -A INPUT -p icmp --icmp-type 8
说明:  用来匹配ICMP 的类型编号,可使用代码或数字编号来进行匹配。
       请打iptables -p icmp--help 来查看有哪些代码可用。

参数:  -m limit --limit
范例:  iptables -A INPUT -m limit --limit 3/hour
说明:  用来匹配某段时间内封包的平均流量,
       上面的例子是用来匹配:每小时平均流量是否超过一次3 个封包。
       除了每小时平均次外,也能够每秒钟、每分钟或天天平均一次,默认值为每小时平均一次,参数如后:
           /second、/minute、/day
       除了进行封包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动做,
       以免因骇客使用洪水攻击法,致使服务被阻断。

参数:  --limit-burst
范例:  iptables -A INPUT -m limit --limit-burst 5
说明:  用来匹配瞬间大量封包的数量,
       上面的例子是用来匹配一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。
       使用效果同上。

参数:  -m mac --mac-source
范例:  iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明:  用来匹配封包来源网络接口的硬件地址,
       这个参数不能用在OUTPUT 和POSTROUTING 规则链上,
       这是由于封包要送到网卡后,才能由网卡驱动程序透过ARP 通信协议查出目的地的MAC 地址,
       因此iptables 在进行封包匹配时,并不知道封包会送到哪一个网络接口去。

参数:  --mark
范例:  iptables -t mangle -A INPUT -m mark --mark 1
说明:  用来匹配封包是否被表示某个号码,
       当封包被匹配成功时,咱们能够透过MARK 处理动做,将该封包标示一个号码,号码最大不能够超过4294967296。

参数:  -m owner --uid-owner
范例:  iptables -A OUTPUT -m owner --uid-owner 500
说明:  用来匹配来自本机的封包,是否为某特定使用者所产生的,
       这样能够避免服务器使用root或其它身分将敏感数据传送出,能够下降系统被骇的损失。
       惋惜这个功能没法匹配出来自其它主机的封包。

参数:  -m owner --gid-owner
范例:  iptables -A OUTPUT -m owner --gid-owner 0
说明:  用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

参数:  -m owner --pid-owner
范例:  iptables -A OUTPUT -m owner --pid-owner 78
说明:  用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上。

参数:  -m owner --sid-owner
范例:  iptables -A OUTPUT -m owner --sid-owner 100
说明:  用来匹配来自本机的封包,是否为某特定链接(Session ID)的响应封包,使用时机同上。

参数:  -m state --state
范例:  iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明:  用来匹配链接状态, 
       链接状态共有四种:
          INVALID、ESTABLISHED、NEW 和RELATED。
       INVALID     表示该封包的链接编号(Session ID)没法辨识或编号不正确。
       ESTABLISHED 表示该封包属于某个已经创建的链接。
       NEW         表示该封包想要起始一个链接(重设链接或将链接重导向)。
       RELATED     表示该封包是属于某个已经创建的链接,所创建的新链接。
       例如:FTP-DATA 链接一定是源自某个FTP 链接。

 

4) 目标(target)

            前面已经讲过,目标是由规则指定的操做,对与那些规则匹配的信息包执行这些操做。除了容许用户定义的目标以外,还有许多可用的目标选项。下面是经常使用的一些目标及其示例和说明:

-j 参数用来指定要进行的处理动做,经常使用的处理动做包括:
   ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,

分别说明以下:
动做:  ACCEPT 
说明:  将封包放行,
       进行完此处理动做后,将再也不匹配其它规则,直接跳往下一个规则链(natostrouting)。

动做:  REJECT 
说明:  拦阻该封包,并传送封包通知对方,
       能够传送的封包有几个选择:
           ICMP port-unreachable、
           ICMP echo-reply 或是
           tcp-reset(这个封包会要求对方关闭链接),
         进行完此处理动做后,将再也不匹配其它规则,直接中断过滤程序。
范例:  iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

动做:  DROP
说明:  丢弃封包不予处理,进行完此处理动做后,将再也不匹配其它规则,直接中断过滤程序。

动做:  REDIRECT
说明:  将封包从新导向到另外一个端口(PNAT),进行完此处理动做后,将会继续匹配其它规则。
       这个功能能够用来实现透明代理或用来保护web 服务器。
范例:  iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

动做:  MASQUERADE
说明:  改写封包来源IP 为防火墙NIC IP,能够指定port 对应的范围,
       进行完此处理动做后,直接跳往下一个规则链(manglepostrouting)。
       这个功能与SNAT 略有不一样,当进行IP 假装时,不需指定要假装成哪一个IP,IP 会从网卡直接读取,
       当使用拨号接连时,IP一般是由ISP 公司的DHCP 服务器指派的,这个时候MASQUERADE 特别有用。
范例:  iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

动做:  LOG
说明:  将封包相关讯息纪录在/var/log 中,详细位置请查阅/etc/syslog.conf 配置文件,
       进行完此处理动做后,将会继续匹配其规则。
范例:  iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

动做:  SNAT
说明:  改写封包来源IP 为某特定IP 或IP 范围,能够指定port 对应的范围,
       进行完此处理动做后,将直接跳往下一个规则(mangleostrouting)。
范例:  iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source?194.236.50.155-194.236.50.160:1024-32000

动做:  DNAT
说明:  改写封包目的地IP 为某特定IP 或IP 范围,能够指定port 对应的范围,
       进行完此处理动做后,将会直接跳往下一个规则链(filter:input 或filter:forward)。
范例:  iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

动做:  MIRROR
说明:  镜射封包,也就是未来源IP 与目的地IP 对调后,将封包送回,
       进行完此处理动做后,将会中断过滤程序。

动做:  QUEUE
说明:  中断过滤程序,将封包放入队列,交给其它程序处理。
       经过自行开发的处理程序,能够进行其它应用,例如:计算链接费用等。

动做:  RETURN
说明:  结束在目前规则链中的过滤程序,返回主规则链继续过滤,
       若是把自定义规则链当作是一个子程序,那么这个动做,就至关于提早结束子程序并返回到主程序中。

动做:  MARK
说明:  将封包标上某个代号,以便提供做为后续过滤的条件判断依据,
       进行完此处理动做后,将会继续匹配其它规则。
范例:  iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

 

三、IP 规则的保存与恢复

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

#  iptables-save > /etc/sysconfig/iptables

生成保存规则的文件为: /etc/sysconfig/iptables;
也能够用命令:

#  service iptables save

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

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

3. iptables服务操做
启动:

# service iptables start
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

中止:

# service iptables stop
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]

重启:

# service iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

4. 完全清空规则

# iptables -F
# iptables-save > /etc/sysconfig/iptables
相关文章
相关标签/搜索