配置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

 

本文出自 “刘文斌” 博客,谢绝转载!

你可能感兴趣的:(职场,防火墙,iptables,休闲)