当前位置:首页 » 《随便一记》 » 正文

iptables防火墙_y1035793317的博客

26 人参与  2021年11月28日 09:43  分类 : 《随便一记》  评论

点击全文阅读


目录

引言

一、iptables防火墙

1、简述

2、防火墙组成

3、iptables的表和链接结构

四表五链

四表(raw、mangle、nat、filter)

五链

4、数据包和规则链的匹配流程

数据包过滤的匹配流程

规则链之间的匹配顺序

数据包在规则表、链间的匹配流程

二、编写防火墙规则

1、iptabes 安装

 2、基本语法、数据包控制类型

基本语法

数据包的常见控制类型

 3、常用管理选项

4、匹配条件

5、添加新的规则

6、查看规则列表

7、删除、清空、更改规则

8、规则的匹配条件

通用匹配

隐含匹配

显式匹配

状态匹配 

引言

今天突然想问大家一个问题,什么是防火墙?很多小伙伴可能会告诉我,防火墙是计算机内外网络中一道相对隔绝的保护屏障,用来保护信息安全的技术。那这个名词是怎么由来的呢?有个很有意思的解说,就是防火墙就是森林中防火的一道墙,还有汽车中引擎和人之间防火的一道墙,其实在我来看,本质就是用来隔绝我们不需要或者危险的一道墙

一、iptables防火墙

1、简述

Linux 的防火墙体系在TCP/IP网络模型中,传输层、网络层和应用层都有涉及,但是主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙。Linux 系统的防火墙体系基于内核编码实现, 具有非常稳定的性能和高效率,也因此获得广泛的应用。

2、防火墙组成

Linux中:IP 信息包过滤系统,它实际上由两个组件 netfilter 和 iptables组成

netfilter:属于“内核态”又称内核空间的防火墙功能体系,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集

iptables : 属于“用户态” 的防火墙管理体系,用来管理命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下

3、iptables的表和链接结构

四表五链

规则表的作用:容纳各种规则链(表的划分依据:防火墙规则的作用相似)

规则链的作用:容纳各种防火墙规则(规则的作用:对数据包进行过滤或处理 )(链的分类依据:处理数据包的不同时机)

总结:表里有链,链里有规则

四表(raw、mangle、nat、filter)

raw:主要用来决定是否对数据包进行状态跟踪 包含两个规则链,OUTPUT、PREROUTING

mangle :  修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING

nat:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING

filter:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个链,即PREROUTING、POSTROUTING、OUTPUT

在iptables 的四个规则表中,mangle 表 和raw表的应用相对较少

五链

INPUT:  处理入站数据包,匹配目标IP为本机的数据包

OUTPUT:  处理出站数据包,一般不在此链上做配置

FORWARD:  处理转发数据包,匹配流经本机的数据包

PREROUTING链:  在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上

POSTROUTING链:  在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网

4、数据包和规则链的匹配流程

数据包过滤的匹配流程

raw——mangle——nat——filter

规则链之间的匹配顺序

主机型防火墙

数据包直接进入到防火墙所在的服务器的内部某一个应用程序当中

入站数据(来自外界的数据包,且目标地址是防火墙本机)

 PREROUTING ——> INPUT ——> 本机的应用程序

出站数据(从防火墙本机向外部地址发送的数据包)

本机的应用程序——>OUTPUT——>POSTROUTING

网络型防火墙
转发数据(需要经过防火墙转发的数据包)

 PREROUTING——> FORWARD——> POSTROUTING

规则链内的匹配顺序

自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)要么放行,要么丢弃
若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)

注:按第一条规则……第二条规则的顺序进行匹配处理,遵循“匹配即停止”的原则,一旦找到一条匹配规则将不再检查后续的其他规则,如果一直找不到匹配的规则,就按默认规则处理
默认规则用iptables -L查看,规则链后面出现(policy ACCEPT)即是默认放行
默认策略不参与链内规则的顺序编排
-F清空链时,默认策略不受影响

数据包在规则表、链间的匹配流程

入站数据流向

来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处,如果数据包的目标地址是防火墙本机(如 Internet 用户访问网关的 Web 服务端口),那么内核将其传 递给 INPUT 链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序 ,如 httpd 服务器)进行响应

转发数据流向

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

出站数据流向

防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网 DNS 服务时),首先进行路由选择,确定了输出路径后,再经由 OUTPUT 链处理,最后再交 POSTROUTING 链(是否修改数据包的地址等)进行处理
  
  
 流程:入站——PREROUTING——INPUT——应用程序——OUTPUT——POSTROUTING

二、编写防火墙规则

1、iptabes 安装

CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables
 

关闭firewalld防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

安装iptables 防火墙
yum -y install iptables iptables-services

设置iptables开机启动
systemctl start iptables.service
systemctl enable iptables.service

 2、基本语法、数据包控制类型

基本语法

iptables  [-t 表名]  管理选项  [链名]  [匹配条件]  [-j 控制类型]

表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用 filter 表

管理选项:表示iptables规则的操作方式,如插入、增加、删除、查看等

匹配条件:用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理

控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等

 注意事项:

不指定表名时,默认指filter表
不指定链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写

数据包的常见控制类型

对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等

防火墙规则的“匹配即停止”对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助动作,并没有真正处理数据包

控制类型作用
ACCEPT允许数据包通过
DROP直接丢弃数据包,不给出任何回 应信息
REJECT拒绝数据包通过,必要时会给数据发送端一个响应信息
LOG在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
SNAT修改数据包的源地址
DNAT修改数据包的目的地址
MASQUERADE伪装成一个非固定公网IP地址

 3、常用管理选项

管理选项用法示例
-A在指定链末尾追加一条规则
iptables -A INPUT (操作)
-I在指定链中插入一条新的,未指定序号默认作为第一条
iptables -I INPUT  (操作)
-P指定默认规则
iptables -P  OUTPUT ACCEPT   (操作)
-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
-D删除
iptables -t nat -D INPUT    (操作)

4、匹配条件

匹配条件说明
-p指定要匹配的数据包的协议类型
-s指定要匹配的数据包的源IP地址
-d指定要匹配的数据包的目的IP地址
-I指定数据包进入本机的网络接口
-o指定数据包离开本机做使用的网络接口
–sport指定源端口号
–dport指定目的端口号

5、添加新的规则

添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则

若要在 filter 表 INPUT 链的末尾添加一条防火墙规则,可以执行以下操作(其中 “-p 协议名”作为匹配条件)

iptables -t filter -A INPUT -p icmp -j REJECT   

iptables -I  INPUT -p tcp --dport 22 -j ACCEPT 

iptables -A FORWARD ! -p icmp -j ACCEPT 

iptables -A INPUT -s 192.168.80.11 -j DROP

iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP

6、查看规则列表

查看已有的防火墙规则时,使用管理选项“-L”,结合“--line-numbers”选项还可显示各条规则在链内的顺序号

若要查看 filter 表 INPUT 链中的所有规则,并显示规则序号, 可以执行以下操作

iptables [-t表名] -n -L [链名] |[-- line-numbers]
或
iptables - [vn]L

#注意:不可以合写为-Ln

当防火墙规则的数量较多时,若能够以数字形式显示地址和端口信息,可以减少地址解析的环节,在一定程度上加快命令执行的速度

若要以数字地址形式查看 filter 表INPUT 链中的所有规则,可以执行以下操作
iptables -nL INPUT

7、删除、清空、更改规则

删除一条防火墙规则时,使用管理选项“-D”

若要删除 filter 表 INPUT 链中的第五条规则,可以执行以下操作
iptables -D INPUT 5

若要删除 filter 表 INPUT 不允许任何主机ping本主机,可以执行以下操作
iptables -t filter -R INPUT 序号(iptables -L INPUT --line-numbers查询) -j REJECT

若要清空 filter 表 INPUT 链中的所有规则,可以执行以下操作
iptables -F INPUT

主意:
若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
按内容匹配删数时,确保规则存在,否则报错

-F仅仅是清空链中的规则,并不影响-P设置的默认规则,默认规则需要手动进行修改
-P设置了DROP后,使用-F--定要小心,防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决
如果不写表名和链名,默认清空filter表中所有链里的所有规则

8、规则的匹配条件

在编写防火墙规则时,匹配条件的设置起着决定性的作用。只有清晰、准确地设置好匹配条件,防火墙才知道要对符合什么条件的数据包进行处理,避免“误杀”。对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效。根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显式匹配

通用匹配

通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。 常见的通用匹配包括协议匹配、地址匹配、网络接口匹配

编写 iptables 规则时使用“-p 协议名”的形式指定,用来检查数据包所使用的网络协议,如 tcp、udp、icmp 和 all(针对所有 IP 数据包)等,可用的协议类型存放于 Linux 系统的/etc/procotols 文件中

可直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件

协议匹配: -p协议名
地址匹配: -s源地址、-d目的地址
#可以是IP、网段、域名、空(任何地址)
接口匹配: -i入站网卡、-o出站网卡  

iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.80.11 -j DROP
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP

iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT           //感叹号”!”表示取反

隐含匹配

要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件


端口匹配: --sport 源端口、--dport 目的端口

#可以是个别端口、端口范围
--sport 1000          匹配源端口是1000的数据包
--sport 1000:3000     匹配源端口是1000-3000的数据包
--sport :3000         匹配源端口是3000及以下的数据包
--sport 1000:         匹配源端口是1000及以上的数据包

注意: --sport和--dport 必须配合-p <协议类型>使用

iptables -A INPUT -p tcp --sport 1000:3000 -j REJECT
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT

TCP标记匹配: --tcp-flags TCP标记

iptables -I INPUT -i ens33 -P tcp --tcp-flags SYN, RST,ACK SYN -j ACCEPT
#丢弃SYN请求包,放行其他包
ICMP类型匹配: -- icmp-type ICMP类型

#可以是字符串、数字代码
"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 -j DROP


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 目的端口列表
			 
iptables -A INPUT -p tcp -m multiport --dport 80,21,20,53 -j ACCEPT
iptables -A INPUT -P udp -m multiport --dport 53 -j ACCEPT
IP范围匹配: -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数据包
MAC地址匹配: -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:不能被识别属于哪个连接或没有任何状态

iptables -A FORWARD -m state --state NEW -P tcp ! --syn -j DROP
#禁止转发与正常TCP连接无关的非--syn请求数据包(如伪造的网络攻击数据包)

iptables -I INPUT -P tcp -m multiport --dport 80,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


点击全文阅读


本文链接:http://zhangshiyu.com/post/31337.html

数据包  匹配  规则  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1