位于linux内核中包过滤功能体系
称为Linux防火墙的'内核态'
位于/sbin/iptables,用来管理防火墙规则的工具
称为Linux防火墙的“用户态”
主要是网络层,针对IP数据包
体现在对包内的IP地址、端口等信息的处理上
netfilter/iptables:IP信息包过滤系统,它实际上由两个组件netfilter和iptables组成。
主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理。
-netfilter/iptables关系:
netfilter:属于"内核态"又称内核空间(kernel space)的防火墙功能体系。
linux 好多东西都是内核态用户态,那我们运维人员关注的是用户态,
内核我们关注不是很多,内核基本是我们开发人员关心的事情
是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
-iptables:属于"用户态”(User Space, 又称为用户空间)的防火墙管理体系。
是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/n/iptables目录下。
netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter
四个规则表。表中所有规则配置后,立即生效,不需要重启服务
iptables的作用是为包过滤机制的实现提供规则,通过各种不同的规则,告诉netfilter对来自某些源,前往某些目的或具有某些协议特征的数据包应该如何处理,为了更加方便的组织和管理防火墙规则,iptables采用了表和链的分层结构
所以它会对请求的数据包的包头数据进行分析,根据我们预先设定的规则进行匹配来决定是否可以进入主机
其中,每个规则表相当于内核空间的一n/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
INPUT:处理入站数据包,匹配目标IP为本机的数据包
OUTPUT:处理出战数据包,一般不在此链上做配置
FORWARD:处理转发数据包,匹配流经本机的数据包
PREROUTING链:在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上。
POSTROUTING链:在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。
优先顺序
raw - mangle - nat - filter
入站:PREROUTING--->INPUT
出战:OUTPUT--->POSTROUTING
转发:PREROUTING--->FORWARD--->POSTROUTING
数据包在规则表、链间的匹配流程:
入站数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理(是
否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处):如果数据包的
目标地址是防火墙本机(如 Internet 用户访问网关的Web 服务端口),那么内核将其传
递给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序
(如httpd服务器)进行响应。
转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING 链处理,然
后再进行路由选择:如果数据包的目标地址是其他外部地址(如局域网用户通过网关访
问QQ服务器),则内核将其传递给 FORWARD 链进行处理(允许转发或拦截、丢弃),
最后交给 POSTROUTING 链(是否修改数据包的地址等)进行处理。
出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS
服务时),首先进行路由选择,确定了输出路径后,再经由 OUTPUT 链处理,最后再
交POSTROUTING 链(是否修改数据包的地址等)进行处理。
按顺序依次检查匹配即停止(LOG策略列外)
若找不到相匹配的规则,则按该链的默认策略处理
[root@zyf~]# systemctl stop firewalld.service
[root@zyf~]# systemctl disable firewalld.service
[root@zyf~]# yum -y install iptables iptables-services
[root@zyf~]#systemctl start iptables.service
[root@zyf~]#systemctl enable iptables.service
- iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
-
- 其中表名、链名用来指定iptables 命令所操作的表和链,未指定表名时将默认使用filter表;
-
- 管理选项:表示iptables规则的操作方式,如插入、增加、删除、查看等;
- 匹配条件:用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等。
-
- 注意事项
- 不指定表名时,默认指filter表
- 不指定链名时,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 选项、链名、控制类型使用大写字母,其余均为小写
-
-
- 示例
- [root@localhost ~]# iptables -t filter -l INPUT -p icmp -j REJECT
- 组织ping测试
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等。在 iptables防火墙体系中,最常用的几种控制类型如下。
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给出任何回应信息。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息。
LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。 SNAT:修改数据包的源地址。 DNAT:修改数据包的目的地址。
MASQUERADE:伪装成一个非固定公网IP地址。
防火墙规则的“匹配即停止”对于LOG 操作来说是一个特例,因为LOG只是一种辅助
动作,并没有真正处理数据包。
注:需要大写
iptables命令的常用管理选项
- 管理选项 |用法示例
- -- --
- -A 在指定链末尾追加一条iptables-A INPUT(操作)
- -I 在指定链中插入一条新的,未指定序号默认作为第一条 iptables-I INPUT (操作)
- -P 指定默认规则iptables-P OUTPUT ACCEPT (操作)
- -D !删除 iptables-t nat -D INPUT(操作)
- -R 修改、替换某一条规则iptables-t nat-RINPUT
- -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 查看链的所有规则或者某个链的规则/某个具体规则后面跟编号
添加新的防火墙规则时,使用管理选项"-A" 、"-l ",前者用来追加规则,后者用来插入规则。
例如,若要在filter表INPUT链的末尾添加一条防火墙规则,可以执行以下操作(其中"-p 协议名"作为匹配条件)。
多在INPUT中操作
删除清空规则
两条命令都可以达到删除第一个规则的效果
清空指定链或表中的所有防火墙规则,使用管理选项"-F"。
例如,若要清空filter表INPUT链中的所有规则,可以执行以下操作。
iptables -F INPUT
使用管理选项"-F"时,允许省略链名而清空指定表所有链的规则。例如,执行以下操作分别用来清空filter表、nat表、mangle表。
[root@zyf ~]# iptables -F
[root@zyf ~]# iptables -t nat -F
[root@zyf ~]# iptables -t mangle -F
-F仅仅是清空链中的规则,并不影响-P设置的默认规则,默认规则需要手动进行修改
-P设置了DROP后,使用-F一定要小心!
如果不写表名和链名,默认清空filter表中所有链里的所有规则
iptables
的各条链中,默认策略是规则匹配的最后一个环节一当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为ACCEPT(允许)、DROP(丢弃)两种。例如,执行以下操作可以将filter表中 FORWARD链的默认策略设为丢弃, OUTPUT 链的默认策略设为允许。
iptables[-t表名] -P <链名> <控制类型>
iptables -P INPUT DROP 输入后没显示 清除所有规则之后生效,因为下面只剩下DROP添加远程端口22
iptables -F
iptables -P FORWARD DROP
#--般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单
[root@zyf ~]# iptables -t filter-P FORWARD DROP
[root@zyf ~]# iptables -P OUTPUT ACCEPT
在编写防火墙规则时,匹配条件的设置起着决定性的作用。只有清晰、准确地设置好匹配条件,防火墙才知道要对符合什么条件的数据包进行处理,避免"误杀"。对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效。根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显示匹配。
通用匹配也成为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配、地址匹配、网络接口匹配。
- 可直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
- 协议匹配:-p 协议名
- 地址匹配:-s 源地址、-d 目的地址 #可以是网段、域名、空(表示任何地址)
- 接口匹配:-i 入站网卡、-o出站网卡
- iptables -A FORWARD ! -p icmp -j ACEPT
- iptables -A INPUT -s 192.168.154.19 -j DROP
- iptables -I INPUT -i ens33 -s 192.168.154.0/24 -j DROP
-
-
- iptables -I INPUT -p icmp -j DROP
- iptables -I INPUT -p tcp --dport 22 -i ACCEPT
- iptables -P INPUT
- iptables -A FORWARD ! -p icmp -j ACCEPT #!表示取反
协议匹配
编写iptables规则时使用"-p协议名"的形式指定,用来检查数据包所使用的网络协议(--protocol),如tcp、udp、icmp和all (针对所有IP数据包)等,可用的协议类型存放于Linux系统/etc/procotols文件中。例如,若要丢弃通过icmp协议访问防火墙本机的数据包,允许转发经过防火墙的除icmp协议之外的数据包,以执行以下操作。
端口匹配:--sport 源端口、--dport 目标端口
#可以是个别端口、端口范围
- --1000sport 匹配源端口是1000的数据包
- --sport 1000:3000 匹配源端口是1000-3000的数据包
- --sport:3000 匹配源端口是3000及以下的数据包
- --sport 1000: 匹配源端口是1000及以上的数据包
- 注意:--sport和--dport 必须配合-p<协议类型>使用
- iptables -A INPUT -p tcp--sport10003000-j REJECT
- iptables -A INPUT-ptcp--dport20:21-iACCEPT
- iptables -I FORWARD -d 192.168.80.0/24 -p tcp--dport2450024600-j DROP
- iptables -A FORWARD -S 192.168.4.0/24-pudp--dport 53 -j ACCEPT
- iptables -A FORWARD -d 192.168.4.0/24-pudp--sport 53 -j ACEPT
- iptables -A INPUT -s 192.168.4.0/24 -p tcp --dport 53 -jACCEPT
- drop
-
- 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不通其它主机时提示目标不可达
- #此时其它主机需要配置关于icmp协议的控制类型为REJECT
-
- iptables -A INPUT -p icmp -j REJECT
要求以**“-m 扩展模块”**的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。
- -m multiport --sport 源端口列表
- -m multiport --dport 目的端口列表
以上两种形式来检查数据包的源端口、目标端口,多个端口之间以逗号进行分隔
例如,若要允许本机开放80、22、21、20、53端口,以便提供电子邮件服务,可以执行以下操作
- 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 mac --mac-source MAC地址
-
- iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
- #禁止来自某MAC地址的数据包通过本机转发
- -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 state --state 连接状态
常见的连接状态
NEW | 与任何链接无关的,还没开始连接 |
ESTABLISHED | 响应请求或者已建立连接的,连接态 |
RELATED | 与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用 |
INVALID | 不能被识别属于哪个连接或没有任何状态S(无效的) |
禁止转发与正常TCP连接无关的非–syn 请求数据包(如伪造的网络攻击数据包)
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
若只开放本机的web服务(80端口),但发给本机的TCP应答数据包予以放行,其他入站数据包均丢弃,则对应的入站控制规则可以参考以下操作
- iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
- iptables -I INPUT -p tcp -m state --state ESTABLISHD -j ACCEPT
- iptables -P INPUT DROP
DROP转发所有来自192.168.80.0/24主机发送的20,21,22,53,80号端口的数据包
- iptables -I FORWARD -s 192.168.80.0/24 -p tcp -m multiport --dport 20:21,80,22,53 -j DROP
- iptables -A INPUT -p tco -m state --state ESTABLISHED,RELATED -j ACCEPT