一、【IPtables概述】
谈到iptables,其实它并不是一个单独的个体,它是 netfilter/iptables IP 信息包过滤系统 中两个组件 netfilter 和 iptables的其中一个。Netfilter是由Rusty Russell提出的Linux 2.4 内核防火墙框架,该框架简洁灵活,可实现安全策略应用中的许多功能,如:数据包过 滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址 的过滤和基于状态的过滤、包速率限制等。netfilter/iptables IP 数据包过滤系统是一 款功能强大的工具,可用于添加、编辑和移除规则。我们也常称其为:包过滤防火墙。
IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统,该系统有利于 在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。防火墙在做数据包过滤决定时, 有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,是该包过滤系统中真 正的安全框架(framework),由一些信息包过滤表组成,这些表包含内核用来控制信息 包过滤处理的规则集,是Linux操作系统内核的一个数据包处理模块。
iptables 组件是一种工具,也称为用户空间(userspace),可通过命令行插入、修改和 删除包过滤表中的规则。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该 工具并安装使用它。我们用iptables命令行工具操作netfilter安全框架。因此,要明白,所 以的操作结果都在net filter中,它才是真正的“防火墙”,而iptables只是操作这一过程的工 具。
netfilter/iptables 的最大优点是它可以配置有状态的防火墙,有状态的防火墙能够指定并记 住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该 信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。 这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。
ESTABLISHED :指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包 并且完全有效。只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状 态会继续匹配这个连接的后续数据包。
INVALID状态: 指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数 据或头。数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪 个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。
NEW状态: 该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连 接相关联。
RELATED状态: 表示该信息包正在启动新连接,以及它与已建立的连接相关联。例 如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。–icmp-type 0 ( ping 应 答) 就是–icmp-type 8 (ping 请求)所RELATED出来的。
二、【iptables之四表五链】
Netfilter 框架/模块中指定了数据包的五个挂载点(Hook Point,我们可以理解为回调 函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包 路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTING、INPUT、 OUTPUT、FORWARD、POST_ROUTING。
INPUT: 当接收到防火墙本机地址的数据包(入站)时
OUTPUT: 当防火墙本机向外发送数据包(出站)时
FORWARD: 当接收到需要通过防火墙发送给其他地址的数据包(转发)时
PRE_ROUTING: 在对数据包作路由选择之前,应用此链中的规则 POST_ROUTING: 在对数据包作路由选择之后,应用此链中的规则
Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序, 它通过 Netfilter 开放的接口来对存放在内核内存中的 各种内建tables(Netfilter的配置 表)进行修改。这些个tables由表tables、链chains、规则rules组成,iptables在应用层负 责修改这个规则文件。类似的应用程序还有 firewalld 。
相关资料:官网
三、【数据包处理示意】
关于 【filter、nat、mangle等规则表说明】:
filter表: 主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如 DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三 个规则链:
INPUT链: INPUT针对那些目的地是本地的包
FORWARD链: FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是 负责转发)的包,即:源和目的都不是本地的数据包,只负责转发改包到别的服务器。 OUTPUT链: OUTPUT是用来过滤所有本地生成的包 ;
Nat表: 主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、 DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可 能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或 Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通 过这个表。表对应的内核模块为 iptable_nat,包含三个链:
PREROUTING链: 作用是在包刚刚到达防火墙时改变它的目的地址, OUTPUT链: 改变本地产生的包的目的地址—–? POSTROUTING链:在包就要离开防火墙之前改变其源地址
Mangle表: 主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服 务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。 包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT, FORWARD。
raw表: 是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机 制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链—— OUTPUT、PREROUTING
优先级:raw>mangle>Nat>filter
四、iptables工作原理:主要是对数据包的控制
首先说下防火墙中链的概念,防火墙是通过各种规则来匹配过滤ip包的;从而触发相应的 操作,对数据包执行处理,而多个规则串起来就可以形成一类“规则”,这就是链。防火墙 在处理各种数据包时,根据防火墙规则的不同介入时机,iptables涉及5种默认规则链,结 合数据流匹配时间点的不同,可理解如下:
INPUT链: 当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。 OUTPUT链: 当防火墙本机向外发送数据包(出站)时,应用此链中的规则。 FORWARD链: 当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此 链中的规则。
PREROUTING链: 在对数据包作路由选择之前,应用此链中的规则,如DNAT。 POSTROUTING链: 在对数据包作路由选择之后,应用此链中的规则,如SNAT。
INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安 全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在**“网络防火墙 **”中,特别是防火墙服务器作为网关使用时的情况。
防火墙处理数据包的方式(规则):
**ACCEPT:**允许数据包通过
**DROP:**直接丢弃数据包,不给任何回应信息 REJECT:拒绝数据包通过,必要时会给数据发送 端 一个响应的信息。 **SNAT:**源地址转换。在进入路由层面的route之前,重新改写源地址,目标地址不 变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送 出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。 **MASQUERADE,**是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上 **DNAT:**目标地址转换。和SNAT相反,IP包经过route之后、出本地的网络栈之前,重 新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地 址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地
址。
REDIRECT: 是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定 的目标地址是啥),方便在本机做端口转发。 **LOG:**在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则 除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编 写的规则顺序极其关键.
当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我 们有机会修改数据包的DestIP(目的IP),然后内核的“路由模块“根据“数据包目的IP”以 及“内核中的路由表“判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被 我们修改过了) 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下 移动,到达INPUT链。数据包到达INPUT链后,任何进程都会–收到它 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达 POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了) 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就 会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口 发送出去)
注:在写iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵 活配置规则;规则表之间的优先顺序:
Raw——mangle——nat——>filter 规则链之间的优先顺序(分三种情况):
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址 等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防 火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其 传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序 (比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选 择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数 据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给 POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首 先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否 修改数据包的地址等)进行处理。
iptables是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting, 然后检查目的IP判断是否需要转送出去,接着就会跳到INPUT 或 Forward 进行过滤,如果 封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、 REJECT、DROP、REDIRECT 和MASQUERADE 以外,还多出 LOG、ULOG、DNAT、 SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK等,其中某些处理动作不会 中断过滤程序,某些处理动作则会中断同一规则链的过滤,并依照前述流程继续进行下一 个规则链的过滤(注意:这一点与ipchains不同),一直到堆栈中的规则检查完毕为止。
透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。ACCEPT 将封包放行,进 行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(nat:postrouting)。
下图为数据经过防火墙时,真个数据流在IPtables侧的处理流程示意图:
五、iptables命令语法规则
参数说明:
-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter -A:新增一条规则,到该规则链列表的最后一行 -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1 -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除 -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。 -P:设置某条规则链的默认动作
-nL:-L、-n,查看当前运行的防火墙规则列表 chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等 [规则编号]:插入、删除、替换规则时用,–line-numbers显示号码
[-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
[-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等
[-s 源IP地址]:源主机的IP地址或子网地址
[–sport 源端口号]:数据包的IP的源端口号 [-d目标IP地址]:目标主机的IP地址或子网地址 [–dport目标端口号]:数据包的IP的目标端口号
-m:extend matches,这个选项用于提供更多的匹配参数,如:
-m state –state ESTABLISHED,RELATED
-m tcp –dport 22
-m multiport –dports 80,8080
-m icmp –icmp-type 8
<-j 动作>:处理数据包的动作,包括ACCEPT、DROP、REJECT
六、实用命令操作
命令 说明
-P –policy <链名> 定义默认策略
-L –list <链名> 查看iptables规则列表
-A –append <链名> 在规则列表的最后增加1条规则 -I –insert <链名> 在指定的位置插入1条规则
-D –delete <链名> 从规则列表中删除1条规则
-R –replace <链名> 替换规则列表中的某条规则
-F –flush <链名> 删除表中所有规则
-Z –zero <链名> 将表中数据包计数器和流量计数器归零
-X –delete-chain <链名> 删除自定义链
-v –verbose <链名> 与-L他命令一起使用显示更多更详细的信息
6.1、匹配规则
匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口 号,如下表所示:
匹配 说明
-i –in-interface 网络接口名> 指定数据包从哪个网络接口进入,
-o –out-interface 网络接口名> 指定数据包从哪个网络接口输出
-p —proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等 -s –source 源地址或子网> 指定数据包匹配的源地址
–sport 源端口号> 指定数据包匹配的源端口号
–dport 目的端口号> 指定数据包匹配的目的端口号
-m –match 匹配的模块 指定数据包规则所使用的过滤模块
iptables执行规则时,是从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条 一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作 (accept,reject,log,drop等),决定下一步执行的情况,后续执行一般有三种情况。
1)一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还 会执行Filter队列内的下一条规则。 2)一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中 断Filter队列内其它规则,跳到nat队列规则去执行 3)一种是中止所有规则队列的执行。
6.2、iptables规则的动作
iptables处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 以 外,还多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、 TTL、MARK等。这里只说明其中最常用的动作:
REJECT : 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择: ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭 联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下:
iptables -A INPUT -p TCP –dport 22 -j REJECT –reject-with ICMP echo-reply
DROP :丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过 滤程序。
REDIRECT : 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继 续比对其它规则。这个功能可以用来实作透明代理 或用来保护web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT–to-ports 8081
MASQUERADE :改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此 处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不 同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连 线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有 用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE –to-ports 21000-31000
LOG :将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文 件,进行完此处理动作后,将会继续比对其它规则。例如:
iptables -A INPUT -p tcp -j LOG –log-prefix “input packet”
SNAT: 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此 处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT –to-source 192.168.10.15-192.168.10.1
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
MIRROR: 镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此 处理动作后,将会中断过滤程序。
QUEUE :中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程 序,可以进行其它应用,例如:计算联机费用…等。
RETURN : 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则 炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
MARK: 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动 作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp –dport 22 -j MARK –set-mark 22
6.3、保存规则
使用iptables程序建立的规则只会保存在内存中,通常我们在修改了iptables的规则重启 iptables 后,之前修改的规则又消失了。那么如何保存新建立的规则呢?
方法1、 对于RHEL和ceontos系统可以使用service iptables save将当前内存中的规则保存 到/etc/sysconfig/iptables文件中
[root@lampbo ~]# service iptables save
方法2、 修改 /etc/sysconfig/iptables-config 将里面的 IPTABLES_SAVE_ON_STOP=“no”, 这一句的“no”改为“yes”这样每次服务在停止之前会自 动将现有的规则保存在 /etc/sysconfig/iptables 这个文件中去。
Iptables的格式:iptables [-t table] command [match] [-j target/jump]
-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,
各个规则表的功能如下:
Nat表 :此规则表拥有 Prerouting 和 postrouting 两个规则链,主要功能为进行一对一、 一对多、多对多等网址转换工作(SNAT,DNAT),由于转换的特性,需进行目的地网址 转换的数据包,就不需要进行来源网址转换,反之亦然,因此为了提升改写封包的效率, 在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把数据包过滤的规则定义 在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转换 外,请不要做其它用途。mangle 此规则表拥有 Prerouting、FORWARD 和 postrouting 三 个规则链。
除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写数据包(TTL、 TOS)或者是设定 MARK(将数据包作记号,以进行后续的过滤),这时就必须将这些工 作定义在 mangle 规则表中。
mangle表:主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包 含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包), OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包), PREROUTING链(修改即将到来的数据包)LINUX教程 centos教程
filter 表: 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则 链,这个规则表顾名思义是用来进行封包过滤的动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。
6.4、常用命令示例: 1、命令 -A, –append
范例:iptables -A INPUT -p tcp –dport 80 -j ACCEPT
说明 :新增规则到INPUT规则链中,规则时接到所有目的端口为80的数据包的流入连接, 该规则将会成为规则链中的最后一条规则。
2、命令 -D, –delete
范例:iptables -D INPUT -p tcp –dport 80 -j ACCEPT 或 iptables -D INPUT 1
说明: 从INPUT规则链中删除上面建立的规则,可输入完整规则,或直接指定规则编号加 以删除。
3、命令 -R, –replace
范例: iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明 取代现行第一条规则,规则被取代后并不会改变顺序。 4、命令 -I, –insert
范例:iptables -I INPUT 1 -p tcp –dport 80 -j ACCEPT
说明: 在第一条规则前插入一条规则,原本该位置上的规则将会往后移动一个顺位。 5、命令 -L, –list
范例: iptables -L INPUT
说明:列出INPUT规则链中的所有规则。 6、命令 -F, –flush
范例: iptables -F INPUT
说明: 删除INPUT规则链中的所有规则。 7、命令 -Z, –zeroLINUX教程 centos教程
范例:iptables -Z INPUT
说明 将INPUT链中的数据包计数器归零。它是计算同一数据包出现次数,过滤阻断式攻击 不可少的工具。
8、命令 -N, –new-chain
范例: iptables -N denied
说明: 定义新的规则链。 9、命令 -X, –delete-chain
范例: iptables -X denied
说明: 删除某个规则链。 10、命令 -P, –policy
范例 :iptables -P INPUT DROP
说明 :定义默认的过滤策略。 数据包没有找到符合的策略,则根据此预设方式处理。
11、命令 -E, –rename-chain 说明: 修改某自订规则链的名称。 (二)常用封包比对参数: 1、参数 -p, –protocol
范例:iptables -A INPUT -p tcp
说明:比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意 思是指除 tcp 以外的其它类型,包含udp、icmp …等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。
2、参数 -s, –src, –source
范例: iptables -A INPUT -s 192.168.1.100
说明:用来比对数据包的来源IP,可以比对单机或网络,比对网络时请用数字来表示屏 蔽,例如:-s 192.168.0.0/24,比对 IP 时可以使用!运算子进行反向比对,例如:-s ! 192.168.0.0/24。
3、参数 -d, –dst, –destination
范例: iptables -A INPUT -d 192.168.1.100 说明:用来比对封包的目的地 IP,设定方式同上。 4、参数 -i, –in-interface
范例 iptables -A INPUT -i lo
说明:用来比对数据包是从哪个网卡进入,可以使用通配字符 + 来做大范围比对,如:-i eth+ 表示所有的 ethernet 网卡,也可以使用 ! 运算子进行反向比对,如:-i ! eth0。这里lo 指本地换回接口。
5、参数 -o, –out-interface
范例:iptables -A FORWARD -o eth0 说明:用来比对数据包要从哪个网卡流出,设定方式同上。 6、参数 –sport, –source-port
范例:iptables -A INPUT -p tcp –sport 22
说明:用来比对数据的包的来源端口号,可以比对单一端口,或是一个范围,例如:– sport 22:80,表示从 22 到 80 端口之间都算是符合件,如果要比对不连续的多个端口,则 必须使用 –multiport 参数,详见后文。比对端口号时,可以使用 ! 运算子进行反向比对。
7、参数 –dport, –destination-port
范例 iptables -A INPUT -p tcp –dport 22
说明 用来比对封包的目的地端口号,设定方式同上。
8、参数 –tcp-flags
范例:iptables -p tcp –tcp-flags SYN,FIN,ACK SYN
说明:比对 TCP 封包的状态标志号,参数分为两个部分,第一个部分列举出想比对的标志 号,第二部分则列举前述标志号中哪些有被设,未被列举的标志号必须是空的。TCP 状态 标志号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧 急)PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对标志号时,可以使用 ! 运算子行反向比对。
9、参数 –syn
范例:iptables -p tcp –syn
说明:用来比对是否为要求联机之TCP 封包,与 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。
10、参数 -m multiport –source-port
范例: iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110 -j ACCEPT
说明 用来比对不连续的多个来源端口号,一次最多可以比对 15 个端口,可以使用 ! 运算子 进行反向比对。
11、参数 -m multiport –destination-port
范例 :iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110 -j ACCEPT
说明:用来比对不连续的多个目的地端口号,设定方式同上。
12、参数 -m multiport –port
范例:iptables -A INPUT -p tcp -m multiport –port 22,53,80,110 -j ACCEPT
说明:这个参数比较特殊,用来比对来源端口号和目的端口号相同的数据包,设定方式同 上。注意:在本范例中,如果来源端口号为 80,目的地端口号为 110,这种数据包并不算 符合条件。
13、参数 –icmp-type
范例:iptables -A INPUT -p icmp –icmp-type 8 -j DROP
说明:用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables – p icmp –help 来查看有哪些代码可用。这里是指禁止ping如,但是可以从该主机ping出。
14、参数 -m limit –limit
范例:iptables -A INPUT -m limit –limit 3/hour
说明:用来比对某段时间内数据包的平均流量,上面的例子是用来比对:每小时平均流量 是否超过一次3个数据包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一 次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行数据包 数量的比对外,设定这个参数也会在条件达成时,暂停数据包的比对动作,以避免因洪水 攻击法,导致服务被阻断。
15、参数 –limit-burst
范例:iptables -A INPUT -m limit –limit-burst 5
说明:用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超 过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。
16、参数 -m mac –mac-source
范例:iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01 -j ACCEPT
说明:用来比对数据包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则链上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯 协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个 网络接口去。linux基础
17、参数 –mark
范例:iptables -t mangle -A INPUT -m mark –mark 1
说明:用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处 理动作,将该封包标示一个号码,号码最不可以超过 4294967296。linux基础
18、参数 -m owner –uid-owner
范例:iptables -A OUTPUT -m owner –uid-owner 500
说明:用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使 用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对 出来自其它主机的封包。
19、参数 -m owner –gid-owner
范例:iptables -A OUTPUT -m owner –gid-owner 0 说明:用来比对来自本机的数据包,是否为某特定使用者群组所产生的,使用时机同上。
20、参数 -m owner –pid-owner
范例:iptables -A OUTPUT -m owner –pid-owner 78 说明:用来比对来自本机的数据包,是否为某特定行程所产生的,使用时机同上。 21、参数 -m owner –sid-owner
范例: iptables -A OUTPUT -m owner –sid-owner 100
说明: 用来比对来自本机的数据包,是否为某特定联机(Session ID)的响应封包,使用 时机同上。
22、参数 -m state –state
范例: iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
23、iptables -L -n -v 可以查看计数器
INVALID 表示该数据包的联机编号(Session ID)无法辨识或编号不正确。 ESTABLISHED 表示该数据包属于某个已经建立的联机。NEW 表示该数据包想要起始一 个联机(重设联机或将联机重导向)。RELATED 表示该数据包是属于某个已经建立的联 机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。
6.5、常用的处理动作:
-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),进行完此处理动作后,将会继续比对 其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
MASQUERADE 改写数据包来源 IP为防火墙 NIC IP,可以指定 port 对应的范围,进行完 此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不 同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨号连 接时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有 用。范例如下:linux基础
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
iptables 所在目录 /etc/sysconfig/iptables service iptables status 查看iptables状态 service iptables restart iptables服务重启 service iptables stop iptables服务禁用
启动iptables:modprobe ip_tables
关闭iptables(关闭命令要比启动复杂)
iptalbes -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT modprobe -r ip_tables
依次执行以上命令即可关闭iptables,否则在执行modproble -r ip_tables时将会提示 FATAL: Module ip_tables is in use.
iptables -L -n
iptables -F 清除预设表filter中的所有规则链的规则 iptables -X 清除预设表filter中使用者自定链中的规则
iptables -L -n #抛弃所有不符合三种链规则的数据包
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
#设置:本地进程 lo 的 INPUT 和 OUTPUT 链接 ; eth0的INPUT链
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state –state ESTABLISHED,RELATED -jACCEPT iptables -A INPUT -i eth0 -m state –state NEW,INVALID -j LOG
iptables -A OUTPUT -o lo -j ACCEPT
开放22端口ssh
iptables -A INPUT -p tcp -i eth0 –dport ssh -j ACCEPT
#开放指定端口,开放指定端口只允许指定ip访问
iptables -A INPUT -p tcp –dport <端口号> -s <IP地址> -j ACCEPT iptables -A INPUT -p tcp –dport <端口号> -j DROP
开放80端口web
iptables -A INPUT -p tcp -i eth0 –dport 80 -j ACCEPT
开放21、20端口ftp
iptables -A INPUT -p tcp –dport 20 -j ACCEPT iptables -A INPUT -p tcp –dport 21 -j ACCEPT
开放其他一些端 口
iptables -A INPUT -p tcp –dport 1935 -j ACCEPT iptables -A INPUT -p tcp –dport 8080 -j ACCEPT iptables -A INPUT -p tcp –dport 443 -j ACCEPT
#同上,开放需要端口的出口
iptables -A OUTPUT -p tcp –sport 1935 -j ACCEPT
如使用vsftpd 使用了pasv 方式,如 pasv_min_port=6000 mx=7000 pasv_enable=YES之 类
iptables -A INPUT -p tcp –dport 6000:7000 -j ACCEPT iptables -A OUTPUT -p TCP –sport 6000:7000 -j ACCEPT
2个都要设,只设第一个不能下载,只设第二个不能上传 限制 37 可以连接哪些端 口
iptables -A INPUT -s 192.168.0.37 -p tcp –dport 21 -j ACCEPT iptables -A INPUT -s 192.168.0.37 -p tcp –dport 20 -j ACCEPT
注:因上方设置的iptables -A INPUT -p tcp –dport 20 -j ACCEPT & iptables -A INPUT -p tcp –dport 21 -j ACCEPT
允许开放20.21到所有用户,所以要删除掉该规则
iptables -D INPUT -p tcp –dport 20 -j ACCEPT iptables -D INPUT -p tcp –dport 21 -j ACCEPT
允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP) IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
将以上规则保存到文件,sudo 是不行的,需要root权限(没有设过的话, sudo passwd root 输入新的root密码即可。 然后su )
iptables-save > /etc/iptables.up.rules #修改 /etc/network/interfaces 脚本自动应用这些规则
auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-save >/etc/iptables.up.rules #关机时,把当前iptables 储存
附:vsftpd.conf 主要项:
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list pasv_min_port=6000
pasv_max_port=7000
pasv_enable=YES
ls_recurse_enable=YES
local_umask=022
file_open_mode=0755
1
这个FTP只供于管理员进行管理及上传工作,因此本地账号权限较大,要注意。 在/etc/vsftpd.chroot_list 只放root及该账号
删除原来 iptables 里面已经有的规则
iptables -F iptables -X
删除指定的规则
iptables -L INPUT //先检查
iptables -L –line-numbers //确认对应规则序号 iptables -D INPUT 序号 //执行删除
抛弃所有不符合三种链规则的数据包
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
#设置:本地进程 lo 的 INPUT 和 OUTPUT 链接 ; eth1的INPUT链
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -m state –state ESTABLISHED,RELATED -jACCEPT iptables -A INPUT -i eth1 -m state –state NEW,INVALID -j LOG
iptables -A OUTPUT -o lo -j ACCEPT
对其他主要允许的端口的 OUTPUT设置:
# DNS
iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 53 -jACCEPT iptables -A OUTPUT -o eth1 -p UDP –sport 1024:65535 –dport 53 -jACCEPT
#HTTP
iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 80 -jACCEPT #HTTPS
iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 443 -jACCEPT
#Email 接受 和发送
iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 110 -jACCEPT iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 25 -jACCEPT
# FTP 数据和控制
iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 20 -jACCEPT iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 21 -jACCEPT
#DHCP
iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 68 -jACCEPT iptables -A OUTPUT -o eth1 -p UDP –sport 1024:65535 –dport 68 -jACCEPT
#POP3S Email安全接收
iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 995 -j ACCEPT 时间同步服务器 NTP
iptables -A OUTPUT -o eth1 -p TCP –sport 1024:65535 –dport 123 -j ACCEPT #拒绝 eth1 其他剩下的
iptables -A OUTPUT -o eth1 –match state –state NEW,INVALID -j LOG
最后是有关于iptables存储的命令:
iptables-save >/etc/iptables.up.rule # 存在你想存的地方 iptables-restore </etc/iptables.up.rules #调用
因为iptables 在每次机器重新启动以后,需要再次输入或者调用,为了方便操作,使用 sudo gedit /etc/network/interfaces
编辑
auto ath0
iface ath0 inet dhcp
pre-up iptables-restore </etc/iptables.up.rules #启动自动调用已存储的iptables post-down iptables-save >/etc/iptables.up.rule #关机时,把当前iptables 储存
七、系统中使用
因在Linux中iptables7.0后已被firewall的替代,因此要想用iptables服务本身,二者只能选 其一存在于Linux系统,需要停用掉Firewalls;执行
systemctl stop firewalld systemctl mask firewalld
安装 iptables 服务
yum install iptables-services systemctl enable iptables systemctl restart iptables service iptables save
规则启动自生效,一般iptables服务会在network服务之前启来,可采用以下方法,后2两 更好:
1)把它加到/etc/rc.local中
2)vi /etc/sysconfig/iptables可以把你当前的iptables规则放 到/etc/sysconfig/iptables中,系统启动iptables时自动执行。 3)service iptables save 也可以把你当前的iptables规则 放/etc/sysconfig/iptables中,系统启动iptables时自动执行。