Linux防火墙——iptables详解

本文以centOS 7 系统为例

什么是iptables?

iptables是Linux中的软件防火墙,基于Linux的内核(NetFilter)实现。

那么防火墙是什么?

防火墙的就是一堵能够阻断火的墙(开玩笑的)。

有人说防火墙的概念最早是在汽车领域,在汽车的发动机与行驶舱之间有一层铁板,这层铁板贴有隔热的材料,当汽车引擎着火时,可以利用这层铁板把乘客和引擎隔开,防火墙不但能保护乘客安全,同时还能让司机继续控制引擎。

计算机网络中防火墙(firewall)的作用是在内网和外网中间建立起一道“墙”,这个墙能过对外网的信息进行筛选,对内网起到保护作用,比如说过滤病毒等,一般人家里面的网络防火墙就是路由器。防火墙分为硬件防火墙和软件防火墙;硬件防火墙是将防火墙规则程序固化到硬件芯片中,由硬件专门执行这些功能,这样能够减少系统负担。软件防火墙则是使用软件来实现防火墙规则,一般软件防火墙应该要能在各种系统上运行。硬件防火墙的安全性、稳定性和工作效率都是更优的。还有一点,防火墙工作在TCP/IP协议的网络层。

讲完防火墙,现在回到iptables。既然防火墙是有自己的过滤规则的,那么下一个问题,iptables的规则是怎么组成的?

iptables的组成

先说结论:iptables由最基本的“四表五链”组成。到这里肯定又懵了,什么表?什么链?

首先由前面防火墙的定义知道,防火墙的主要能力就是“进行控制”,而控制就要有规则来保证,防止防火墙“随意控制”,而“四表五链”就储存了这些规则。表称为规则表,链称为规则链。

下面给出具体的定义:规则(防火墙规则)的作用在于对数据包进行过滤或处理,根据处理时机的不同,各种规则被组织在不同的链中,规则链是防火墙规则或防火墙策略的集合。而具有某一类相似用途的防火墙规则,按照不同处理实际区分到不同的规则链以后,被归置到不同的表中,规则表是规则链的集合。

规则链

规则按照对数据包进行过滤或处理时机不同,在iptables中分为五链。

  1. INPUT:处理入站数据

  2. OUTPUT:处理出站数据

  3. FORWARD:处理转发数据

  4. PREROUTING:在进行路由选择前处理数据包

  5. POSTROUTING:在进行路由选择后处理数据包

下图是iptables规则链的框架图:

Linux防火墙——iptables详解_第1张图片

当一个网络中的数据包进入主机时,首先根据数据包目的IP地址判断(进行路由选择),如果目的IP地址是本机(host),那么数据包途径INPUT链流向host;否则使用路由转发,途径FORWARD链,从POSTROUTING链出站任何从主机流出的数据包都会途径OUTPUT链,然后从POSTROUTING链出站

规则匹配优先级问题:在链中,规则的匹配优先级是从上到下,先匹配规则链的第一条规则,接着第二条,如果都不匹配,则使用规则链的默认策略处理。

规则表

在iptabels中,当规则划分到不同的规则链中之后,而且这些链中这些规则链会被归置到四个不同的表中,每个表大致进行了功能区分。

  1. raw表:确定是否对该数据包进行状态追踪,比如对新老数据包的分别

  2. mangle表:对数据包设置标记,比如对IP数据包添加ICMP控制信息

  3. nat表:修改数据包中的源、目标IP地址或端口(IP地址转换)

  4. filter表:确定是否放行该数据包(过滤)

规则表的优先级:raw表 > mangle表 > nat表 > filter表

因为规则表包含规则链,在规则链处理数据的时候,那么包含这个链的表都会起作用(每个表中相同链的规则基本不一样)。

加深理解

理解规则链

Linux防火墙——iptables详解_第2张图片

这里将前面的规则链表部分用现实生活中的例子帮助大家理解下。

众所周知,在古时候进城都会查身份,特别是进入京城的时候,那我们把入站数据包就想象成古时候需要进入京城的各种人,在这些人中,有的人是进京面圣的,那么这些人就要往皇宫方向走;有的人则只是途径京城,真实目的是要去别的城市,但是不管你的目的的是怎么样的,只要想进入京城,就要受到守卫的检查,防止你是坏人(古装剧中经常有的那种在城门口查你是不是通缉犯),并且问清楚你的目的,然后进入京城之后,因为每个人的目的都不一样就会分为去见皇上的人和途径一下京城然后出去的人。去面圣的人走到皇宫的门口又要接受检查,皇宫不是什么人都能进的,侍卫核实身份之后,这个人才能进入皇宫,还有想出皇宫的人也是要接受检查的,皇宫想出去也很难,这也要核实身份。刚才还有一部分人往街上走离开长安城,在街上走的时候有城管啥的核实人们的身份。最后所有想离开京城的人都要从出口出去,这个时候也要进行检查(防止你是坏人跑别地方闹事)。

理解规则表

上面说了,在链处理数据包的时候,包含这个链的表就会起作用,再用上面的例子进行理解。

Linux防火墙——iptables详解_第3张图片

比如说在长安门口要进行检查,但是检查的人可以是锦衣卫的人,禁卫军的人或者御林军的人,然后他们会按照优先级顺序依次进行检查。

使用iptables

iptables是防火墙服务,然后也是命令,这个命令能够对Linux的防火墙规则进行修改。

iptables命令解析

format

iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]

解释:

-t 表名:这个表名就是规则表的名字,因为规则是在链中,然后链在表中,所以操作先指定表的名字,然后不指定表名的时候则默认为filter表。

管理选项:对链中的防火墙策略进行管理,常用选项如下

-A:在链尾追加一条新的规则
-I:在指定位置(或链首)插入一条新的规则
-R:修改、替换指定位置或内容的规则
-P:设置指定链的默认策略
-D:删除指定位置或内容的规则
-F:清除表中的所有规则
-L:列表查看各条规则信息
-N:创建一条新的规则链(自定义链)
-X:删除自定义的规则链
--line-numbers:查看规则使显示规则的行号
-n:以数字形式显示IP地址、端口等信息
-v:显示已捕获的数据包个数、字节数等详细信息

链名:指定该表中哪条链进行修改,当不指定链名的时候,默认表示该表内所有链

条件匹配:与管理选项相结合,通常是添加/删除/修改的规则(后面有实例)。除非设置规则链的默认策略,否则需要指定匹配条件。常用条件匹配参数如下

-p 协议名:这个指定计算机网络中协议名,可以指定的协议名在/etc/protocols文件中查看,常用的协议包括tcp、udp、icmp等。通过使用--dport指定目的端口,--sdport指定源端口。
-s 源地址/-d 目的地址:地址可以是单个IP地址,也可以是网络地址(带掩码长度)
-i 网卡/-o 网卡:-i对应接受数据包的网络接口,-o对应发送数据包的网络接口
--tcp-flags 检查范围 被设置的标记:--tcp-flags SYN,RST,ACK 表示检查SYN、RST、ACK这3个标记,只有SYN为1时满足条件
--icmp-type ICMP类型:进行icmp类型匹配,ICMP类型可以使用类型字符串或者对应的数值,例如Echo-Req、Echo-Reply
MAC地址匹配:使用-m mac 结合 --mac-source MAC地址的形式
多端口匹配:使用-m multiport结合--sports源端口列表或--dports目标端口列表的形式
IP地址范围匹配:使用“-m iprange”结合“--src-range 源IP范围”或者“--dst-range目标IP范围”的形式,以“-”符号连接起始IP地址、结束IP地址

-j 目标动作或跳转:当链表中的规则匹配时,防火墙对数据包处理的方式。有四种方式。

  1. DROP:直接删除数据包,不进行任何结果的返回。

  2. REJECT:删除数据包,但是会有返回消息(委婉的DROP)

  3. ACCEPT:接受数据包

  4. LOG:记录数据包,将其信息写入系统日志中,方便分析和管理(记录在/var/log/messages)

iptabels命令使用实例

上面已经基本介绍了一边iptables的各种参数,现在上一些例子,对上面的参数进行使用,方便理解。先说明上面的参数是大小写区分的,链名用大写(自定链),表名用小写。

例1:查看filter表

iptables -L和iptables -t filter -L等价(不指定表名默认为filter)
iptables -L INPUT:指定链名的时候只会显示表中这个链的规则

iptables -L结果

Linux防火墙——iptables详解_第4张图片

iptables -t filter -L结果

Linux防火墙——iptables详解_第5张图片

例2:允许任何人都可以访问本机的dns服务

iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT

-t:指定表为filter(当然可以不指定)

-A:在链尾添加一条规则(这里-I也可以,没有说在什么位置添加)

INPUT:链名

-p tcp/udp --dport 53 :条件匹配。指定协议为tcp/udp,端口号指定53号端口。dns服务不仅使用udp协议,同时少部分情况下还会使用tcp协议,均为53号端口

-j ACCEPT:表示允许

例3:允许192.168.0.0/24网段的主机访问本机的web、ftp、ssh、mysql服务

iptables -t filter -I INPUT -s 192.168.0.0/24 -p tcp -m multiport --dports 80,21,22,3306 -j ACCEPT

-t filter:指定表为filter

-I:在指定位置(或链首,这里就是链首)插入一条规则

INPUT:链名为INPUT

-s 192.168.0.0/24:指定源地址网段

-p tcp -m multiport --dports 80,21,22,3306:指定协议为tcp,并且使用-m multiport指定多个端口(80代表http, 21表示ftp,22表示ssh,3306表示mysql)

-j ACCEPT:表示允许

例4:禁止其他的电脑ping本机,但是本机可以ping其他电脑

iptables -A INPUT -p icmp --icmp-type Echo-Req -j REJECT

-A:链尾追加一条规则

-p icmp:指定协议为icmp

--icmp-type Echo-Req:指定icmp的数据请求包

-j REJECT:表示拒绝

这里扩展一下:

ping命令使用的icmp协议,然后icmp协议数据包分为请求包和应答包,使用ping命令ping别的主机时电脑会发送数据请求包,目标主机收到请求包然后发送应答包。题目要求禁止别的电脑ping本机,则需要禁止请求包。

ping www.baidu.com

Linux防火墙——iptables详解_第6张图片

抓包工具查看数据包

例5:删除filter表中INPUT链的第一条规则

iptables -D INPUT 1

例6:设置filter表中INPUT链的默认规则为REJECT

iptables -P INPUT REJECT

例7:禁止192.168.0.90/24主机访问本机的2233端口

iptables -t filter -A INPUT -s 192.168.0.90/24 -j DROP

例8:创建一个新的自定义链,并在已有的规则中使用这个自定义链,使用之后删除新建的自定义链

-j后可以接动作,也可以接自定义链的名字,表示匹配这个规则时跳转到这个自定义表

iptables —F:清除链表的规则,可以指定链名
iptables -N TEST_defined
iptables -A TEST_defined -p icmp --icmp-type Echo-Req -j ACCEPT
iptables -A INPUT -p icmp --icmp-type Echo-Req -j TEST_defined
iptables -A INPUT -p icmp --icmp-type Echo-Req -j REJECT
iptables -X TEST_defined

首先清除filter表的链规则(方便实验),然后创建自定义链,在自定义链中添加规则(允许别的主机ping本机),在INPUT链中添加两条规则,第一条规则匹配时调转到TEST_defined自定义链中,第二条在INPUT链中添加拒绝别的主机ping本机的规则,最后删除自定义链。结果为能别的主机能ping本机。

Linux防火墙——iptables详解_第7张图片

 查看链表规则

其他问题

1.firewalld和iptables的区别

firewalld和iptables都是在Linux操作系统中用于设置和配置防火墙的工具,但它们之间有一些区别。

  1. 原理不同:iptables是基于Netfilter框架实现,其核心是一个内核模块;而firewalld则是通过D-Bus和systemd服务实现的。

  2. 配置方式不同:iptables使用静态规则(如命令行参数),这些规则一旦设定就需要手动修改才能生效。而firewalld采用动态库和XML配置文件,可以通过一组接口实时管理规则。

  3. 支持的规则类型不同:iptables支持过滤、NAT转换、端口转发等多种类型的规则,可以实现较为复杂的网络管理功能。firewalld则主要支持过滤规则,并提供了预定义的信任级别(如public、internal、trusted等)。

  4. 管理方式不同:iptables通过iptables命令来管理,需要管理员熟练掌握诸多参数和选项。firewalld则提供了图形化的界面、命令行和D-Bus接口,简化了管理。

需要注意的是,iptables和firewalld并非互斥的关系,两者可以同时使用。在CentOS 7及以上版本中,firewalld已经成为了默认的防火墙解决方案。由于firewalld较为简单易用,通常情况下应该优先考虑其作为防火墙的选择。

2.-j 还有两个动作没有提到

分别为DNAT和SNAT,这两个动作是用于地址转换的(NAT,Network Address Translation,网络地址转换),下一篇文章会讲到。

最后的最后,感谢大家的支持,这是本人第一篇文章,如果哪里说错了,欢迎大家在评论区指出。

你可能感兴趣的:(linux,网络,运维)