智传网优云课堂,专注分享IT技术
与IT技术爱好者一起共同学习进步

iptables全面详解(图文并茂含命令指南)

前言

本文详细介绍了Linux传统的iptables防火墙的原理、专业术语、功能、命令的使用方法、列举实用案例。力求提供最全面的教程给本文读者。如果你觉得本文很赞,请转发并注明本文出处,有兴趣学习Linux的话,也可以添加微信公众号“智传网优”进行在线自助学习。

iptables简介

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

iptables基础

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

iptables和netfilter的关系:
这是第一个要说的地方,Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。

iptables传输数据包的过程

iptables原理图
iptables流程图
iptables模块图

iptables的规则表和链:
表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

规则表:
1. filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter.
2. Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3. Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它),
4. Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw

  • 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。
    强烈建议你不要在这个表里做任何过滤,不管是DANT,SNAT或者Masquerade。

  • raw表
    是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING
    iptables中数据包和4种被跟踪连接的4种不同状态:
    NEW:该包想要开始一个连接(重新连接或将连接重定向)
    RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的。
    ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
    INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。

规则表之间的优先顺序
Raw>>>>mangle>>>>nat>>>>filter

规则链之间的优先顺序(分三种情况):

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

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

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

规则链:
1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.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条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

Table 3-1. 以本地为目标(就是我们自己的机子了)的数据包处理步骤

(步骤) (表) (链) (注释)

Step Table Chain Comment
1 在线路上传输(比如,Internet)
2 进入接口 (比如, eth0)
3 mangle PREROUTING 这个链用来mangle数据包,比如改变TOS等
4 nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某 些情况下包会溜过去。
5 路由判断,比如,包是发往本地的,还是要转发的。
6 mangle INPUT 在路由之后,被送往本地程序之前,mangle数据包。
7 filter INPUT 所有以本地为目的的包都要经过这个链,不管它们从哪儿 来,对这些包的过滤条件就设在这里。
8 到达本地程序了(比如,服务程序或客户程序)

Table 3-2. 以本地为源的数据包处理步骤

(步骤) (表) (链) (注释)

Step Table Chain Comment
1 本地程序(比如,服务程序或客户程序)
2 路由判断,要使用源地址,外出接口,还有其他一些信息。
3 mangle OUTPUT 在这儿可以mangle包。建议不要在这儿做过滤,可能有副作 用哦。
4 nat OUTPUT 这个链对从防火墙本身发出的包进行DNAT操作。
5 filter OUTPUT 对本地发出的包过滤。
6 mangle POSTROUTING 这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作 实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个 包具体到哪儿去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对包 mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。
7 nat POSTROUTING 在这里做SNAT。但不要在这里做过滤,因为有副作用,而且 有些包是会溜过去的,即使你用了DROP策略。
8 离开接口(比如: eth0)
9 在线路上传输(比如,Internet)

Table 3-3. 被转发的数据包处理步骤
(步骤) (表) (链) (注释)

Step Table Chain Comment
1 在线路上传输(比如,Internet)
2 进入接口(比如, eth0)
3 mangle PREROUTING mangle数据包,,比如改变TOS等。
4 nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某 些情况下包会溜过去。稍后会做SNAT。
5 路由判断,比如,包是发往本地的,还是要转发的。
6 mangle FORWARD 包继续被发送至mangle表的FORWARD链,这是非常特殊的情 况才会用到的。在这里,包被mangle(还记得mangle的意思吗)。这次mangle发生在最初的路由判断之后, 在最后一次更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包 的目的地,如丢弃包)。
7 filter FORWARD 包继续被发送至这条FORWARD链。只有需要转发的包才会走 到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内 网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。
8 mangle POSTROUTING 这个链也是针对一些特殊类型的包(译者注:参考第6步, 我们可以发现,在转发包时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目 的地址的操作完成之后做的,但这时包还在本地上。
9 nat POSTROUTING 这个链就是用来做SNAT的,当然也包括Masquerade(伪 装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。
10 离开接口(比如: eth0)
11 又在线路上传输了(比如,LAN)

在Table 3-3的情况里,不要在INPUT链上做过滤。INPUT是专门用来操作那些以我们的机子为目的地址 的包的,它们不会被路由到其它地方的。

管理和设置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等

iptables选项功能图

iptabls基本操作示例

查看规则

查看规则集

[root@zcwyou ~]# iptables --list -n

加一个-n以数字形式显示IP和端口,而不是默认的服务名称

修改规则

配置默认规则,不允许数据进入

[root@zcwyou ~]# iptables -P INPUT DROP

允许转发

[root@zcwyou ~]# iptables -P FORWARD ACCEPT

不允许数据流出

[root@zcwyou ~]# iptables -P OUTPUT DROP

添加规则

允许源IP地址为192.168.0.0/24网段的包流进(包括所有的协议,这里也可以指定单个IP)

[root@zcwyou ~]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT

允许所有的IP到192.168.0.22的访问

[root@zcwyou ~]# iptables -A INPUT -d 192.168.0.22 -j ACCEPT

开放本机80端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

开放本机的ICMP协议

[root@zcwyou ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

删除规则

删除允许源地址进入的规则

[root@zcwyou ~]# iptables -D INPUT -s 192.168.0.21 -j ACCEPT

iptables服务命令
启动服务

[root@zcwyou ~]# /etc/init.d/iptables start

或者

[root@zcwyou ~]# service iptables start

停止服务

[root@zcwyou ~]# /etc/init.d/iptables stop

或者

[root@zcwyou ~]# service iptables stop

重启服务

[root@zcwyou ~]# /etc/init.d/iptables restart

或者

[root@zcwyou ~]# service iptables restart

空当前的所有规则和计数

清空所有的防火墙规则

[root@zcwyou ~]# iptables -F

删除用户自定义的空链

[root@zcwyou ~]# iptables -X

清空计数

[root@zcwyou ~]# iptables -Z

清空指定链 INPUT 上面的所有规则

[root@zcwyou ~]# iptables -F INPUT

删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。

[root@zcwyou ~]# iptables -X INPUT

如果没有指定链名,则会删除该表中所有非内置的链。

把指定链,或者表中的所有链上的所有计数器清零。

[root@zcwyou ~]# iptables -Z INPUT

保存规则

保存设置,将规则保存在/etc/sysconfig/iptables文件里

方法1:

[root@zcwyou ~]# /etc/init.d/iptables save

或者

[root@zcwyou ~]# service iptables save

iptables防火墙的配置文件存放于:/etc/sysconfig/iptables

方法2:

修改/etc/sysconfig/iptables-config 将里面的IPTABLES_SAVE_ON_STOP=”no”, 这一句的”no”改为”yes”这样每次服务在停止之前会自动将现有的规则保存在 /etc/sysconfig/iptables 这个文件中去。

iptables命令及参数介绍

iptables常用命令:
iptables -A 将一个规则添加到链末尾
iptables -D 将指定的链中删除规则
iptables -F 将指定的链中删除所有规则
iptables -I 将在指定链的指定编号位置插入一个规则
iptables -L 列出指定链中所有规则
iptables -t nat -L 列出所有NAT链中所有规则
iptables -N 建立用户定义链
iptables -X 删除用户定义链
iptables -P 修改链的默认设置,如将iptables -P INPUT DROP (将INPUT链设置为DROP)
常见设置参数介绍:
--dport 指定目标TCP/IP端口 如 –dport 80
--sport 指定源TCP/IP端口 如 –sport 80
-p tcp 指定协议为tcp
-p icmp 指定协议为ICMP
-p udp 指定协议为UDP
-j DROP 拒绝
-j ACCEPT 允许
-j REJECT 拒绝并向发出消息的计算机发一个消息
-j LOG 在/var/log/messages中登记分组匹配的记录
-m mac –mac 绑定MAC地址
-m limit –limit 1/s 1/m 设置时间策列
-s 10.10.0.0或10.10.0.0/16 指定源地址或地址段
-d 10.10.0.0或10.10.0.0/16 指定目标地址或地址段
-s ! 10.10.0.0 指定源地址以外的

假设INPUT和OUTPUT链的默认规则都是DROP,所以我们就写需要ACCETP(通过)的链。
开启SSH服务端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@zcwyou ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

注:如果在预设设置把OUTPUT设置成DROP策略的话,就需要设置OUTPUT规则,否则无法进行SSH连接。

iptables实用案例

iptables常见操作案例

开启Web服务端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@zcwyou ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

开启邮件服务的25、110端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT

开启FTP服务的21端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT

开启DNS服务的53端口,假设本机开启了DNS服务

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT

允许icmp服务进出

[root@zcwyou ~]# iptables -A INPUT -p icmp -j ACCEPT
[root@zcwyou ~]# iptables -A OUTPUT -p icmp -j ACCEP

假设OUTPUT默认为DROP的话)

允许loopback,不然会导致DNS无法正常关闭等问题,假设默认INPUT DROP,需要开放

[root@zcwyou ~]# IPTABLES -A INPUT -i lo -p all -j ACCEPT

假设默认OUTPUT DROP,需要开放

[root@zcwyou ~]# IPTABLES -A OUTPUT -o lo -p all -j ACCEPT

减少不安全的端口连接

[root@zcwyou ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@zcwyou ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP

说明:有些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。此外,其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止。

只允许192.168.0.3的机器进行SSH连接

[root@zcwyou ~]# 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, 24表示子网掩码数。

[root@zcwyou ~]# iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT

注意:指定某个主机或者某个网段进行SSH连接,需要把iptables配置文件中的-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT删除,因为它表示所有地址都可以登陆.

如果只允许除了192.168.0.3的主机外都能进行SSH连接

[root@zcwyou ~]# iptables -A INPUT -s ! 192.168.0.3 -p tcp --dport 22 -j ACCEPT

开启转发功能,在做NAT网络配置时,FORWARD默认规则是DROP时,必须开启数据包转发功能

[root@zcwyou ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@zcwyou ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丢弃坏的TCP包

[root@zcwyou ~]# iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

处理IP碎片数量,防止DDOS攻击,允许每秒100个

[root@zcwyou ~]# iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

设置ICMP包过滤, 允许每秒1个包, 限制触发条件是10个包

[root@zcwyou ~]# iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

DROP非法连接

[root@zcwyou ~]# iptables -A INPUT   -m state --state INVALID -j DROP
[root@zcwyou ~]# iptables -A OUTPUT  -m state --state INVALID -j DROP
[root@zcwyou ~]# iptables -A FORWARD -m state --state INVALID -j DROP

允许所有已经建立的和相关的连接

[root@zcwyou ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@zcwyou ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@zcwyou ~]# /etc/rc.d/init.d/iptables save

假设默认为ACCEPT,防止外网用内网IP欺骗

[root@zcwyou ~]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[root@zcwyou ~]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[root@zcwyou ~]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP

禁止与211.101.46.253的所有连接

[root@zcwyou ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP

禁用FTP(21)端口

[root@zcwyou ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP

只禁用211.101.46.253地址的FTP连接,其他连接可以进行。

[root@zcwyou ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP

查看iptable和行号

[root@zcwyou ~]# iptables -nL --line-number

保存当前防火墙配置

[root@zcwyou ~]# service iptables save

手动编辑防火墙策略

[root@zcwyou ~]# vi /etc/sysconfig/iptables

开放本地和Ping

[root@zcwyou ~]# iptables -A INPUT -i lo -j ACCEPT  
[root@zcwyou ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
[root@zcwyou ~]# iptables -A INPUT -p icmp -j ACCEPT

配置内网白名单

[root@zcwyou ~]# iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
[root@zcwyou ~]# iptables -A INPUT -s 172.16.0.0/12 -j ACCEPT
[root@zcwyou ~]# iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT

配置外网白名单

[root@zcwyou ~]# iptables -A INPUT -s 180.168.36.198 -j ACCEPT 
[root@zcwyou ~]# iptables -A INPUT -s 180.168.34.218 -j ACCEPT 
[root@zcwyou ~]# iptables -A INPUT -s 222.73.202.251 -j ACCEPT

控制端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT 
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

拒绝其它

[root@zcwyou ~]# iptables -A INPUT -j DROP
[root@zcwyou ~]# iptables -A FORWARD -j DROP

开放出口

[root@zcwyou ~]# iptables -A OUTPUT -j ACCEPT

允许本地回环接口(即运行本机访问本机)

[root@zcwyou ~]# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

允许已建立的或相关连的通行

[root@zcwyou ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

允许所有本机向外的访问

[root@zcwyou ~]# iptables -A OUTPUT -j ACCEPT

允许访问22端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

允许访问80端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

允许ftp服务的21端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT    #允许FTP服务的21端口
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT    #允许FTP服务的20端口
[root@zcwyou ~]# iptables -A INPUT -j reject       #禁止其他未允许的规则访问
[root@zcwyou ~]# iptables -A FORWARD -j REJECT     #禁止其他未允许的规则访问

屏蔽IP

屏蔽单个IP的命令

[root@zcwyou ~]# iptables -I INPUT -s 123.45.6.7 -j DROP

封整个段即从123.0.0.1到123.255.255.254的命令

[root@zcwyou ~]# iptables -I INPUT -s 123.0.0.0/8 -j DROP

封IP段即从123.45.0.1到123.45.255.254的命令

[root@zcwyou ~]# iptables -I INPUT -s 124.45.0.0/16 -j DROP

封IP段即从123.45.6.1到123.45.6.254的命令是

[root@zcwyou ~]# iptables -I INPUT -s 123.45.6.0/24 -j DROP

查看已添加的iptables规则

[root@zcwyou ~]# iptables -L -n -v

删除已添加的iptables规则

#将所有iptables以序号标记显示,执行:

[root@zcwyou ~]# iptables -L -n --line-numbers

比如要删除INPUT里序号为8的规则,执行:

[root@zcwyou ~]# iptables -D INPUT 8

配置允许ssh端口连接

[root@zcwyou ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求

允许本地回环地址可以正常使用

[root@zcwyou ~]# iptables -A INPUT -i lo -j ACCEPT

本地回环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许

[root@zcwyou ~]# iptables -A OUTPUT -o lo -j ACCEPT

设置默认的规则

配置默认的不让进

[root@zcwyou ~]# iptables -P INPUT DROP

默认的不允许转发

[root@zcwyou ~]# iptables -P FORWARD DROP

默认的可以出去

[root@zcwyou ~]# iptables -P OUTPUT ACCEPT

配置白名单

允许机房内网机器可以访问

[root@zcwyou ~]# iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT

允许机房内网机器可以访问

[root@zcwyou ~]# iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT

允许183.121.3.7访问本机的3380端口

[root@zcwyou ~]# iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT

开启相应的服务端口

开启80端口,因为web对外都是这个端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

允许被ping

[root@zcwyou ~]# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

已经建立的连接得让它进来

[root@zcwyou ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

保存规则到配置文件中,任何改动之前先备份,请保持这一优秀的习惯

[root@zcwyou ~]# cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak

iptables-save > /etc/sysconfig/iptables

检查结果:

[root@zcwyou ~]# cat /etc/sysconfig/iptables

四个表名raw,nat,filter,mangle
五个规则链名 INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
filter表包含INPUT、OUTPUT、FORWARD三个规则链

规则带编号

[root@zcwyou ~]# iptables -L INPUT

查看,这个列表看起来更详细

[root@zcwyou ~]# iptables -L -nv

添加一条规则

[root@zcwyou ~]# iptables -A INPUT -s 192.168.1.5 -j DROP

将所有iptables以序号标记显示,执行:

[root@zcwyou ~]# iptables -L -n --line-numbers

比如要删除INPUT里序号为8的规则,执行:

[root@zcwyou ~]# iptables -D INPUT 8

开放指定的端口

允许本地回环接口(即运行本机访问本机)

[root@zcwyou ~]# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

允许已建立的或相关连的通行

[root@zcwyou ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

允许所有本机向外的访问

[root@zcwyou ~]# iptables -A OUTPUT -j ACCEPT

允许访问22端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

允许访问80端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

允许ftp服务的21端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT

允许FTP服务的20端口

[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT

禁止其他未允许的规则访问

[root@zcwyou ~]# iptables -A INPUT -j reject

不允许转发

[root@zcwyou ~]# iptables -A FORWARD -j REJECT

屏蔽恶意主机(比如,192.168.0.8)

[root@zcwyou ~]# iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP

屏蔽单个IP的命令

[root@zcwyou ~]# iptables -I INPUT -s 123.45.6.7 -j DROP

封整个段即从123.0.0.1到123.255.255.254的命令

[root@zcwyou ~]# iptables -I INPUT -s 123.0.0.0/8 -j DROP

封IP段即从123.45.0.1到123.45.255.254的命令

[root@zcwyou ~]# iptables -I INPUT -s 124.45.0.0/16 -j DROP

查看已添加的规则

[root@zcwyou ~]# iptables -L -n -v

NAT网络转发规则

内网所有IP:172.16.93.0/24转为10.0.0.1

[root@zcwyou ~]# iptables -t nat -A POSTROUTING -s 172.16.93.0/24  -j SNAT --to-source 10.0.0.1

内网IP192.168.1.100转为10.0.0.1

[root@zcwyou ~]# iptables -t nat -A POSTROUTING -s 192.168.1.100  -j SNAT --to-source 10.0.0.1

假设eth0的IP经常变化,做NAT的方法

[root@zcwyou ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

ADSL拔号,IP经常变化,做NAT的方法

[root@zcwyou ~]# iptables -t nat -A POSTROUTING -j MASQUERADE -o pppXXX

公网210.14.67.7让内网192.168.188.0/24上网

[root@zcwyou ~]# iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127

端口映射,本机的 2222 端口映射到内网 虚拟机的22 端口

[root@zcwyou ~]# iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22

配置NAT表防火墙,查看本机关于NAT的设置情况

[root@zcwyou ~]# iptables -t nat -L

-t 参数指定,必须是 raw, nat,filter,mangle 中的一个

带行号查看NAT表

[root@zcwyou ~]# iptables -L -t nat  --line-numbers

删除NAT表POSTROUTING链第一条规则

[root@zcwyou ~]# iptables -t nat -D POSTROUTING 1

iptables可用选项说明

(1) -t 表
表选项用于指定命令应用于哪个iptables内置表。

(2)命令
命令选项用于指定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他命令一起使用显示更多更详细的信息

(3) 匹配规则
匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下表所示
匹配 说明
-i --in-interface 网络接口名 指定数据包从哪个网络接口进入,
-o --out-interface 网络接口名 指定数据包从哪个网络接口输出
-p ---proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source 源地址或子网 指定数据包匹配的源地址
--sport 源端口号 指定数据包匹配的源端口号
--dport 目的端口号 指定数据包匹配的目的端口号
-m --match 匹配的模块 指定数据包规则所使用的过滤模块

iptables执行规则时,是从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作(accept,reject,log,drop等),决定下一步执行的情况,后续执行一般有三种情况。
一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
一种是中止所有规则队列的执行。

(一)、常用命令示例:
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, --zero
范例: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
范例: iptables -E denied disallowed
说明: 修改某自订规则链的名称。

(二)常用封包比对参数
1、参数 -p, --protocol
范例:iptables -A INPUT -p tcpLINUX教程 centos教程
说明:比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-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 联机。

(三)、常用的处理动作:
-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 特别有用。
范例如下:
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集成在非常多的Linux发行版中, 虽然现在已经有新的防火墙firewalld,但iptables使用仍然非常广泛,对运维人员来说,是必须掌握并且随时需要使用的技能。

赞(0)
未经允许不得转载:Linux入门学习到精通 » iptables全面详解(图文并茂含命令指南)
分享到: 更多 (0)

学习QQ群:557371664

关注微信公众号自助视频学习

评论 抢沙发

评论前必须登录!