目录
一、iptables防火墙概述
1.1 netfilter/iptables的关系
二、iptables的四表五列
2.1 四表
2.2 五链
2.3 iptables表、链的结构
2.4 数据包过滤的匹配流程
2.4-1 规则表之间的顺序
2.4-2 规则链之间的顺序
2.4-3 规则链内的匹配顺序
三、数据包在规则表、链间的匹配流程
四、iptables配置
4.1 安装iptables
编辑
4.2 iptables防火墙的配置方法
4.3 iptables命令行
4.4 数据包常见的控制类型
五、iptables中添加、查看、删除规则等基本操作
5.1 iptables的常用管理选项
六、例子
6.1 添加新的规则
6.2 查看规则列表
6.3 删除、清空规则
6.4 设置默认策略
七、规则的匹配条件
7.1 通用匹配
7.2 隐含匹配
7.3 TCP标记匹配: --tcp- flags TCP标记
7.4 ICMP类型匹配: --icmp-type ICMP类型,可以是字符串、数字代码
7.5 显示匹配
多端口匹配
P范围匹配
MAC地址匹配
7.6 状态匹配
常见的连接状态
总结
netfilter/iptables:ip 信息包过滤系统,它实际上由两个组件 netfilter 和 iptables 组成。
主要工作在网络层,针对IP数据包,体现对包内的IP地址、端口信息等处理。
netfilter:属于“内核态”(Kernel Space, 又称为内核空间)的防火墙功能体系。 是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。
iptables:属于“用户态”(User Space,又称为用户空间)的防火墙管理体系。 是一种用来管理Linux防火墙的命令程序,它使插入,修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下。
netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。
表中所有规则配置后,立即生效,不需要重启服务。
raw表:确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING。
mangle表:修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
nat表:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING。
filter表:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、FORWARD、OUTPUT。
注:在 iptables 的四个规则表中,mangle 表和 raw 表的应用相对较少。
INPUT:处理入站数据包,匹配目标IP为本机的数据包。
OUTPUT:处理出站数据包,一般不在此链上做配置。
FORWARD:处理转发数据包,匹配流经本机的数据包。
PREROUTING链:在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网中的80端口映射到路由器外网端口上。
POSTROUTING链:在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。
规则表的作用:容纳各种规则链;表的划分依据:防火墙规则的作用相似
规则链的作用:容纳各种防火墙规则;规则的作用:对数据包进行过滤和处理
总结:表里有链,链里有规则
优先顺序
主机型防火墙
数据包直接进入到防火墙所在的服务器的内部某一个应用程序当中,是不是我只是路过服务器吧,是直接进入到服务
入站数据(来自外界的数据包,且目标地址是防火墙本机) : PREROUTING --> INPUT --> 本机的应用程序;
出站数据(从防火墙本机向外部地址发送的数据包):本机的应用程序-->OUTPUT-.>POSTROUTING
网络型防火墙
转发数据(需要经过防火墙转发的数据包) : PREROUTING --> FORWARD --> POSTROUTING
按照顺序依次检查,匹配即停止(LOG策略例外)
若是找不到相匹配的规则,则按该链接的默认策略处理
入站数据流向:
来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处);如果数据包的目标地址是防火墙本机(如 Internet 用户访问网关的 Web 服务端口),那么内核将其传递给 INPUT 链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序 (如 httpd 服务器)进行响应。
转发数据流向:
来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理,然后再进行路由选择;如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问 QQ 服务器),则内核将其传递给 FORWARD 链进行处理(允许转发或拦截、丢弃), 最后交给 POSTROUTING 链(是否修改数据包的地址等)进行处理。
出站数据流向:
防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网 DNS 服务时),首先进行路由选择,确定了输出路径后,再经由 OUTPUT 链处理,最后再交 POSTROUTING 链(是否修改数据包的地址等)进行处理。
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables防火墙。
systemctl stop firewalld. service #关闭firewalld防火墙
systemctl disable firewalld. service #取消firewalld防火墙开机自启动
yum -y install iptables iptables-services #安装iptables防火墙
systemctl start iptables.service #启动iptables防火墙
systemctl enable iptables.service #设置开机自启动iptablies防火墙
iptables [-t 表名] 管理选项 [链名] [匹配条件] [ -j 控制类型]
其中,表名、链名用来指定iptables命令所操作的表和链,未指定表名时默认使用filter表
注意事项
1、不指定表名时,默认使用filter表
2、不指定链名时,默认指表内所有链
3、除非设置链的默认策略,否则必须指定条件
4、选项、链名、控制类型使用大写字母,其余均为小写
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等;在 iptables 防火墙体系中,最常用的控制类型如下:
防火墙规则的“匹配即停止”对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助动作,并没有真正处理数据包。
注:需要大写
-A:在指定链末尾追加一条 iptables -A INPUT (操作)
-I:在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作)
-P:指定默认规则 iptables -P OUTPUT ACCEPT (操作)
-D:删除 iptables -t nat -D INPUT (操作)
-R:修改、替换某一条规则 iptables -t nat -R INPUT (操作)
-L:查看 iptables -t nat -L (查看)
-n:所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名) iptables -L -n,iptables -nL,iptables -vnL (查看)
-v:查看时显示更详细信息,常跟-L一起使用 (查看)
--line-number:规则带编号 iptables -t nat -L -n --line-number /iptables -t nat -L --line-number
-F:清除链中所有规则 iptables -F (操作)
-X:清空自定义链的规则,不影响其他链 iptables -X
-Z:清空链的计数器(匹配到的数据包的大小和总和)iptables -Z
-S:查看链的所有规则或者某个链的规则/某个具体规则后面跟编号 iptables -t nat -S、iptables -t nat -S POSTROUTING 1
添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。
例如,若要在 filter 表 INPUT 链的末尾添加一条防火墙规则,可以执行以下操作(其中 “-p 协议名”作为匹配条件)。
iptables -t filter -A INPUT -p icmp -j REJECT #不允许任何主机ping本主机
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT #允许主机ssh端口进过我的
其他
iptables -t filter -A INPUT -p tcp -j ACCEPT #允许任何主机tcp
iptables -I INPUT -p udp -j ACCEPT #允许任何主机udp
查看已有的防火墙规则时,使用管理选项“-L”,结合“--line-numbers”选项还可显示各条规则在链内的顺序号。
例如,若要查看 filter 表 INPUT 链中的所有规则,并显示规则序号
iptables [-t表名] -n -L [链名] |[-- line-numbers]
或者
iptables - [vn]L
注意:不可以合写为-Ln
当防火墙规则的数量较多时,若能够以数字形式显示地址和端口信息,可以减少地址解析的环节,在一定程度上加快命令执行的速度。
例如:若要以数字地址形式查看 filter 表INPUT 链中的所有规则。
删除一条防火墙规则时,可以使用管理选项“D”。
例如:若要删除 filter 表 INPUT 链中的第 五条规则。
例2:清空指定链或表中的所有防火墙规则,使用管理选项“-F”。例如,若要清空 filter 表 INPUT
链中的所有规则。
注意:
1.若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
2.按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
3.按内容匹配删数时,确保规则存在,否则报错
使用管理选项“-F”时,允许省略链名而清空指定表所有链的规则。
例如:执行以下操作 分别用来清空 filter 表、nat 表、mangle 表
[root@mayinbin ~]#: iptables -F
[root@mayinbin ~]#: iptables -t nat -F
[root@mayinbin ~]#: iptables -t mangle -F
注:
1、-F仅仅是清空链中的规则,并不影响-P设置的默认规则,默认规则需要手动进行修改
2、-P设置了DROP后,使用-F 一定要小心!
防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决
3、如果不写表名和链名,默认清空filter表中所有链里的所有规则。
iptables 的各条链中,默认策略是规则匹配的最后一个环节;当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。
例如:执行以下操作可以将 filter 表中 FORWARD 链的默认策略设为丢弃, OUTPUT 链的默认策略设为允许。
iptables [-t表名] -P <链名> <控制类型>
iptables -P INPUT DROP #输入后没显示,清除所有规则之后生效,因为下面只剩下DROP添加远程端口22
iptables -F
iptables -P FORWARD DROP
#般在工作环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单
[root@mayinbin ~]#: iptables -t filter -P FORWARD DROP
[root@mayinbin ~]#: iptables -P OUTPUT ACCEPT
注:需要注意的是,当使用管理选项“-F”清空链时,默认策略不受影响;
因此若要修改默认策略,必须通过管理选项“-P”重新进行设置。另外,默认策略并不参与链内规则的顺序编排, 因此在其他规则之前或之后设置并无区别。
在编写防火墙规则时,匹配条件的设置起着决定性的作用。只有清晰、准确地设置好匹配条件,防火墙才知道要对符合什么条件的数据包进行处理,避免“误杀”。对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效。根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显式匹配。
通用匹配也称为常规匹配,可直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
常见的通用匹配包括协议匹配、地址匹配、网络接口匹配。
协议匹配:-p 协议名
地址匹配:-s 源地址、-d目的地址 #可以是IP、网段、域名、空(任何地址)
接口匹配:-i入站网卡、-o出站网卡
iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.63.20 -j DROP
iptables -I INPUT -i ens33 -s 192.168.63.0/24 -j DROP
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT #感叹号”!”表示取反
[root@mayinbin ~]#: iptables -P INPUT DROP
[root@mayinbin ~]#: iptables -t filter -A INPUT ! -p icmp -j ACCEPT
#除了icmp都可以
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。
端口匹配: --sport 源端口、--dport 目的端口;可以是个别端口、端口范围
--sport 1000 #匹配源端口是1000的数据包
--sport 1000:3000 #匹配源端口是1000-3000的数据包
--sport :3000 #匹配源端口是3000及以下的数据包
--sport 1000: #匹配源端口是1000及以上的数据包
#注意:--sport和--dport 必须配合-p <协议类型>使用
端口可以使用的范围 0-65535
iptables -A INPUT -P tcp --dport 20:21 -j ACCEPT
iptables -A INPUT -p tcp --sport 10000:30000 -j REJECT
#10000到30000 全部被拒
iptables -I INPUT -i ens33 -P tcp --tcp-flags SYN, RST,ACK SYN -j ACCEPT
丢弃SYN请求包, 放行其他包
"Echo-Request”(代码为8)表示请求
"Echo- -Reply”(代码为0)表示回显
"Dest ination-Unreachable" (代码为3)表示目标不可达
关于其它可用的ICMP 协议类型,可以执行“iptables -P icmp -h”命令,查看帮助信息
iptables -A INPUT -P icmp -- icmp-type 8 -j DROP #禁止其它主机ping本机
iptables -A INPUT -P icmp --icmp-type 0 -j ACCEPT #允许本机ping其它主机
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #当本机ping不通其它主机时提示目标不可达
iptables -A INPUT -P icmp -j REJECT #此时其它主机需要配置关于icmp协议的控制类型为REJECT
要求以“-m扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
iptables -A INPUT -P tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -P udp -m multiport --dport 53 -j ACCEPT
-m iprange --src- range IP范围
iptables -A FORWARD -P udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
禁止转发源地址位于192.168.80.100-192.168.80.200的udp数据包
-m mac --mac-source MAC地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发
-m state --state 连接状态
NEW:与任何连接无关的,还没开始连接
ESTABLISHED:响应请求或者已建立连接的,连接态
RELATED:与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用
INVALID:不能被识别属于哪个连接或没有任何状态S
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
#禁止转发与正常TCP连接无关的非--syn请求数据包(如伪造的网络攻击数据包)
iptables -I INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
#对进来的包的状态进行检测。已经建立tcp连接的包以及该连接相关的包允许通过。
#比如我和你做生意,我们谈成了生意,到了支付的时候,就可以直接调用与这笔生意相关的支付功能
iptables -P INPUT DROP
规则表的作用:容纳各种规则链; 表的划分依据:防火墙规则的作用相似
规则链的作用:容纳各种防火墙规则;规则的作用:对数据包进行过滤或处理 ;链的分类依据:处理数据包的不同时机