Linux之安全iptables详解

  linux干货, 信息安全

 

Linux之安全iptables详解一、【IPtables概述】

Linux之安全iptables详解

谈到iptables,其实它并不是一个单独的个体,它是 netfilter/iptables IP 信息包过滤系统 中两个组件 netfilter iptables的其中一个。Netfilter是由Rusty Russell提出的Linux 2.4 内核防火墙框架,该框架简洁灵活,可实现安全策略应用中的许多功能,如:数据包过 滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address TranslationNAT),以及基于用户及媒体访问控制(Media Access ControlMAC)地址 的过滤和基于状态的过滤、包速率限制等。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只是操作这一过程的工 具。

Linux之安全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出来的。

Linux之安全iptables详解
二、【iptables之四表五链】

Linux之安全iptables详解

Linux之安全iptables详解

Netfilter 框架/模块中指定了数据包的五个挂载点(Hook Point,我们可以理解为回调 函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包 路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

INPUT 当接收到防火墙本机地址的数据包(入站)时

OUTPUT 当防火墙本机向外发送数据包(出站)时

FORWARD 当接收到需要通过防火墙发送给其他地址的数据包(转发)时

PRE_ROUTING 在对数据包作路由选择之前,应用此链中的规则 POST_ROUTING 在对数据包作路由选择之后,应用此链中的规则

   Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序, 它通过 Netfilter 开放的接口来对存放在内核内存中的 各种内建tablesNetfilter的配置 表)进行修改。这些个tables由表tables、链chains、规则rules组成,iptables在应用层负 责修改这个规则文件。类似的应用程序还有 firewalld

Linux之安全iptables详解

相关资料:官网

Linux之安全iptables详解
三、【数据包处理示意】

Linux之安全iptables详解

Linux之安全iptables详解

Linux之安全iptables详解

关于 filternatmangle等规则表说明】:

filter表: 主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如 DROPACCEPTREJECTLOG)。filter 表对应的内核模块为iptable_filter,包含三 个规则链:

INPUT链: INPUT针对那些目的地是本地的包

FORWARD链: FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是 负责转发)的包,即:源和目的都不是本地的数据包,只负责转发改包到别的服务器。 OUTPUT链: OUTPUT是用来过滤所有本地生成的包

   Nat表: 主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNATDNATMASQUERADEREDIRECT)。属于一个流的包(因为包的大小限制导致数据可 能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NATMasqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通 过这个表。表对应的内核模块为 iptable_nat,包含三个链:

PREROUTING链: 作用是在包刚刚到达防火墙时改变它的目的地址, OUTPUT链: 改变本地产生的包的目的地址—–POSTROUTING链:在包就要离开防火墙之前改变其源地址

Mangle表: 主要用于修改数据包的TOSType Of Service,服务类型)、TTLTime To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服 务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。 包含五个规则链——PREROUTINGPOSTROUTINGINPUTOUTPUTFORWARD

raw表: 是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机 制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链—— OUTPUTPREROUTING

优先级:raw>mangle>Nat>filter

Linux之安全iptables详解

Linux之安全iptables详解四、iptables工作原理:主要是对数据包的控制

首先说下防火墙中链的概念,防火墙是通过各种规则来匹配过滤ip包的;从而触发相应的 操作,对数据包执行处理,而多个规则串起来就可以形成一类规则,这就是链。防火墙 在处理各种数据包时,根据防火墙规则的不同介入时机,iptables涉及5种默认规则链,结 合数据流匹配时间点的不同,可理解如下:

INPUT链: 当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。 OUTPUT链: 当防火墙本机向外发送数据包(出站)时,应用此链中的规则。 FORWARD链: 当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此 链中的规则。

PREROUTING链: 在对数据包作路由选择之前,应用此链中的规则,如DNATPOSTROUTING链: 在对数据包作路由选择之后,应用此链中的规则,如SNAT

Linux之安全iptables详解

INPUTOUTPUT链更多的应用在主机防火墙中,即主要针对服务器本机进出数据的安 全控制;而FORWARDPREROUTINGPOSTROUTING链更多的应用在**“网络防火墙 **”中,特别是防火墙服务器作为网关使用时的情况。

防火墙处理数据包的方式(规则):

**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条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编 写的规则顺序极其关键.

Linux之安全iptables详解

 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我 们有机会修改数据包的DestIP(目的IP),然后内核的路由模块根据数据包目的IP”以 及内核中的路由表判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被 我们修改过了) 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下 移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达 POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了) 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就 会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口 发送出去)

Linux之安全iptables详解

注:在写iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵 活配置规则;规则表之间的优先顺序:

Linux之安全iptables详解 Raw——mangle——nat——>filter 规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向

从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址 等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防 火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其 传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序 (比如Apache服务器)进行响应。

第二冲情况:转发数据流向

来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选 择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数 据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给 POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

第三种情况:出站数据流向

防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首 先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否 修改数据包的地址等)进行处理。

Linux之安全iptables详解

iptables是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting, 然后检查目的IP判断是否需要转送出去,接着就会跳到INPUT Forward 进行过滤,如果 封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPTREJECTDROPREDIRECT MASQUERADE 以外,还多出 LOGULOGDNATSNATMIRRORQUEUERETURNTOSTTLMARK等,其中某些处理动作不会 中断过滤程序,某些处理动作则会中断同一规则链的过滤,并依照前述流程继续进行下一 个规则链的过滤(注意:这一点与ipchains不同),一直到堆栈中的规则检查完毕为止。

透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。ACCEPT 将封包放行,进 行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(nat:postrouting)。

下图为数据经过防火墙时,真个数据流在IPtables侧的处理流程示意图:

Linux之安全iptables详解

Linux之安全iptables详解

Linux之安全iptables详解
五、iptables命令语法规则

Linux之安全iptables详解

参数说明:

-t 表名]:该规则所操作的哪个表,可以使用filternat等,如果没有指定则默认为filter -A:新增一条规则,到该规则链列表的最后一行 -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1 -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除 -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。 -P:设置某条规则链的默认动作

-nL-L-n,查看当前运行的防火墙规则列表 chain名:指定规则表的哪个链,如INPUTOUPUTFORWARDPREROUTING[规则编号]:插入、删除、替换规则时用,–line-numbers显示号码

[-i|o 网卡名称]i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出

[-p 协议类型]:可以指定规则应用的协议,包含tcpudpicmp

[-s IP地址]:源主机的IP地址或子网地址

[–sport 源端口号]:数据包的IP的源端口号 [-d目标IP地址]:目标主机的IP地址或子网地址 [–dport目标端口号]:数据包的IP的目标端口号

-mextend matches,这个选项用于提供更多的匹配参数,如:

-m state –state ESTABLISHED,RELATED

-m tcp –dport 22

-m multiport –dports 80,8080

-m icmp –icmp-type 8

<-j 动作>:处理数据包的动作,包括ACCEPTDROPREJECT

Linux之安全iptables详解六、实用命令操作

命令 说明

-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他命令一起使用显示更多更详细的信息

Linux之安全iptables详解6.1、匹配规则

匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口 号,如下表所示:

匹配 说明

-i –in-interface 网络接口名> 指定数据包从哪个网络接口进入,

-o –out-interface 网络接口名> 指定数据包从哪个网络接口输出

-p —proto 协议类型 指定数据包匹配的协议,如TCPUDPICMP-s –source 源地址或子网> 指定数据包匹配的源地址

–sport 源端口号> 指定数据包匹配的源端口号

–dport 目的端口号> 指定数据包匹配的目的端口号

-m –match 匹配的模块 指定数据包规则所使用的过滤模块

iptables执行规则时,是从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条 一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作 (acceptrejectlogdrop),决定下一步执行的情况,后续执行一般有三种情况。

1)一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还 会执行Filter队列内的下一条规则。 2)一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中 Filter队列内其它规则,跳到nat队列规则去执行 3)一种是中止所有规则队列的执行。

Linux之安全iptables详解6.2iptables规则的动作

iptables处理动作除了 ACCEPTREJECTDROPREDIRECT MASQUERADE 以 外,还多出 LOGULOGDNATRETURNTOSSNATMIRRORQUEUETTLMARK等。这里只说明其中最常用的动作:

REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择: ICMP port-unreachableICMP 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 伪装时,不需指定要伪装成哪个 IPIP 会从网卡直接读取,当使用拨接连 线时,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

Linux之安全iptables详解6.3、保存规则

使用iptables程序建立的规则只会保存在内存中,通常我们在修改了iptables的规则重启 iptables 后,之前修改的规则又消失了。那么如何保存新建立的规则呢?

方法1 对于RHELceontos系统可以使用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、manglefilter,当未指定规则表时,

各个规则表的功能如下:

Nat :此规则表拥有 Prerouting postrouting 两个规则链,主要功能为进行一对一、 一对多、多对多等网址转换工作(SNATDNAT),由于转换的特性,需进行目的地网址 转换的数据包,就不需要进行来源网址转换,反之亦然,因此为了提升改写封包的效率, 在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把数据包过滤的规则定义 在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转换 外,请不要做其它用途。mangle 此规则表拥有 PreroutingFORWARD postrouting 三 个规则链。

除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写数据包(TTLTOS)或者是设定 MARK(将数据包作记号,以进行后续的过滤),这时就必须将这些工 作定义在 mangle 规则表中。

mangle表:主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包 含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包), OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包), PREROUTING链(修改即将到来的数据包)LINUX教程 centos教程

filter 表: 这个规则表是预设规则表,拥有 INPUTFORWARD OUTPUT 三个规则 链,这个规则表顾名思义是用来进行封包过滤的动作(例如:DROP LOG ACCEPT REJECT),我们会将基本规则都建立在此规则表中。

Linux之安全iptables详解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 ACCEPTiptables -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 以外的其它类型,包含udpicmp …等。如果要比对所有类型,则可以使用 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 处 理动作,将该封包标示一个号码,号码最不可以超过 4294967296linux基础

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

说明 用来比对联机状态,联机状态共有四种:INVALIDESTABLISHEDNEW RELATED

23iptables -L -n -v 可以查看计数器

INVALID 表示该数据包的联机编号(Session ID)无法辨识或编号不正确。 ESTABLISHED 表示该数据包属于某个已经建立的联机。NEW 表示该数据包想要起始一 个联机(重设联机或将联机重导向)。RELATED 表示该数据包是属于某个已经建立的联 机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。

Linux之安全iptables详解6.5、常用的处理动作:

-j 参数 用来指定要进行的处理动作,常用的处理动作包括:ACCEPTREJECTDROPREDIRECTMASQUERADELOGDNATSNATMIRRORQUEUERETURNMARK

分别说明如下:

ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规 则链(natostrouting)。

REJECT 拦阻该数据包,并传送数据包通知对方,可以传送的数据包有几个选择:ICMP port-unreachableICMP 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 伪装时,不需指定要伪装成哪个 IPIP 会从网卡直接读取,当使用拨号连 接时,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)。范例如下:

Linux之安全iptables详解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 链接 eth0INPUT

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

开放2120端口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

Linux之安全iptables详解 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 链接 eth1INPUT

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之安全iptables详解
七、系统中使用

因在Linuxiptables7.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两 更好:

Linux之安全iptables详解1)把它加到/etc/rc.local中

2)vi /etc/sysconfig/iptables可以把你当前的iptables规则放 到/etc/sysconfig/iptables中,系统启动iptables时自动执行。 3)service iptables save 也可以把你当前的iptables规则 放/etc/sysconfig/iptables中,系统启动iptables时自动执行。