配置iptables防火墙(上)

配置iptables防火墙
一.     防火墙介绍
1.防火墙作用是隔离内外网,过滤非法数据。
2.Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤型防火墙(或称网络层防火墙)。Linux的防火墙体系基于内核编码实现,因此具有非常稳定的性能和高效率,也因此被更加广泛的采纳和应用。
3.iptables的作用在于为包过滤机制的实现提供规则(或称策略),通过各种不同的规则,告诉netfilter对来自某些源、前往某些目的地或具有某些协议特征的数据包应该如何处理。
二.iptables的规则表、链结构
为了更方便地组织和管理防火墙策略,iptables采用了“表”和“链”的分层结构。每个规则“表”相当于内核空间的一个容器,根据处理数据包的时机不同,表容器内包括不同的规则“链”。针对特定数据包的各种防火墙规则,按顺序依次放入对应的规则“链”中。
1.规则表
按防火墙策略的不同用途,iptables有4个不同的表,其功能分别由独立的内核模块实现。
u     filter表
Ø       包含3个规则链:INPUT、FORWARD、OUTPUT。
Ø       主要对数据包进行过滤,根据具体规则决定是否放行数据包。
Ø       对应的内核模块为iptable_filter。
u     nat表
Ø       包含3个规则链:PREROUTING、POSTROUTING、OUTPUT
Ø       主要用于修改数据包的IP地址、端口号等信息。
Ø       对应的内核模块iptable_nat。
u     mangle表
Ø       包含5个规则链:PREROUTING、POSTROUTING、INPUT、 OUTPUT、FORWARD。
Ø       主要用于修改数据包的TOS(服务类型)、TTL(生存周期)值以及数据包设置Mark标记,以实现Qos调整以及策略路由等应用,需要相应的路由设备支持,因此应用并不广泛。
Ø       对应的内核模块为iptable_mangle。
u     raw表
Ø       包含2个规则链:OUTPUT、PREROUTINGG。
Ø       主要用于决定数据包是否被状态跟踪机制处理。
Ø       对应的内核模块是iptable_raw。
2.规则链
在处理各种数据包时,根据防火墙规则的不同介入时机,iptables共涉及5种默认规则链,其应用时间点对应如下:
Ø       INPUT:当接收到访问防火墙本机地址的数据包(入站)时
Ø       OUTPUT:当防火墙本机向外发送数据包(出站)时
Ø       FORWARD:当接收到需要通过防火墙发送给其他地址的数据包     (转发)时
Ø       PREROUTING:在对数据包作路由选择之前,应用此链中的规则
Ø       POSTROUTING:在对数据包作路由选择之后
其中,INPUT、OUTPUT链更多应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制:而FORWARD、PREROUTING、POSTROUTING链更多应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。

三.数据包过滤匹配流程
1.规则表之间的优先顺序
当数据包抵达防火墙时,将依次应用下面表中对应链内的规则(如果有规则的话),为从左到右的优先顺序。
raw表————mangle表————nat表————filter表
2.规则链之间的优先顺序
由于默认规则链是根据规则介入时机进行分类的,因此优先顺序直接取决于数据包的具体流向。
Ø       入站数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机(如Internet用户访问防火墙主机中Web服务的数据包),那么内核将其传递给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如httpd服务器)进行响应。
Ø       转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理,之后会进行路由选择,如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING链(是否修改数据包的地址等)进行处理。
Ø       出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙上测试公网DNS服务时),首先被OUTPUT链处理,之后进行路由选择,然后传递给POSTROUTING链(是否修改数据包的地址等)进行处理。
3.规则链内部各条防火墙规则之间的优先顺序
Ø       按规则顺序依次进行匹配和处理
Ø       如果找到一条能够匹配该数据包的规则,则不再继续检查后面的规则(使用LOG记录日志的规则除外)
Ø       如果对比完整个规则链,也找不到和数据包相匹配的规则,就按照该规则链的默认策略进行处理。
四.管理和设置iptables规则
1.使用iptables命令设置防火墙规则时,基本的命令格式为:
Iptables [-t 表名] 命令选项 链名 [条件匹配] [-j 目标动作或跳转]
2.常用的管理选项如下:
选项名
功能及特点
-A
在指定链的末尾添加一条新的规则
-D
删除指定链中的某一条规则,按规则序号或内容确定要删除的规则
-I
在指定链中插入一条新的规则,若未指定插入位置,则默认在链的开头
-R
修改、替换指定链中的某一条规则,按规则序号或内容来确定要删除的规则
-L
列出指定链中所有的规则进行查看,若未指定链名,则列出表中所有链的内容
-F
清空指定链中的所有规则,若未指定链名,则清空表中所有链的内容
-N
新建一条用户自定义的规则链
-X
删除指定表中用户自定义的规则链
-P
设置指定链的默认策略
-n
使用数字形式显示输出结果,如显示主机的IP地址而不是主机名
-v
查看规则列表时显示详细信息
-V
查看iptables命令工具的版本信息
-h
查看命令帮助信息
--line-numbers
查看规则列表时,同时显示规则在规则链中的顺序号
3.条件匹配
1)通用条件
Ø       协议匹配:“-p 协议名”
Ø       地址匹配:“-s 源地址”和“-d 目标地址”
Ø       网络接口匹配:“-i 网络接口名”和“-o 网络接口名”,分别对应接收数据包的网卡和发送数据包的网卡。
2)隐含条件匹配
Ø       端口匹配:“--sport 源端口号”和“--dport 目标端口号”,需要以“-p tcp”或“-p udp”匹配为前提,端口可以为单个端口号或用冒号“:”分隔的端口范围。
Ø       TCP标记匹配:“--tcp-flags 检查范围被设置的标记”,两个参数“检查范围”和“被设置的标记”均为TCP标记的列表,各标记之间用逗号分隔。“检查范围”告诉iptables需要检查数据包的哪几个标记,“被设置的标记”则明确匹配对应值为1的标记。需要以“-p tcp”或“-p udp”匹配为前提。
Ø       ICMP类型匹配:需要以“-p icmp”匹配为前提,使用“--icmp-type ICMP类型”的形式。ICMP类型可以使用字符串或数字代码,有3中TCMP类型:
u     请求:Echo-Reply(0)
u     回显:Echo-Request(8)
u     目标不可达:Destination-Unreachable(3)
3)显式条件匹配
这种匹配的功能需要由额外的内核模块提供,因此需要手工指定匹配方式。在iptables命令中使用“-m 模块关键字”的形式调用显示匹配,当然,还得指定对应的匹配内容。在使用过显式匹配以后,可以执行“lsmod | grep xt_”命令查看扩展防火墙功能的相关内核模块(如xt_mac,xt_state,xt_multiport等)。
常见的显式匹配有以下几种:
Ø       MAC地址匹配:主要用于检查数据包的源MAC地址,在iptables命令中使用“--mac-source MAC地址”
Ø       多端口匹配:用于匹配多个不连续的端口,使用“--dport 端口列表”或“--dport 端口列表”的形式,
Ø       多IP地址匹配:用于匹配一段范围内的IP地址,在iptables命令中使用“--src-range IP地址范围”或“--dst-range IP地址范围”。
Ø       状态匹配:基于iptables的状态跟踪机制,检查数据包的连接状态。常见的数据包状态主要包括3种:
u     NEW(与任何连接无关的)
u     ESTABLISHED(响应请求或已建立连接的)
u     RELATED(与已有连接有相关性的,如FTP数据连接)
4.数据包的控制
iptables对满足“条件匹配”指定条件的数据包,最常采用处理方式
Ø       ACCEPT:允许数据包通过
Ø       DROP:直接丢弃数据包,不给出任何回应信息
Ø       REJECT:拒绝数据包通过,必要时会给数据包发送端一个响应信息
Ø       LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。通常情况下,只要在规则链中找到一条相匹配的规则,则不再继续检查该链内后面的规则;但使用LOG处理方式的规则是一个特例,因此LOG只是一种辅助动作,并没有真正的处理数据包。
Ø       用户自定义链:将数据包传递给用户自定义的链(内的规则)进行处理
Ø       SNAT::修改数据包的源IP地址
Ø       DNAT:修改数据包的目标IP地址
五.设置iptables规则实例
例1:在filter表的INPUT链中插入一条规则(作为链中第2条规则)
[root@localhost ~]#iptables -I INPUT 2 -p icmp -j ACCEPT
例2:查看filter表INPUT链中所有规则,同时显示各条规则顺序号
[root@localhost ~]#iptables -L INPUT --line-numbers
例3:查看filter表各链中所有规则的详细信息,同时以数字形式显示地址和端口信息。
[root@localhost ~]# iptables -vnL
注意:-L选项放最后,否则会将vn当成链名。
例4:管理员在网关服务器上检测到来自某个IP网段(10.20.20.0/24)的频繁扫描,希望设置iptables规则封堵该IP地址段,两个小时后解封。
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -j DROP
[root@localhost ~]# iptables -I FORWARD -s 10.10.10.0/24 -j DROP
[root@localhost ~]# at now +2 hours //设置在2小时后删除封堵规则
at> iptables -D INPUT 1
at> iptables -D FORWARD 1
at>                             //此处按Ctrl+D组合键
job 1 at 2010-08-15 20:35
[root@localhost ~]#

例5:作为网关使用时,允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。
[root@localhost ~]# iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
例6:拒绝从外网接口(eth1)直接访问防火墙本机的数据包,但是允许响应防火墙TCP请求的数据包进入。
[root@localhost ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
[root@localhost ~]# iptables -I INPUT -i eth1 -p tcp ! --syn -j ACCEPT
注意:--syn的用法为兼容旧版本iptables的形式,此处等同于
--tcp-flags SYN,RST,ACK SYN
例7:禁止其他主机ping防火墙本机,但是允许从防火墙ping其他主机(允许接受ICMP回应数据)。
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Destination-Unreachable -j ACCEPT
例8:允许本机对外开放TCP端口20、21、25以及被动模式FTP端口1250~1280。
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,1250:1280 -j ACCEPT
例9:拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包。
[root@localhost ~]# iptables -A INPUT -p tcp -m state --state NEW -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
例10:在服务器上设置防火墙策略,只开放本机的Web服务(80端口)、FTP服务(21、20、20450~20480),放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包均予以丢弃处理。
[root@localhost ~]# iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
例11:对于尝试通过SSH方式登录防火墙主机的访问数据,记录日志信息并禁止其访问。
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j DROP
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j LOG
为了避免日志记录过于频繁,通常结合LIMIT显式匹配(-m limit)对日志写入频率进行限制。如:用于将记录日志的频率限制为平均3次/分钟,允许的峰值为8次。
[root@localhost ~]# iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
例12:自定义一个新的链LWB,转发自/至192.168.1.0/24网段的数据包均交给该链中的规则处理。
[root@localhost ~]# iptables -t filter -N LWB
[root@localhost ~]# iptables -A FORWARD -s 192.168.1.0/24 -j LWB
[root@localhost ~]# iptables -A FORWARD -d 192.168.1.0/24 -j LWB
[root@localhost ~]# iptables -A LWB -p icmp -j DROP
六.导出、导入防火墙规则
iptables软件包提供了两个命令iptables-save、iptables-restore,分别用于保存和恢复防火墙规则,使用这两个命令可以很方便地导出和导入规则。
1.iptables-save
直接执行iptables-save命令时,将会把当前设置的防火墙规则信息输出到终端。
例:将当前设置好的iptables规则保存到配置文件,并通过iptables服务脚本自动加载。
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
[root@localhost ~]# service iptables restart
[root@localhost ~]# chkconfig iptables on
2.iptables-restore
使用iptables-restore命令,可以从已保存的配置文件中导入iptables规则(该文件必须是使用iptables-save命令导出的配置数据)。
例:从已保存的规则配置文件中导入iptables规则。
[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 65 queries in 0.390 seconds