Total Pageviews

Thursday 13 June 2013

iptables详解及配置

在Internet中,企业通过架设各种服务器系统为用户提供丰富多彩的网络应用,例如Web网站、电子邮件系统、FTP服务器、数据库系统等。那么如何来保护这些特定的服务,过滤企业不需要的访问甚至是恶意的入侵呢?使用防火墙正是强有力的防护措施之一。
1、Linux防火墙基础
作 为隔离内外网、过滤非法数据的有力屏障,防火墙通常按实现环境的不同分为硬件防火墙和软件防火墙。硬件防火墙是功能专一的硬件设备,具有比较全面的功能, 其工作效率较高,但是加个昂贵,通常只应用于非常重要的主干网络节点。而软件防火墙的功能是由操作系统或软件程序实现的,可以在Linux或者 Windows等系统平台构建软件防火墙。软件防火墙的价格优势比较明显,配置也相对灵活,如果设置得当,同样可以实现硬件防火墙具有的功能和效率。 Internet中有大量的企业网络在使用Linux系统搭建软件防火墙.
1.1>、Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或称网络层防火墙)。Linux的防火墙体系基于内核编码实现,因此具有非常稳定的性能和高效率,也因此被更加广泛采纳和应用。
●>Linux防火墙发展历史
linux内核从很早的时候就实现了网络防火墙的功能,并为用户提供了管理防火墙规则的命令工具。
>>>在2.0版本的内核中,包过滤机制是ipfw,管理防火墙规则的命令工具是ipfwadm。
>>>在2.2版本的内核中,包过滤机制是ipchain,管理防火墙规则的命令工具是ipchains。
>>>在2.4版本的内核开始,包过滤机制是netfiter,管理防火墙的命令工具是iptables。
本文以iptables作为主要命令工具,学习Linux防火墙的配置和使用。
●>netfiter与iptables
在许多关于防火墙的资料中,netfiter和iptables通常都可以用来指Linux防火墙,往往容易引起混淆。两者的主要区别如下:
>>>netfiter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”(Kernel Space,又称内核空间)的防火墙功能体系
>>>iptables: 指的是管理防火墙的命令工具,程序通常位于/sbin/iptables,属于“用户态”(User Space,又称用户空间)的防火墙管理体系。
1.2>、iptables的规则表、链结构
iptables 的作用在于为包过滤的实现提供规则(或称策略),通过各种不同的规则,告诉netfiter对来自有些源、前往某些目的地或具有某些协议特征的数据包应该 如何处理。为了更方便地组织和管理防火墙策略,iptables采用了“表”和“链”的分层结构。每个规则“表”相当于内核空间的一个容器,根据处理数据 包的时机不同,表容器内包括不同的规则“链”。针对特定数据包的各种防火墙规则,按顺序依次放入对应的规则“链”中。

◆规则表
按照防火墙策略的不同用途,iptables管理着四个不同的规则表,其功能分别由独立的内核模块实现。
>>>filter表,包含三个规则链:INPUT,FORWARD,OUTPUT。
filter 表主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包。
filter 表对应的内核模块为 iptable_filter。
>>>nat表,包含三个规则链:PREROUTING,POSTROUTING,OUTPUT。
nat (Network Address Translation,网络地址转换)表主要用于修改数据包的IP地址、端口号等信息。
nat 表对应的内核模块为 iptable_nat。
>>>mangle表,包含五个规则链:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。
mangle 表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。
mangle 表对应的内核模块为 iptable_mangle。
>>>raw表,包含两条规则链:OUTPUT、PREROUTING。
raw表是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。
raw表对应的内核模块为iptable_raw。
Ps:在iptables的四个规则表中,mangle表和raw的表应用相对较少,下面主要介绍filter表和nat表的防火墙应用。
规则链
在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,其应用时间点分别对应如下。
>>>INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
>>>OUTPUT链:当防火墙本机向外发送数据包(出战)时,应用次链中的规则。
>>>FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用次链中的规则。
>>>PREROUTING链:在对数据包作路由选择之前,应用次链中的规则。
>>>POSTROUTING链:在对数据包作路由选择之后,应用次链中的规则。
Ps:期中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。
1.3>、数据包过滤匹配流程
在 前面内容中,已经介绍过iptables管理的4个默认表和5种规则链,在每个表的规则链里都可以设置防火墙规则,防火墙将根据这些规则来决定如何处理数 据包。那么,当网络数据包到达防火墙以后,会有限使用哪一个表、哪一个链里的规则呢?数据包出入防火墙的规则匹配过程是怎样的?下面从不同的角度依次介绍 数据包过滤的匹配流程。
ⅰ>、规则表之间的优先顺序
当数据包抵达防火墙时,将依次应用raw、mangle、nat和filter表中对应链内的规则(如果有的话)就像上图;
ⅱ>、规则链之间的优先顺序
由于默认规则链是根据规则介入时机进行分类的,因此优先顺序直接取决于数据包的具体流程;

ⅰ>、 入站数据流向: 来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果 数据包的目标地址是防火墙本机(如Internet用户访问防火墙主机中的Web服务的数据包),那么内核将其传递给INPUT链进行处理(决定是否允许 通过等),通过以后再交给系统上层的应用程序(如httpd服务器)进行响应。
ⅱ>、 转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING规则处理,之后会进行路由选择,如果数据包的目标地址是其他外部地址(如局域网 用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再讲给POSTROUTING规则链(是否修改 数据包的地址等)进行处理。
ⅲ>、出战数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
1.4>、规则链内部各条防火墙规则之间的优先顺序
在 数据包经由各条规则链的处理过程中,依次按第1条规则、第2条规则、第3条规则.....的顺序进行匹配和处理。如果找到一条能够匹配该数据包的规则,则 不会继续检查后面的规则(使用LOG记录日志的规则除外,下面iptables配置说明)。如果比对完整个规则链,也找不到和数据包相匹配的规则,就按照 该规则链的默认策略进行处理。
2、管理和设置iptables规则
前面讲解了linux防火墙的表、链结构,下面讲述netfilter防火墙的管理工具——iptables命令的使用。
2.1 >、iptables的基本语法格式
使用iptables命令设置防火墙规则时,其基本的命令格式如下:
iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
其 中,表名、链名用于指定iptables命令所操作的表和链,若未指定表名,将默认使用filter表;命令选项用于指定管理iptables规则的方 式,如插入、增加、删除以及查看等;条件匹配用于指定对符合什么样条件的数据包进行处理;目标动作或跳转用于知道数据包的处理方式,如允许通过、拒绝、丢 弃或跳转(jump)给其他链进行处理等。
2.2>、管理iptables规则
在管理iptables防火墙的过程中,首先需要考虑的就是如何查看规则、添加规则、清空链内的规则等基本操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                iptables 命令的管理控制选项
选项名     功能及特点
-A      在指定链的末尾添加(--append)一条新的规则
-D      删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则
-I      在指定链中插入(--insert)一条新的规则,若未指定插入位置,则默认在链的开头插入
-R      修改、替换(--replace)指定链中的某一条规则,按规则序号或内容确定要替换的规则
-L      列出(--list)指定链中的所有的规则进行查看,若未指定链名,则列出表中所有链的内容
-F      清空(--flush)指定链中的所有规则,若未指定链名,则清空表中所有链的内容
-N      新建(--new-chain)一条用户自己定义的规则链
-X      删除指定表中用户自定义的规则链(--delete-chain)
-P      设置指定链的默认策略(--policy)
-n      使用数字形式(--numeric)显示输出结果,若显示主机的IP地址而不是主机名
-v      查看规则列表时显示详细(--verbose)的信息
-V      查看iptables命令工具的版本(--Version)信息
-h      查看命令帮助信息(--help)
--line-number   查看规则列表时,同时显示规则在链中的顺序号
其中,添加、插入、删除、清空规则和查看规则是最常用的管理选项,下面通过实例的方式显示部分选项的应用。
Α、添加及插入规则
eg     :在filter表的INPUT链的末尾添加一条防火墙规则。

1
[root@node1 ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
eg :  在filter表的INPUT链中插入一条防火墙规则(此处省略了“-t filter”选项,按默认处理filter表)。
1
[root@node1 ~]# iptables -I INPUT -p udp -j ACCEPT
eg:   在filter表的INPUT链中插入一条防火墙规则(作为链中的第二条规则)。
1
[root@node1 ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
B、查看规则列表
eg:   查看filter表INPUT链中的所有规则,同时显示各条规则的顺序号。(下面是对比图)
1
[root@node1 ~]# iptables -L INPUT --line-numbers
1
[root@node1 ~]# iptables -L INPUT

C、删除、清空规则
eg:   删除filter表INPUT链中的第2条规则。

1
[root@node1 ~]# iptables -D INPUT 2

eg: 清空filter表、nat表、mangle表各链中的所有规则。

1
2
3
[root@node1 ~]# iptables -F             //不指定表名时默认清空filter表
[root@node1 ~]# iptables -t nat -F
[root@node1 ~]# iptables -t mangle -F
D、设置规则链的默认策略
最基本的两种策略为ACCEPT(允许)、DROP(丢弃)。
eg:  将filter表中FORWARD规则链的默认策略设为DROP

1
[root@node1 ~]# iptables -t filter -P FORWARD DROP

E、获得iptables相关选项用法的帮助信息
eg:  查看iptables命令中关于icmp协议的帮助信息(在输出内容的最后部分列出)。

1
[root@node1 ~]# iptables -p icmp -h
F、新增、删除自定义规则链
eg:  在raw表中新增一条自定义的规则链,链名为TCP_PACKETS.

1
[root@node1 ~]# iptables -t raw -N TCP_PACKETS

eg:  清空raw表中的用户自定义的所有规则链。

1
[root@node1 ~]# iptables -t raw -X

Ps:在iptables的规则表中,允许用户自定义新的链。但是需要在默认的链中添加相应的跳转策略(如“iptables -I INPUT ...... -j 自定义链名”),否则在处理数据包时将不会使用自定义链中的规则。后面会给个例子;好累~~~
2.3>、条件匹配
对于Linux防火墙来说,应该对什么样的数据包进行过滤,对什么样的数据包做地址转换......,对于一条有效的防火墙策略来说,条件匹配的设置起着决定性的作用,Linux防火墙需要非常清楚的知道针对符合什么条件的数据包进行什么样的处理。
区分数据包的条件匹配方式可以分为通用匹配、隐含匹配和显式匹配,各种匹配条件可以结合在一起使用。
A、通过(general)条件匹配
这种匹配操作一般可以直接使用,而不依赖于其他的条件匹配及其扩展。常见的通用匹配方式包括以下集中。
>>> 协议匹配。用于检查数据包的网络协议(--protocal),允许使用的协议名包含在/etc/protocols文件中,常见的为tcp、udp、 icmp和all(针对所有IP数据包)。在iptables命令中使用“-p 协议名”的形式。
eg:  拒绝进入防火墙的所有icmp协议数据包。
1
[root@node1 ~]# iptables -I INPUT -p icmp -j REJECT
eg  :允许防火墙转发除icmp协议以外的所有数据包(使用惊叹号"!"可以将除条件取反)。
1
[root@node1 ~]# iptables -A FORWARD ! -p icmp -j ACCEPT

>>>地址匹配。用于检查数据包的IP地址、网络地址。在iptables命令中使用“-s 源地址”和“-d 目标地址”的形式,分别对应于源(--source)地址和目标(--destination)地址。
eg:  拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.0.0/24网段的数据。
1
2
[root@node1 ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
[root@node1 ~]# iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
>>> 网络接口匹配。用于检查数据包从防火墙的哪一个接口进入或离开。在iptables命令中使用“-i 网络接口名”和“-o 网络接口名”的形式,分别对应于接收数据包(--in-interface)的网卡和发送数据包(--out-interface)的网卡
eg: 丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包。
1
2
3
[root@node1 ~]# iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
[root@node1 ~]# iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
[root@node1 ~]# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

eg: 管理员在网关服务器上检测到来自某个IP网段(如 10.20.30.0/24)的频繁扫描,希望设置iptables规则封堵该IP地址段,两小时后解封。
1
2
3
4
5
6
7
[root@node1 ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
[root@node1 ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
[root@node1 ~]# at now +2 hours
at> iptables -D INPUT 1
at> iptables -D FORWARD 1
at><EOT>                             //此处按Ctrl+D组合键
job 4 at 2013-06-11 22:47
B、隐含(Implicit)条件匹配
这种匹配通常需要以指定的协议匹配为前提,其对应的功能由iptables自动(隐含)的装载入内核,一般不需要用户收到加载模块。常见的隐含匹配方式包括以下几种。
>>> 端口匹配。用于检查数据包的TCP或UDP端口号,需要以“-p tcp”或“-p udp”匹配为前提。在iptables命令中使用“--sport 源端口号”、“--dport 目标端口”的形式,分别对应于源端口(--source-port)、目标端口(--destination-port)。端口可以表示为单个端口号或者 用冒号“:”分割的端口范围。
eg:  仅允许系统管理员从202.13.0.0/16 网段使用SSH方式远程登录防火墙主机。
1
2
[root@node1 ~]# iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
eg:  允许本机开放从TCP端口20-1024提供的应用服务
1
2
[root@node1 ~]# iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
[root@node1 ~]# iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
eg:  作为网关使用时,允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。
1
2
[root@node1 ~]# iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
[root@node1 ~]# iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
>>>、 TCP标记匹配。用于检查数据包的TCP标记位(--tcp-flags),需要以“-p tcp”匹配为前提。在iptables命令中使用“--tcp-flags检查范围被设置的标记”的形式,两个参数“检查范围”和“被设置的标记”均为 TCP标记的列表,各标记之间用逗号分割。“检查范围”告诉iptables需要检查数据包的哪几个标记,“被设置的标记”则明确匹配对应值为1的标记。
eg:  拒绝从接口(eth0)直接访问防火墙本机的数据包,但是允许响应防火墙TCP请求的数据包进入。
1
2
[root@node1 ~]# iptables -P INPUT DROP     //此命令执行小心,不提前设置通过ssh的话,你的远程直接就断开了
[root@node1 ~]# iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
>>>、 ICMP类型匹配。用于检查ICMP数据包的类型(--icmp-type),有选择的过滤数据包,需要以“-p icmp”匹配为前提。在iptables命令中使用“--icmp-type ICMP类型”的形式。ICMP类型可以使用字符串或数字代码,例如“Echo-Request”(数字代码为8)、“Echo-Reply”(数字代码 为0)、“Destination-Unreachable”(数字代码为3),分别对应ICMP协议的请求、回显、目标不可达数据。
eg:  禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机(允许接受ICMP回应数据)。
1
2
3
iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP
iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
C、  显式(Explicit)条件匹配
这 种匹配的功能需要由额外的内核模块提供,因此需要手工指定匹配方式。在iptables命令中使用“-m 模块关键字”的形式调用显式匹配,当然,还的指定对应的匹配内容。在使用过显式匹配以后,可以执行“lsmod |grep xt_”命令查看到扩展防火墙功能的相关内核模块(如:xt_mac,xt_state,xt_multiport等)。常见的显式匹配包括以下几种。
>>>、MAC地址匹配。主要用于检查数据包的源MAC地址。在iptables命令中使用“--mac-source MAC地址”的形式。
eg:  禁止转发来自MAC地址为3C-97-0E-77-7F-67(这是我本机的mac)的主机的数据包
1
[root@node1 ~]# iptables -A FORWARD -m mac --mac-source 3C-97-0E-77-7F-67 -j DROP

>>>、多端口匹配。检查数据包的源端口、目标端口时,用于匹配多个不连续的端口号。在iptables命令中主要使用”--dports 端口列表“或者”--sports 端口列表“的形式,分别对应源端口地址列表、目标端口地址列表。
eg :  允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280。
1
[root@node1 ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT

>>>、 多IP地址匹配。检查数据包的源地址、目标地址时,用于匹配一段范围内的IP地址。在iptables命令中主要使用”--src-range IP地址范围“或者”--dst-range IP地址范围“的形式,分别对应源IP地址范围、目标ip地址范围。
eg: 禁止转发源IP地址为192.168.1.20~192.168.1.99 的TCP数据包。
1
[root@node1 ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP

>>>、 状态匹配。基于iptables的状态跟踪机制,检查数据包的链接状态(State)。常见的数据包状况主要包括NEW(与任何连接无关的)、 ESTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接有相关性的,如FTP数据连接)。
eg:  禁止转发与正常TCP连接无关的非--syn请求数据包(如网络中可能存在的一些非法攻击数据包)。
1
[root@node1 ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
eg : 拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包。
1
2
[root@node1 ~]# iptables -A INPUT -p tcp -m state --state NEW -j DROP
[root@node1 ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
eg:  在服务器上设置防火墙策略,只开放本机的Web服务(80端口)、FTP服务(21、20端口、20450~20480),放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包均予以丢弃处理。
1
2
3
4
[root@node1 ~]# iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
[root@node1 ~]# iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
[root@node1 ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@node1 ~]# iptables -P INPUT DROP
2.4>、数据包控制
在上面通过一些iptables规则的实例,已经接触到了如ACCEPT、DROP、REJECT等数据包控制方式。iptables对满足”条件匹配“指定条件的数据包,最常采用的处理方式如下。
>>>>>、ACCEPT    允许数据包通过。
>>>>>、DROP       直接丢弃数据包,不给出任何回应信息。
>>>>>、REJECT     拒绝数据包通过,必须时会给数据发送端一个响应信息。
>>>>>、 LOG         在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。通过情况下,只要在规则链中找到一条相匹配的规则,则不再继续检查该链内后面的规则;但使用LOG处 理方式的规则是一个特例,因为LOG只是一个辅助动作,并没有真正的处理数据包。
eg:  对于尝试通过SSH方式登录防火墙主机的访问数据,记录日志信息并禁止其访问。
1
2
[root@node1 桌面]# iptables -I INPUT -p tcp --dport 22 -j DROP
[root@node1 桌面]# iptables -I INPUT -p tcp --dport 22 -j LOG
这个时候当我在ssh的时候,会发现如下截图的情况:

tail -f /var/log/messages 查看本机log发现

为了避免日志记录过于频繁,通过结合LIMIT显式匹配(-m limit)对日志写入频繁进行限制。例如以下规则,用于将记录日志的频率限制为平均三次/分钟,允许的峰值为八次。
1
[root@node1 ~]# iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
>>>、 用户自定义链 将数据包传递给用户自定义的链(内的规则)进行处理。
eg:自定义一个新的链MY1,转发自/至192.168.1.0/24网段的数据包均交给该链中的规则处理。
1
2
3
4
5
[root@node1 ~]# iptables -t filter -N MY1
[root@node1 ~]# iptables -A FORWARD -s 192.168.1.0/24 -j MY1
[root@node1 ~]# iptables -A FORWARD -d 192.168.1.0/24 -j MY1
[root@node1 ~]# iptables -A MY1 -p icmp -j DROP
[root@node1 ~]# .....接着可以添加更多规则
今天就到此了,实在写不动了,字数快到了;累死
PS:关于:SNAT(Source Network Address Translation,源地址转换)修改数据包的源IP地址。
                 DNAT(Destination Network Address Translation,目标地址转换)修改数据包的目标地址。
                 防火墙脚本、导出、导入防火墙规则的详解及配置见下篇吧。

from http://lansgg.blog.51cto.com/5675165/1220438
--------------------------------------

在上一篇博文介绍了Linux防火墙的表、链结构及iptables规则设置。那么,当Linux防火墙同时作为企业的网关服务器使用的时候,怎样 使局域网用户也能够访问互联网呢?又怎样才能使互联网中的用户能够访问到局域网内部的网络服务器?iptables真的能做到这些吗?答案是:Yes。
本文主要针对前面的问题进行解决,主要介绍nat表中的两个典型应用:SNAT和DNAT策略(分别用于实现企业局域网共享上网、在Internet中发布内网的应用服务器)。
上一篇博文地址:http://lansgg.blog.51cto.com/5675165/1220438
1、SNAT策略及应用
>>>SNAT策略概述
  随着Internet网络在全世界范围内的快速发展,IPv4协议支持的可用IP地址资源逐渐变得山穷水尽,资源匮乏使得很多企业难以申请更多的公网IP 地址,或者只能承受一个或者少数几个公网IP地址的费用。而与此同时,大部分企业都面临着将局域网的主机接入Internet的需求。使用 iptables的SNAT策略,可以基本化解这个难题。
案例:1、
在一个小型的企业网络中,Linux网关服务器有两块网卡,分别用于连接内部局域网和Internet;如下图

当 Linux网关服务器正常开启路由转发(未使用SNAT)时,局域网访问Internet的数据包,经网关转发后其源IP地址保持不变(仍为 192.168.1.100),而Internet中主机收到这样的请求数据包后,将无法为其返回应答数据包(因为该地址是私有IP地址,无法为其正确路 由),从而导致访问失败;
如果在Linux网关服务器中有针对性的应用SNAT策略,数据包转发情况就不一样了。当局域网访问 Internet的数据包到达网关服务器时,网关进行路由选择,若发现该数据包需要从外网接口(如eth0)向外转发,则将该数据包的源IP地址 (如:192.168.1.100)修改为网关的外网接口地址(如:218.29.30.31),然后才提交到Internet中,最后发送到目标主机(www.google.com)。 相当于以网关服务器的公网身份提交数据访问请求,自然就可以收到正常的响应数据包。然后网关服务器再根据之前建立的SNAT映射,将响应数据包返回给局域 网中的源主机。只要连接到第一个包被SNAT处理了,那么这个连接及对应数据流的其他包通常也会自动的被进行SNAT处理。
>>>SNAT策略应用;(解决上述问题)
从前面的需求中,大致了解到,SNAT典型应用于局域网共享上网的接入,而处理数据包的切入时机,主要选择在路由选择之后(POSTROUTING)进行。SNAT的关键在于将局域网外发数据包的源IP地址(私有地址)修改为网关的外网接口IP地址(公有地址)。
SNAT只能用于nat表的POSTROUTING链。使用iptables命令设置SNAT策略时,需要结合“--to-source IP地址”选项指定修改后的IP地址(例如:-j SNAT --to-source 218.29.30.31).
下面通过实例配置来说明SNAT策略的用法,案例环境及需求描述如下。(拓扑图如上)
》、公司的网关服务器使用了Linux操作系统。
》》、网关上有两块网卡: 期中eth0连接Internet,使用固定IP地址 218.29.30.31/30;eth1连接局域网,使用固定IP地址192.168.1.1/24。
》》》、局域网内各主机的默认网关设置为192.168.1.1,且已经设置了正确的DNS服务器。
》》》》、现需要在Linux网关主机中进行正确配置,以使192.168.1.0/24网段的局域网用户能够共享方式访问Internet。
根据上述环境,在Linux网关中推荐的操作步骤如下。
(1)、确认开启网关服务器的路由转发功能。
1
2
3
[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
(2)、为局域网访问Internet的数据包采用SNAT策略,将源地址更改为服务器的公网IP地址。
1
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
使用局域网内的客户机访问Internet中的网站(如:www.baidu.com)进行测试,测试成功以后将上述SNAT策略添加到防火墙脚本文件中,并设置未开机后自动运行。
Ps 以上介绍的应用是网关服务器具有固定的静态公网IP地址的情况,而在某些时候,企业很可能使用非固定的动态公网地址,例如使用ADSL宽带接入时可能获得 是动态IP地址。那么在这种网络环境下,又应该如何设置SNAT策略呢?iptables提供了一个名为MASQUERADE(伪装)的数据包处理方 式,MASQUERADE相当于SNAT的特例,同样也完成修改(伪装)数据包源IP地址的工作,只不过它会自动获取外网接口的IP地址,而无需使用 “--to-source”的形式。
  使用iptables命令设置MASQUERADE策略时,只需要去掉SNAT策略中的“--to-source IP地址”,改用“-j MASQUERADE”指定数据包处理方式即可。ADSL通常使用PPPOE技术,在Linux系统中,对应的连接名称为ppp0、ppp1等,如果无法 确定连接的编号,还可以使用ppp+代替。
eg:  设置MASQUERADE策略,使用192.168.1.0/24网段能够通过网关的ppp0连接共享上网。
1
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
当然,即使网关服务器有静态的IP地址,也同样可以使用MASQUERADE,而不用SNAT。只不过,MASQUERADE会比SNAT多一些额外的开销,因此如果有固定的IP地址,最好还是使用SNAT策略。
2、DNAT策略及应用
>>>DNAT策略概述
DNAT策略与SNAT非常相似,只不过应用方向反过来了。SNAT用于修改源IP地址,而DNAT用于修改目标IP地址;SNAT只能在nat表的 POSTROUTING链中,而DNAT只能用在nat表的PREROUTING链和OUTPUT链(或被其调用的链)中。
 例如:考虑到应用服务的安全和稳定性,公司将对外的Web服务器架设在一个内部网络中,而公司仍然只有一个公网IP地址,又需要使Internet中的 客户机能够访问公司的网站,这时候,使用DNAT策略可以有效保证位于内网中的网站服务器于Internet中的客户机的相互通讯。

由 于企业申请的Internet域名要解析到一个合法的公网IP地址(如:218.29.30.31),当Internet中的客户机提交的http请求到 达企业的网关主机时,网关首先判断该数据包的目标地址和目标端口,若发现该数据包需要访问本机的80端口,则将该数据包的目标IP地址 (如:218.29.30.31)修改为内网中真正的网站服务器的IP地址(如:192.168.1.6),然后才进行路由选择,最后发送到内部的网站服 务器(192.168.1.6).然后网关服务器再根据之前建立的DNAT映射,修改返回的HTTP应答数据包的源IP地址,最后返回给Internet 中的客户机。
在上述的DNAT转换地址的过程,Internet中的客户机无需指定企业网站服务器的真实局域网地址,中间的转换完全由网关主机完成。通过DNAT策略,位于企业内部的应用服务器就可以对Internet提供服务了。
>>>DNAT策略的应用
   使用iptables命令设置DNAT策略时,需要结合"--to-destination IP地址"的选项指定企业内网服务器的实际IP地址(如:-j DNAT --to-destination 218.29.30.31)。下面将通过两个实例来说明DNAT策略的用法。
案例:1、见上图拓扑:
》、公司在ISP注册了域名 www.lansgg.com,并对应于Linux网关的外网的接口(eth0)地址:218.20.30.31.
》》、公司的网站服务器位于局域网内,IP地址为192.168.1.6。
》》》、Internet用户可以通过访问www.lansgg.com来查看公司的网站内容。
根据上述环境,在Linux网关中推荐的操作步骤如下:
(1)确认开启网关服务器的路由转发功能。
1
2
3
[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
(2)在网关上添加DNAT映射,对于访问网关80端口的数据包,将目标地址更改为网站服务器的内网IP地址。
1
[root@node1 ~]# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
使用Internet中客户机访问http://www.lansgg.com进行测试,测试成功以后将上述DNAT策略添加到网关的防火墙脚本文件中,并设置为开机后自动运行。
Ps: 如果没有设置SNAT共享上网策略,内网的客户机可能将无法使用公网地址(如:218.29.30.31)的形式访问公司内部的网站服务器。若确实有这种需求,可以有针对性的添加一条SNAT规则,如下命令:
1
[root@node1 ~]# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -d 218.29.30.31 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1
案 例:2、若需要做DNAT的内部服务与网关主机本身的服务发送冲突,则需要对数据访问进行区分。例如,Linux网关本身运行了SSH服务,内部网络中的 数据库服务器也运行了SSH服务,两台主机都希望能从Internet中进行远程管理。由于可用的公网IP地址只有一个,因此就有必要在网关上根据访问端 口进行区分。SSH服务器默认使用的端口号为22。

》、公司的Linux网关服务器的外网IP地址eth0:218.29.30.31;位于局域网的数据库服务器IP地址:192.168.1.5;
》》、根据公司安排,管理员要能够随时从家里的主机远程管理数据库服务器,登录的目标地址为218.29.30.31:2222
》》》、管理员家里主机的IP地址可能在63.34.45.0/24网段范围中随机变动。
根据上述环境,应用DNAT策略的思路如下。
>、访问218.29.30.31:22的数据仍保持默认(不做处理),对应网关主机本身的SSH服务。
>>、两台主机的SSH服务都使用默认的22端口不变。
>>>、在网关主机上,将访问本机2222端口的数据包进行DNAT处理,对应到内部网络中的数据库服务器(需要同时指定目标端口)。
推荐操作步骤如下;
(1)、在数据库服务器上开启ssh服务,(注意设置好路由或默认网关记录)
1
2
service sshd start
route add -net 63.34.45.0/24 gw 192.168.1.1
(2)、确认开启网关服务器的路由转发功能。
1
2
3
[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
(3)、在网关上添加DNAT映射,对于访问网关2222端口的数据包,将目标地址更改为数据库服务器主机的内网IP地址
1
[root@node1 ~]# iptables -t nat -A PREROUTING -i eth0 -s 63.34.45.0/24 -d 218.29.30.31 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.5:22
经测试成功以后,将上述DNAT策略添加到防火墙脚本文件中,并设置为开机后自动运行。
下面是防火墙脚本方面的东西;
前面已经学会了iptables命令的语法和简单的规则设置。在添加防火墙规则时,必须充分理解数据包匹配的流程,尤其是规则链内的匹配流程。这样才能更好的优化规则顺序,提高包过滤机制的效率和准确性。
3、导出、导入防火墙规则
iptables软件包提供了两个命令:iptables-save、iptables-restore,分别用于保存(save)和恢复(restore)防火墙规则,使用这两个命令可以很方便的导出和导入规则。
>>>>>、iptables-save
直接执行iptables-save命令时,将会把当前设置的防火墙规则信息输出到终端。

通常情况下,可以使用重定向将信息保存为指定的配置文件,结合系统默认提供的iptables服务脚本,可以自动加载位于/etc/sysconfig/iptables文件中的规则设置。
eg:将当前调试好的iptables规则保存到配置文件,并通过iptables服务脚本自动加载。
1
2
3
4
5
6
7
[root@node1 ~]# iptables-save >/etc/sysconfig/iptables
[root@node1 ~]# service iptables restart
iptables:清除防火墙规则:                                 [确定]
iptables:将链设置为政策 ACCEPT:raw mangle nat filter     [确定]
iptables:正在卸载模块:                                   [确定]
iptables:应用防火墙规则:                                 [确定]
[root@node1 ~]# chkconfig --level 35 iptables on
>>>、iptables-restore
使用iptables-restore命令,可以从已保存的配置文件中导入iptables规则(该文件必须是使用iptables-save命令导出的配置数据)。
eg : 从已保存的规则配置文件中导入iptables规则。
1
[root@node1 ~]# iptables-restore </etc/sysconfig/iptables
就到这里吧.

from http://lansgg.blog.51cto.com/5675165/1220807
----------------------------------------------------

iptables防火墙配置详解


iptables简介
iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表。
filter负责过滤数据包,包括的规则链有,input,output和forward;
nat则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;
mangle表则主要应用在修改数据包内容上,用来做流量整形的,默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;
input匹配目的IP是本机的数据包,forward匹配流经本机的数据包,prerouting用来修改目的地址用来做DNAT,postrouting用来修改源地址用来做SNAT。
iptables主要参数
-A 向规则链中添加一条规则,默认被添加到末尾
-T指定要操作的表,默认是filter
-D从规则链中删除规则,可以指定序号或者匹配的规则来删除
-R进行规则替换
-I插入一条规则,默认被插入到首部
-F清空所选的链,重启后恢复
-N新建用户自定义的规则链
-X删除用户自定义的规则链
-p用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号,
-s指定源地址
-d指定目的地址
-i进入接口
-o流出接口
-j采取的动作,accept,drop,snat,dnat,masquerade
--sport源端口
--dport目的端口,端口必须和协议一起来配合使用
注意:所有链名必须大写,表明必须小写,动作必须大写,匹配必须小写
iptable配置实例
iptable基本操作
iptables -L  列出iptables规则
iptables -F  清除iptables内置规则
iptables -X  清除iptables自定义规则
设定默认规则
在iptables规则中没有匹配到规则则使用默认规则进行处理
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
配置SSH规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT  如果你把OUTPUT 设置成DROP,就需要加上这个规则,否则SSH还是不能登录,因为SSH服务职能进不能出。
只允许192.168.0.3的机器进行SSH连接
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.
允许loopback回环通信
IPTABLES -A INPUT -i lo -p all -j ACCEPT
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
目的地址转换,映射内部地址
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.2:80
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.1-192.168.0.10
源地址转换,隐藏内部地址
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
地址伪装,动态ip的NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
masquerade 和snat的主要区别在于,snat是把源地址转换为固定的IP地址或者是地址池,而masquerade在adsl等方式拨号上网时候非常有用,因为是 拨号上网所以网卡的外网IP经常变化,这样在进行地址转换的时候就要在每次都要修改转换策略里面的ip,使用masquerade就很好的解决了这个问 题,他会自己去探测外网卡获得的ip地址然后自动进行地址转换,这样就算外网获得的ip经常变化也不用人工干预了。
开启转发功能
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 只允许已建连接及相关链接对内转发
ptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 允许对外转发
过滤某个MAC
iptables -A FORWARD -m mac --mac -source MAC地址 -j DROP
报文经过路由后,数据包中原有的MAC信息会被替换,所以在路由后的iptables中使用mac匹配没有意义。
数据包整流
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
多端口匹配
用以一次匹配多个端口
iptables -A INPUT -p tcp -m muliport --dport s 21,22,25,80,110 -j ACCEPT
丢弃非法连接
iptables -A INPUT   -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables-A FORWARD -m state --state INVALID -j DROP
存储于恢复iptables规则
iptables-save > somefile
iptables-restore < somefile
----------------------------


基本概念

什么是防火墙?

在计算中,防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。
防火墙分为软件防火墙和硬件防火墙,他们的优缺点:
硬件防火墙:拥有经过特别设计的硬件及芯片,性能高、成本高(当然硬件防火墙也是有软件的,只不过有部分功能由硬件实现,所以硬件防火墙其实是硬件+软件的方式);
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能比硬件防火墙低、成本低。

Netfilter与iptables的关系

Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
  • 网络地址转换(Network Address Translate)
  • 数据包内容修改
  • 以及数据包过滤的防火墙功能
Netfilter平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING
Netfilter所设置的规则是存放在内核空间中的,而iptables是一个应用层的应用程序,它通过Netfilter放出的接口来对存放在内核空间中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件,类似的应用程序还有firewalld(CentOS7默认防火墙)。
所以Linux中真正的防火墙是Netfilter,但由于都是通过应用层程序如iptables或firewalld进行操作,所以我们一般把iptables或firewalld叫做Linux的防火墙。
注意:以上说的iptables都是针对IPv4的,如果IPv6,则要用ip6tables,至于用法应该是跟iptables是一样的。
注:Linux系统运行时,内存分内核空间和用户空间,内核空间是Linux内核代码运行的空间,它能直接调用系统资源,用户空间是指运行用户程序的空间,用户空间的程序不能直接调用系统资源,必须使用内核提供的接口“system call”。

链的概念

iptables开启后,数据报文从进入服务器到出来会经过5道关卡,分别为Prerouting(路由前)、Input(输入)、Outpu(输出)、Forward(转发)、Postrouting(路由后).
每一道关卡中有多个规则,数据报文必须按顺序一个一个匹配这些规则,这些规则串起来就像一条链,所以我们把这些关卡都叫“链”.
  • INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;
  • OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则;
  • FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则;
  • PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT;
  • POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。
其中中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。

表的概念

虽然每一条链上有多条规则,但有些规则的作用(功能)很相似,多条具有相同功能的规则合在一起就组成了一个“表”,iptables提供了四种“表”:
– filter表:主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter;
– nat表:network address translation,网络地址转换功能,主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat;
– mangle表:拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle;
– raw表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。
我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。

表链关系

5条链(即5个关卡)中,并不是每条链都能应用所有类型的表,事实上除了Ouptput链能同时有四种表,其他链都只有两种或三种表:


实际上由上图我们可以看出,无论在哪条链上,raw表永远在mangle表上边,而mangle表永远在nat表上边,nat表又永远在filter表上边,这表明各表之间是有匹配顺序的。
前面说过,数据报文必须按顺序匹配每条链上的一个一个的规则,但其实同一类(即属于同一种表)的规则是放在一起的,不同类的规则不会交叉着放,按上边的规律,每条链上各个表被匹配的顺序为:raw→mangle→nat→filter
前面说过,我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中,所以我们实际操作是对“表”进行操作的,所以我们反过来说一下,每种表都能用于哪些链:
表名能应用的链
rawpreroutingoutput
manglepreroutinginputforwardoutputpostrouting
natpreroutinginput(仅centos7)outputpostrouting
filterinputforwardoutput
综上,数据包通过防火墙的流程可总结为下图:

规则的概念

iptables规则主要包含“条件&动作”,即匹配出符合什么条件(规则)后,对它采取怎样的动作。

匹配条件

  • S_IP:source ip,源ip
  • S_PORT:source port,源端口
  • D_IP: destination ip,目标ip
  • D_PORT: destination port,目标端口
  • TCP/UDP:第四层(传输层)协议

处理的动作

  • ACCEPT:允许数据包通过;
  • DROP:直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;
  • REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应的信息;
  • SNAT:S指Source,源NAT(源地址转换)。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上;
  • DNAT:D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;
  • REDIRECT:在本机做端口映射;
  • LOG:/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。
    除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。
其中REJECT和DROP有点类似,以下是服务器设置REJECT和DROP后,ping这个服务器的响应的区别:
REJECT动作:
PING 10.37.129.9 (10.37.129.9): 56 data bytes
92 bytes from centos-linux-6.5.host-only (10.37.129.9): Destination Port Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 29a3   0 0000  40  01 3ab1 10.37.129.2  10.37.129.9

Request timeout for icmp_seq 0
92 bytes from centos-linux-6.5.host-only (10.37.129.9): Destination Port Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 999d   0 0000  40  01 cab6 10.37.129.2  10.37.129.9
DROP动作:
PING 10.37.129.9 (10.37.129.9): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4

iptables命令操作

对iptables进行操作,其实就是对它的四种“表”进行“增删改查”操作。

启动iptables

由于国内大部分公司的服务器都采用CentOS系统,所以这里以CentOS为例。CentOS6及其之前的CentOS系统都默认使用iptables防火墙,但CentOS7默认已经没有iptables防火墙了,取而代之的是firewalld,不过你还是可以自己安装iptables。
对于CentOS6:
启动iptables(事实上应该叫“加载”iptables模块更合适,前面也说过iptables并不是一个真正的服务,它没有进程,这意味着你用ps -ef | grep iptables是看不到进程的):
service iptables start
Bash
其它命令:
# 查看启动状态
service iptables status
# 停止iptables
service iptables stop
# 重启iptables(重启其实就是先stop再start)
service iptables restart
# 重载就是重新加载配置的规则,在这里貌似跟重启一样
service iptables reload
Bash
对于CentOS7:
前面说过,CentOS7默认没有iptables(CentOS7默认防火墙是firewalld),但我们还是可以自己安装iptables。
CentOS7关闭firewalld防火墙:
systemctl stop firewalld
Bash
CentOS7关闭firewalld防火墙开机启动:
systemctl disable firewalld
Bash
CentOS7安装iptables防火墙:
sudo yum -y install iptables
Bash
CentOS7安装iptables的service启动工具:
sudo yum -y install iptables-services
Bash
安装完之后,所有启动、停止之类的操作与CentOS6都一样,参考前面CentOS6的操作即可。
但实际上在CentOS7中用service来操作程序的启停,它会自动跳转到使用systemctl,所以其实除了用CentOS6的方法,还可以用CentOS7的:
# 启动iptables
systemctl start iptables
# 查看iptables状态
systemctl status iptables
# 停止iptables
systemctl stop iptables
# 重启iptables
systemctl restart iptables
# 重载iptables
systemctl reload iptables
Bash
这里要特别注意,稍微了解Linux的童鞋都知道,service命令是用于启动Linux的进程的(参见这里),但在这里是例外,service iptables start并没有启动一个进程,你无法用ps aux | grep iptables的方式看到一个叫iptables的进程,你只能用service iptables status去查看它的状态。
所以iptables其实不能叫“服务”,因为它并没有一个“守护进程”,其实iptables只是相当于一个客户端工具,真正的防火墙是Linux内核中的netfilter,由于netfilter是内核功能,用户无法直接操作,iptables这个工具是提供给用户设置过滤规则的,但最终这个过滤规则是由netfilter来执行的。

查询规则

命令格式:iptables [选项] [参数]
常用选项:
-L: list的缩写,list我们通常翻译成列表,意思是列出每条链上的规则,因为多条规则就是一个列表,所以用-L来表示。-L后面还可以跟上5条链(POSTROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)的其中一条链名,注意链名必须全大写,如查看“INPUT链”上的规则:
iptables -L INPUT
Bash
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
不指定的话就是默认查看所有链上的规则列表:
iptables -L
Bash
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
  • Chain INPUT: INPUT链上的规则,同理,后面的“Chain FORWARD”、“Chain OUTPUT”分别是FORWARD链和OUTPUT链上的规则;
  • (policy ACCEPT): 表示默认策略是接受,即假如我没设置,那就是允许,只有我设置哪个不允许,才会不允许,示例中是安装iptables后的默认规则,由于默认是ACCEPT,你规则也设置为ACCEPT按道理来说是没什么意义的,因为你不设置也是ACCEPT呀,但事实上,是为了方便修改为REJECT/DROP等规则,说白了就是放在那,要设置的时候我们就可以直接修改;
  • target: 英文意思是“目标”,但该列的值通常是动作,比如ACCEPT(接受)、REJECT(拒绝)等等,但它确实可以是“目标”,比如我们创建 一条链iptables -N July_filter,然后在INPUT链上添加一条规则,让它跳转到刚刚的新链-A INPUT -p tcp -j July_filter,再用iptables -L查看,可以看到target此时已经是真正的“target(July_filter)”而不再是动作了:
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
July_filter  tcp  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain July_filter (1 references)
target     prot opt source               destination
  • prot: protocol,协议;
  • opt: option,选项;
  • source: 源地址(ip(可以是网段)/域名/主机名)
  • destination: 目标地址(ip(可以是网段)/域名/主机名)
  • 末列: 一些额外的信息

-t:前面-L不是列出所有链的规则列表吗?为什么没有PREROUTING和POSTROUTING链呢?因为有默认参数-t,t是table的缩写,意思是指定显示哪张“表”中的规则(前面说过iptables有四种表),iptables -L其实就相当于iptables -t filter -L,即相当于你查看的是“filter”表中的规则。而根据前面的讲解,filter表只可用于INPUT、FORWARD、OUTPUT三条链中,这就是为什么iptables -L不显示PREROUTING链和POSTROUTING链的原因。

-n: numeric的缩写,numeric意思是数字的,数值的,意思是指定源和目标地址、端口什么的都以数字/数值的方式显示,否则默认会以域名/主机名/程序名等显示,该选项一般与-L合用,因为单独的-n是没有用的(没有-L列表都不显示,所以用-n就没有意义了)。
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
其中dpt:22中的dpt是指destination port(目标端口),同理,spt就是source port(源端口)。

-v: 基本上有点Linux常识的童鞋就应该知道,-v在Linux命令里,一般都是指“verbose”,这个词的意思是是“冗余的,啰嗦的”,即输出更加详细的信息,在iptables这里也是这个意思,一般可以跟-L连用:
iptables -v -L
Bash
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
13627 1033K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    2   128 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh
  275 53284 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 12506 packets, 1485K bytes)
 pkts bytes target     prot opt in     out     source               destination
可以看到多了四列:
  • pkts: packets,包的数量;
  • bytes: 流过的数据包的字节数;
  • in: 入站网卡;
  • out: 出站网卡。
当然还可以跟前面的-n合用:
iptables -n -v -L
Bash
这样source和destination中用域名或者字符串表示的方式就换成ip了:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
13642 1034K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    2   128 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
  275 53284 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 12516 packets, 1489K bytes)
 pkts bytes target     prot opt in     out     source               destination
稍微了解Linux命令的童鞋应该都知道,在很多情况下,Linux的选项是可以合并的,比如前面的iptables -n -v -L其实是可以合并成iptables -nvL的,并且参数顺序一般情况下是无关紧要的,比如iptables -vnL也是一样的。但是-L一定要写在最后,原因是-L是要接收参数的选项(虽然可以不传参数),而-v-n是不需要接收参数的,假如你写成iptables -Lvn,那就表示是用-n来接收参数了,这肯定是不行的。

-x: 加了-v后,Policy那里变成了“(policy ACCEPT 0 packets, 0 bytes)”,即多了过滤的数据包数量和字节数,其中的字节数,如果数据大了之后,会自动转换单位,比如够KB不够MB,它会显示“xxxk”,够了MB它显示“MB”,但单位转换之后,就不完全精确了,因为它没有小数,如果还是想要看以“字母”即“byptes”为单位查看的话,加个-x就行了,“x”来自于“exact”,意思是“精确的;准确的”,不取首字母应该是太多选项首字母是e了。

--line-numbers: 如果你想列表有序号,可以加上该选项:
iptables -nvL --line-numbers
Bash
结果中多了一列“num”,就是序号:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1    14739 1123K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4        2   128 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5      305 55948 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
6        0     0 July_filter  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 310 packets, 42772 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain July_filter (1 references)
num   pkts bytes target     prot opt in     out     source               destination
其实,--line-numbers并不用写全,不然也太长了,其实写成--line就行了,甚至你不写最后一个e,即写成--lin都行。
合并使用各选项的命令示例:
iptables --line -t filter -nvxL INPUT
Bash

添加规则

我们可以向某条链中的某个表的最前面添加记录(我们叫“插入”,会用到-I选项,I表示Input),也可以向某条链中的某个表的最后面添加记录(我们叫“追加”,会用到-A选项,A表示Append),熟悉vi/vim的童鞋会对这个“I”和“A”感觉到熟悉,因为在vi/vim的命令模式下,按I是在光标所行的行首插入,按A是在光标所在行的行尾插入,跟这个在表头跟表尾插入非常像。
之所以有向前添加和向后添加,是因为如果前面规则的是丢弃或拒绝,那么后面的规则是不会起作用的;而如果前面的是接受后面的是丢弃或拒绝,则接受之后后面的丢弃或拒绝也是不会生效的。
向INPUT链的filter表中添加一条规则:
iptables -t filter -I INPUT -s 10.37.129.2 -j DROP
Bash
  • -t: 是指定插入到哪个表中,不写的话默认为“filter”表;
  • -I: 指定插入到哪条链中,并且会在该链指定表(在这里是filter表)中的最前面插入(I:Input),如果用-A则是在最后插入(A:Append)。
  • -s: 匹配源ip,s: source,源。
  • -j: jump,跳转的意思,后面可指定跳转的target(目标),比如自定义的链,当然更多的是跳转到“action(动作)”中,比如ACCEPT、DROP、REJECT等等。
  • 整个意思,就是向iptables中的“INPUT”链(-I INPUT)的“filter”表(-t filter)的最前面(-I)添加一条记录,这次记录会匹配源地址为“10.39.129.2”的请求(-s 10.39.129.2),并把该请求丢弃掉(-j DROP)。

删除iptables中的记录

1、根据编号删除:
前面说过,查询iptables规则列表时,添加--line-numbers简写成--line即可显示记录编号,我们现在就可以根据这个编号来删除了:
iptables -t filter -D INPUT 2
Bash
-t filter指定操作的表为filter表,-D表示delete,后面跟的两个参数,第一个是链名,第二个是要删除的规则的编号。
2、根据条件删除:
iptables -t filter -D INPUT -s 10.37.129.2 -j DROP
Bash
删除INPUT链中的filter表中源地址为“10.37.129.2”并且动作为“DROP”的规则。
3、清空:
-F: flush的缩写,flush是“冲洗、冲掉”的意思,在这里是清空的意思,iptables -t filter -F INPUT代表清空“INPUT”链中“filter”表中的所有规则,如果不指定链不指定表,即直接用iptables -F,则清空所有链中所有表的规则。

修改规则

事实上用“替换”来描述会更好一点,因为所谓的修改其实就是把整个规则替换成新的规则:
iptables -t filter -R INPUT 1 -s 10.37.129.3 -j ACCEPT
Bash
其中的-R就是replace,即替换的意思,整句命令意思是从INPUT链中的filter表中替换编号为1的规则,编号1后面的-s 10.37.129.3 -j ACCEPT就是要替换成的新规则。
修改策略(policy):
iptables -P FORWARD DROP
Bash
-P: policy,即策略。整个意思是把FORWARD链的默认规则设置为DROP,需要注意的是,策略对整个链起作用,不会在同一条链中对两个不同的表起作用,虽然man iptables中有iptables [-t table] -P chain target这个说明,但我认为这是错的,不信你可以执行以下两条命令试试,不管先执行哪行,后面执行的总会替换前面执行的(即使它们指定的表不一样),这就说明指定表跟不指定表是没区别的,因为默认规则是作用于整条链的,无法单独对表作用:
iptables -t raw -P OUTPUT ACCEPT
iptables -t filter -P OUTPUT DROP
Bash
注:这个结论还有待证明,我目前认为是这样。

保存规则

对于CentOS6:
service iptables save
Bash
保存时它会输出:
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
是的,它是保存到/etc/sysconfig/iptables文件中的。

另一种方式保存方式:iptables-save命令能把需要保存规则数据输出到控制台,由前面可知,保存iptables规则其实是保存到/etc/sysconfig/iptables文件中,所以我们只要把iptables-save输出的内容重定向输入到/etc/sysconfig/iptables文件中即可:
iptables-save > /etc/sysconfig/iptables
Bash
同理,还有另一个命令用于重载配置(即以下操作相当于service iptables reload):
iptables-restore < /etc/sysconfig/iptables
Bash

对于CentOS7:
前面说过CentOS7需要自己安装iptables-services
yum install -y iptables-services
Bash
安装后,就可以跟CentOS6一样保存了:
service iptables save
Bash
但要注意的是,这个save必须用service的方式,不能用systemctl,也就是不能这样:
systemctl save iptables
Bash
在CentOS7中start/status/stop/restart/reload都可以换成systemctl的方式,但唯独save不能换成systemctl的方式。
另外,iptables-saveiptables-restore也跟CentOS6一样可以使用。

更详细的命令

-d:destination,用于匹配报文的目标地址,可以同时指定多个ip(逗号隔开,逗号两侧都不允许有空格),也可指定ip段:
iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT
Bash

-p:用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh):
iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
# 感叹号表示“非”,即除了匹配这个条件的都ACCEPT,但匹配这个条件不一定就是REJECT或DROP?这要看是否有为它特别写一条规则,如果没有写就会用默认策略:
iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT
Bash

-i:用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项:
iptables -t filter -I INPUT -p icmp -i eth0 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth0 -j DROP
Bash

-o:用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。
iptables -t filter -I OUTPUT -p icmp -o eth0 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth0 -j DROP
Bash

iptables扩展模块

tcp扩展模块

-p tcp -m tcp --sport用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围(-protocol,-m:match,指匹配的模块,很多人可能以为是module的缩写,其实是match的缩写,--sport: source port);
-p tcp -m tcp --dport用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围(--dportestination port):
#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT
Bash
此外,tcp扩展模块还有–tcp-flags选项,它可以根据TCP头部的“标识位”来匹配,具体直接点进去看吧。

multiport扩展模块

-p tcp -m multiport --sports用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开;
-p udp -m multiport --dports用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开:
#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT
Bash

iprange扩展模块

使用iprange扩展模块可以指定”一段连续的IP地址范围”,用于匹配报文的源地址或者目标地址。iprange扩展模块中有两个扩展匹配条件可以使用:
– --src-range(匹配源地址范围)
– --dst-range(匹配目标地址范围)
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
Bash

string扩展模块

假设我们访问的是“http://192.168.1.146/index.html”,当“index.html”中包括“XXOO”字符时,就会被以下规则匹配上:
iptables -t filter -I INPUT -m string --algo bm --string "XXOO" -j REJECT
Bash
-m string:表示使用string模块
--algo bm:表示使用bm算法来匹配index.html中的字符串,“algo”是“algorithm”的缩写,另外还有一种算法叫“kmp”,所以--algo可以指定两种值,bm或kmp,貌似是bm算法速度比较快。

time扩展模块

我们可以通过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。
我想要自我约束,每天早上9点到下午6点不能看网页:
iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
iptables -t filter -I INPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
Bash
周六日不能看网页:
iptables -t filter -I INPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
iptables -t filter -I INPUT -p tcp --dport 443 -m time --weekdays 6,7 -j REJECT
Bash
--weekdays可用1-7表示一周的7天,还能用星期的缩写来指定匹配:Mon、Tue、Wed、Thu、Fri、Sat、Sun。
匹配每月22,23号:
iptables -t filter -I INPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT
Bash
多个条件是“相与”的关系,比如以下规则指定匹配每周五,并且这个周五还必须是在22,23,24,25,26,27,28中的一天(其实就相当于设置每月的第四个星期五):
iptables -t filter -I INPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
Bash
另外还有daystart和daystop:
iptables -t filter -I INPUT -p tcp --dport 80 -m time --daystart 2019-07-20 --daystop 2019-07-25 -j REJECT
Bash
--monthdays--weekdays可以用感叹号!取反,其他的不行。

connlimit模块

使用connlimit扩展模块,可以限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制。
限制22端口(ssh默认端口)连接数量上限不能超过2个;
iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
Bash
在CentOS6中可对--connlimit-above取反:
iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit ! --connlimit-above 2 -j REJECT
Bash
表示连接数量只要不超过两个就允许连接,至于超过两个并不一定不允许连接,这得看默认策略是ACCEPT还是DROP或REJECT,又或者有其它规则对它进行限制。
在CentOS7中有一个叫--connlimit-upto的选项,它的作用跟! --connlimit-above一样,不过这种用法还是比较少用的。
配合--connlimit-mask来限制网段:
iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
Bash
网址由32位二进制组成,最大可写成:255.255.255.255,而mask就是掩码(网络知识,请自行了解),24表示24个1,即255.255.255.0。

limit扩展模块

limit模块是限速用的,用于限制“单位时间内流入的数据包的数量”。
每6位秒放行一下ping包(因为1分钟是60秒,所以1分钟10个包,就相当于每6秒1个包):
iptables -t filter -I INPUT -p icmp -m limit --limit 10/minite -j ACCEPT
Bash
--limit后面的单位除了minite,还可以是second、hour、day
--limit-burst: burst是爆发、迸发的意思,在这里是指最多允许一次性有几个包通过,要理解burst,先看以下的“令牌桶算法”。
令牌桶算法:
有一个木桶,木桶里面放了5块令牌,而且这个木桶最多也只能放下5块令牌,所有报文如果想要出关入关,都必须要持有木桶中的令牌才行,这个木桶有一个神奇的功能,就是每隔6秒钟会生成一块新的令牌,如果此时,木桶中的令牌不足5块,那么新生成的令牌就存放在木桶中,如果木桶中已经存在5块令牌,新生成的令牌就无处安放了,只能溢出木桶(令牌被丢弃),如果此时有5个报文想要入关,那么这5个报文就去木桶里找令牌,正好一人一个,于是他们5个手持令牌,快乐的入关了,此时木桶空了,再有报文想要入关,已经没有对应的令牌可以使用了,但是,过了6秒钟,新的令牌生成了,此刻,正好来了一个报文想要入关,于是,这个报文拿起这个令牌,就入关了,在这个报文之后,如果很长一段时间内没有新的报文想要入关,木桶中的令牌又会慢慢的积攒了起来,直到达到5个令牌,并且一直保持着5个令牌,直到有人需要使用这些令牌,这就是令牌桶算法的大致逻辑。
看完了“令牌桶算法”,其实--limit就相当于指定“多长时间生成一个新令牌”,而--limit-burst则用于指定木桶中最多存放多少块令牌。

udp扩展模块

udp扩展模块中能用的匹配条件比较少,只有两个,就是--sport--dport,即匹配报文的源端口与目标端口。
放行samba服务的137和138端口:
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp -m udp --dport 138 -j ACCEPT
Bash
当使用扩展匹配条件时,如果未指定扩展模块,iptables会默认调用与-p对应的协议名称相同的模块,所以,当使用-p udp时,可以省略-m udp
iptables -t filter -I INPUT -p udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp --dport 138 -j ACCEPT
Bash
udp扩展中的--sport--dport与tcp一样,同样支持指定一个连续的端口范围:
iptables -t filter -I INPUT -p udp --dport 137:157 -j ACCEPT
Bash
--dport 137:157表示匹配137-157之间的所有端口。
另外与tcp一样,udp也能使用--multiport指定多个不连续的端口。

icmp扩展模块

ping是使用icmp协议的,假设要禁止所有icmp协议的报文进入本机(根据前面所说,我们可以省略用-m icmp来指定使用icmp模块,因为不指定它会默认使用-p指定的协议对应的模块):
iptables -t filter -I INPUT -p icmp -j REJECT
Bash
上述命令能产生两个效果:
– 1、别人ping本机时,无法ping通,因为数据报文无法进入;
– 2、本机ping别人时,虽然数据包可以出去,但别人的响应包也是icmp协议,无法进来(即“有去无回”)。
所以这样设置会导致,不止别人ping不通本机,本机也ping不通别人。

很明显上边的规则不是我们想要的,我们想要的一般都是允许本机ping别人,不允许别人ping本机:
iptables -t filter -I INPUT -p icmp --icmp-type 8/0 -j REJECT
Bash
--icmp-type 8/0用于匹配报文type为8,code为0时才会被匹配到,至于会是type和code,这是icmp协议的知识,可以参考这里iptables详解(7):iptables扩展之udp扩展与icmp扩展
其实上边的命令还可以省略code(即把“8/0”写成“8”即可,省略掉“/0”,原因是type=8的报文中只有code=0一种,所以我们不写默认就是code=0,不会有其它值):
iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
Bash
除了能用type/code来匹配icmp报文,还可以使用icmp的描述名称来匹配:
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
Bash
--icmp-type "echo-request"的效果与icmp --icmp-type 8/0icmp --icmp-type 8的效果完全一样(你可能发现了,icmp协议的描述“echo-request”其实是“echo request”,只不过我们用于作为匹配条件时,要把空格换成横杠)。

state扩展模块

在TCP/IP协议簇中,UDP和ICMP是没有所谓的连接的,但是对于state模块来说,tcp报文、udp报文、icmp报文都是有连接状态的,我们可以这样认为,对于state模块而言,只要两台机器在”你来我往”的通信,就算建立起了连接。
而”连接”中的报文可以分为5种状态,报文状态可以为NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED。具体请查看:iptables详解(8):iptables扩展模块之state扩展
放行RELATED和ESTABLISHED状态的报文:
iptables -t filter -I INPUT -m state --state RELATED, ESTABLISHED -j ACCEPT
Bash

其它

黑白名单机制

报文在经过iptables的链时,会匹配链中的规则,遇到匹配的规则时,就执行对应的动作,如果链中的规则都无法匹配到当前报文,则使用链的默认策略(默认动作),链的默认策略通常设置为ACCEPT或者DROP。
那么,当链的默认策略设置为ACCEPT时,如果对应的链中没有配置任何规则,就表示接受所有的报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被接受。
同理,当链的默认策略设置为DROP时,如果对应的链中没有配置任何规则,就表示拒绝所有报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被拒绝。
所以,当链的默认策略设置为ACCEPT时,按照道理来说,我们在链中配置规则时,对应的动作应该设置为DROP或者REJECT,为什么呢?
因为默认策略已经为ACCEPT了,如果我们在设置规则时,对应动作仍然为ACCEPT,那么所有报文都会被放行了,因为不管报文是否被规则匹配到都会被ACCEPT,所以就失去了访问控制的意义。
所以,当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是”黑名单”机制。
同理,当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是”白名单”机制。
如果使用白名单机制,我们就要把所有人都当做坏人,只放行好人。
如果使用黑名单机制,我们就要把所有人都当成好人,只拒绝坏人。
白名单机制更加安全一些,黑名单机制更加灵活一些。

自定义链

在最前面的时候就说过,iptables有五个“关卡”,即五条“链”,这些都是默认的,但其实我们可以创建自己的自定义链。
还记得前面介绍iptables -L时的那个“target”列吗?为什么target列都是一些“动作”呢?这样的话为什么不把target写成“action”呢?其实就是因为target不一定是“动作”,它还可以是“自定义链”,当指定target为自定义链时,如果匹配上了,那么就会跳转到指定的自定义链中。
你可能会问,前面一直用默认链不也都能实现想要实现的功能吗?为什么还要自定义呢?
原因是当默认链中的规则非常多时,不方便我们管理。
想象一下,如果INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如,我们突然想要修改针对httpd服务的相关规则,难道我们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。
所以,iptables中,可以自定义链,通过自定义链即可解决上述问题。
假设,我们自定义一条链,链名叫IN_WEB,我们可以将所有针对80端口的入站规则都写入到这条自定义链中,当以后想要修改针对web服务的入站规则时,就直接修改IN_WEB链中的规则就好了,即使默认链中有再多的规则,我们也不会害怕了,因为我们知道,所有针对80端口的入站规则都存放在IN_WEB链中,同理,我们可以将针对sshd的出站规则放入到OUT_SSH自定义链中,将针对Nginx的入站规则放入到IN_NGINX自定义链中,这样,我们就能想改哪里改哪里,再也不同担心找不到规则在哪里了。
但是要注意的是,自定义链并不能直接使用,而是需要被默认链引用才能够使用,即默认生效的还是默认的五条链,而自定义链必须在某条默认链的某个规则里设置target为自定义链,然后才会被引用。
创建一条名叫“IN_WEB”的自定义链:
iptables -N IN_WEB
Bash
Chain IN_WEB (0 references)
target     prot opt source               destination
我们可以看到有“0 references”这个字样,reference是“引用”的意思,“0 references”表示引用计数为0,“引用”就是前面说的“自定义链必须在某条默认链的某个规则里设置target为自定义链,然后才会被引用”。
创建一条引用“IN_WEB”链的规则(所谓的引用就是用-j跳转到该规则里):
iptables -I INPUT -p tcp --dport 80 -j IN_WEB
Bash
此时我们再用iptables -L查看,可以看到“引用计数”已经是1了:
Chain IN_WEB (1 references)
target     prot opt source               destination
修改自定义链名称(把名为IN_WEB的自定义链的名称改为WEB,-E是edit的意思):
iptables -E IN_WEB WEB
Bash
能修改肯定也能删除,但删除是有条件的:
– 1、自定义链没有被任何默认链引用,即自定义链的引用计数为0;
– 2、自定义链中没有任何规则,即自定义链为空。
删除名为IN_WEB的自定义链:
iptables -X IN_WEB
Bash
参考文章:
--------------------------------------------------------

iptables详解(1):iptables概念

防火墙相关概念


此处先描述一些相关概念。
从逻辑上讲。防火墙可以大体分为主机防火墙和网络防火墙。
主机防火墙:针对于单个主机进行防护。
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体), 主机防火墙主内(个人)。
从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
那么在此处,我们就来聊聊Linux的iptables.
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter.
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换(Network Address Translate)
数据包内容修改
以及数据包过滤的防火墙功能
所以说,虽然我们使用service iptables start启动iptables"服务",但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

iptables基础

我们知道iptables是按照规则来办事的,我们就来说说规则(rules),规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
这样说可能并不容易理解,我们来换个容易理解的角度,从头说起.
当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点,我们说过,netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,而这些关卡在iptables中不被称为"关卡",而被称为"链"。
客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他"关卡",也就是其他"链",他们就是  "路由前"、"转发"、"路由后",他们的英文名是
PREROUTING、FORWARD、POSTROUTING
也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过"链"可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。
所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

链的概念

现在,我们想象一下,这些"关卡"在iptables中为什么被称作"链"呢?我们知道,防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样  ,这样来说,把他们称为"链"更为合适,每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。 

表的概念

我们再想想另外一个问题,我们对每个"链"上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起呢,必须能的。
我们把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围,所以,学习iptables之前,我们必须先搞明白每种表 的作用。
iptables为我们提供了如下规则的分类,或者说,iptables为我们提供了如下"表":
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw
也就是说,我们自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张"表"中。

表链关系

但是我们需要注意的是,某些"链"中注定不会包含"某类规则",就像某些"关卡"天生就不具备某些功能一样,比如,A"关卡"只负责打击陆地敌人,没有防空能力,B"关卡"只负责打击空中敌人,没有防御步兵的能力,C"关卡"可能比较NB,既能防空,也能防御陆地敌人,D"关卡"最屌,海陆空都能防。
那让我们来看看,每个"关卡"都有哪些能力,或者说,让我们看看每个"链"上的规则都存在于哪些"表"中。
我们还是以图为例,先看看prerouting"链"上的规则都存在于哪些表中。
注意:下图只用于说明prerouting链上的规则存在于哪些表中,并没有描述表的顺序。
这幅图是什么意思呢?它的意思是说,prerouting"链"只拥有nat表、raw表和mangle表所对应的功能,所以,prerouting中的规则只能存放于nat表、raw表和mangle表中。
那么,根据上述思路,我们来总结一下,每个"关卡"都拥有什么功能,
或者说,每个"链"中的规则都存在于哪些"表"中。
PREROUTING      的规则可以存在于:raw表,mangle表,nat表。
INPUT          的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD         的规则可以存在于:mangle表,filter表。
OUTPUT         的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING      的规则可以存在于:mangle表,nat表。
但是,我们在实际的使用过程中,往往是通过"表"作为操作入口,对规则进行定义的,之所以按照上述过程介绍iptables,是因为从"关卡"的角度更容易从入门的角度理解,但是为了以便在实际使用的时候,更加顺畅的理解它们,此处我们还要将各"表"与"链"的关系罗列出来,
表(功能)<-->   链(钩子):
raw     表中的规则可以被哪些链使用:PREROUTING,OUTPUT
mangle  表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat     表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
filter  表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
其实我们还需要注意一点,因为数据包经过一个"链"的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同功能类型的规则会汇聚在一张"表"中,那么,哪些"表"中的规则会放在"链"的最前面执行呢,这时候就需要有一个优先级的问题,我们还拿prerouting"链"做图示。
prerouting链中的规则存放于三张表中,而这三张表中的规则执行的优先级如下:
raw --> mangle --> nat
但是我们知道,iptables为我们定义了4张"表",当他们处于同一条"链"时,执行的优先级如下。
优先级次序(由高而低):
raw --> mangle --> nat --> filter
但是我们前面说过,某些链天生就不能使用某些表中的规则,所以,4张表中的规则处于同一条链的目前只有output链,它就是传说中海陆空都能防守的关卡。
为了更方便的管理,我们还可以在某个表里面创建自定义链,将针对某个应用程序所设置的规则放置在这个自定义链中,但是自定义链接不能直接使用,只能被某个默认的链当做动作去调用才能起作用,我们可以这样想象,自定义链就是一段比较"短"的链子,这条"短"链子上的规则都是针对某个应用程序制定的,但是这条短的链子并不能直接使用,而是需要"焊接"在iptables默认定义链子上,才能被IPtables使用,这就是为什么默认定义的"链"需要把"自定义链"当做"动作"去引用的原因。这是后话,后面再聊,在实际使用时我们即可更加的明白。

数据经过防火墙的流程

结合上述所有的描述,我们可以将数据包通过防火墙的流程总结为下图:

我们在写Iptables规则的时候,要时刻牢记这张路由次序图,灵活配置规则
我们将经常用到的对应关系重新写在此处,方便对应图例查看。
链的规则存放于哪些表中(从链到表的对应关系):
PREROUTING   的规则可以存在于:raw表,mangle表,nat表。
INPUT        的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD      的规则可以存在于:mangle表,filter表。
OUTPUT       的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING  的规则可以存在于:mangle表,nat表。
表中的规则可以被哪些链使用(从表到链的对应关系):
raw     表中的规则可以被哪些链使用:PREROUTING,OUTPUT
mangle  表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat     表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
filter  表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

规则的概念

说了一圈又说回来了,在上述描述中我们一直在提规则,可是没有细说,现在说说它。
先说说规则的概念,然后再通俗的解释它。
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理; 
那么我们来通俗的解释一下什么是iptables的规则,之前打过一个比方,每条"链"都是一个"关卡",每个通过这个"关卡"的报文都要匹配这个关卡上的规则,如果匹配,则对报文进行对应的处理,比如说,你我二人此刻就好像两个"报文",你我二人此刻都要入关,可是城主有命,只有器宇轩昂的人才能入关,不符合此条件的人不能入关,于是守关将士按照城主制定的"规则",开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,因为你符合"器宇轩昂"的标准,所以把你"放行"了,而我不符合标准,所以没有被放行,其实,"器宇轩昂"就是一种"匹配条件","放行"就是一种"动作","匹配条件"与"动作"组成了规则。

了解了规则的概念,那我们来聊聊规则的组成部分,此处只是大概的将规则的结构列出,后面的文章中会单独对规则进行总结。
规则由匹配条件和处理动作组成。

匹配条件

匹配条件分为基本匹配条件与扩展匹配条件
基本匹配条件:
源地址Source IP,目标地址 Destination IP
上述内容都可以作为基本匹配条件。
扩展匹配条件:
除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。
源端口Source Port, 目标端口Destination Port
上述内容都可以作为扩展匹配条件

处理动作

处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。
此处列出一些常用的动作,之后的文章会对它们进行详细的示例与总结:
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配.