前言

在互联网环境中,企业通过部署各类应用系统为用户提供网络服务,包括Web网站、电子邮件系统、FTP服务器和数据库系统等。如何有效保护这些服务器,过滤不必要的访问请求和恶意入侵行为呢?

本文将从Linux系统中的防火墙——netfilter和iptables入手,介绍防火墙的基本架构、数据包匹配流程以及规则编写方法。

Linux防火墙主要工作在网络层,对TCP/IP数据包进行过滤和限制,属于典型的包过滤防火墙(或称网络层防火墙)。该防火墙体系基于内核编码实现,具有卓越的稳定性和高效的性能,因此在业界得到广泛应用。


一、iptables 概述

1.1 Netfilter

Linux 防火墙的核心组件是 Netfilter,它作为 Linux 内核的子系统直接运行在内核空间。自 Linux 2.4.x 版本开始,Netfilter 便成为新一代防火墙的实现基础。

Netfilter 采用模块化架构,具备出色的可扩展性,为各类网络服务提供了灵活的底层支持框架。该系统与 IP 协议栈是无缝契合,能够实现数据包过滤、地址转换及报文处理等功能。

Netfilter 官网文档:https://netfilter.org/documentation/

1.2 netfilter/iptables 关系

  • netfilter/iptables:IP信息包过滤系统,实际上由两个组件 netfilter 和 iptables 组成。主要工作在网络层,针对 IP 数据包,体现在对包内的 IP 地址、端口等信息的处理。
  • netfilter:属于“内核态”(又称内核空间,kernel space)的防火墙功能体系。是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
  • iptables:属于“用户态”(User Space,又称为用户空间)的防火墙管理体系。是一种用来管理 Linux 防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于 /sbin/iptables 目录下。

netfilter/iptables 后期简称为 iptables。iptables 是基于内核的防火墙,其中内置了 raw、mangle、nat 和 filter 四个规则表。表中所有规则配置后,立即生效,不需要重启服务。


二、iptables 的表、链结构

2.1 iptables 的四表五链结构介绍(重点)

iptables 是一个用于配置包过滤规则的工具,它通过设定不同的规则来指导 netfilter 对特定数据包进行处理。这些规则可以基于数据包的来源、目标地址或协议特征等条件来定义相应的处理方式。

为了更高效地组织和管理防火墙规则,iptables采用表和链的分层结构。该系统会分析数据包头信息,并依据预设规则进行匹配,从而决定是否允许数据包进入主机。

每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表;在每个表容器内又包括不同的规则链,根据处理数据包的不同时机划分为五种链

2.1.1 四表五链基本概念

  • 规则表:

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

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

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

2.1.2 四表

  • raw:主要用来决定是否对数据包进行状态跟踪。包含两个规则链:OUTPUT、PREROUTING。
  • mangle:修改数据包内容,用来做流量整形,给数据包设置标记。包含五个规则链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
  • nat:负责网络地址转换,用来修改数据包中的源、目标 IP 地址或端口。包含三个规则链:OUTPUT、PREROUTING、POSTROUTING。
  • filter:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个链:INPUT、FORWARD、OUTPUT。

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

2.1.3 五链

  • INPUT:处理入站数据包,匹配目标 IP 为本机的数据包。
  • OUTPUT:处理出站数据包,一般不在此链上做配置。
  • FORWARD:处理转发数据包,匹配流经本机的数据包。
  • PREROUTING:在进行路由选择前处理数据包,用来修改目的地址,用来做 DNAT。将公网IP的端口映射到内网服务器的IP和端口上,从而从外网访问内网服务。
  • POSTROUTING:在进行路由选择后处理数据包,用来修改源地址,用来做 SNAT。相当于内网通过路由器 NAT 转换功能实现内网主机通过一个公网 IP 地址上网。

2.2 数据包过滤的匹配流程

2.2.1 规则表匹配顺序

优先顺序:raw → mangle → nat → filter

2.2.2 规则链之间的匹配顺序

  • 主机型防火墙
    • 入站数据(来自外界的数据包,且目标地址是防火墙本机):PREROUTING → INPUT → 本机的应用程序
    • 出站数据(从防火墙本机向外部地址发送的数据包):本机的应用程序 → OUTPUT → POSTROUTING
  • 网络型防火墙
    • 转发数据(需要经过防火墙转发的数据包):PREROUTING → FORWARD → POSTROUTING

2.2.3 规则链内的匹配顺序

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

注:按第一条规则……第二条规则的顺序进行匹配处理,遵循“匹配即停止”的原则,一旦某条规则匹配成功,系统将终止后续规则的检查;若全部规则均未匹配,则执行默认规则处理。

默认规则用 iptables -L 查看,规则链后面出现 (policy ACCEPT) 即是默认放行。默认策略不参与链内规则的顺序编排,使用 -F 清空链时,默认策略不受影响。

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

  • 入站数据流向:来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处);如果数据包的目标地址是防火墙本机(如 Internet 用户访问网关的 Web 服务端口),那么内核将其传递给 INPUT 链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如 httpd 服务器)进行响应。
  • 转发数据流向:来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理,然后再进行路由选择;如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问 QQ 服务器),则内核将其传递给 FORWARD 链进行处理(允许转发或拦截、丢弃),最后交给 POSTROUTING 链(是否修改数据包的地址等)进行处理。
  • 出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网 DNS 服务时),首先进行路由选择,确定了输出路径后,再经由 OUTPUT 链处理,最后再交 POSTROUTING 链(是否修改数据包的地址等)进行处理。

三、编写防火墙规则

3.1 iptables 安装

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

关闭 firewalld 防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service  #  查看防火墙状态
systemctl is-enabled firewalld.service  #  查看防火墙开机自启状态

在这里插入图片描述

安装 iptables 防火墙

yum -y install iptables iptables-services

在这里插入图片描述

设置 iptables 开机启动

systemctl start iptables.service
systemctl enable iptables.service
# 查看状态
systemctl status iptables.service
systemctl is-enabled iptables.service

在这里插入图片描述
在这里插入图片描述

iptables 防火墙的配置方法:

  1. 使用 iptables 命令行。
  2. 使用 system-config-firewall(CentOS 7 不能使用,CentOS 6 可以使用)。

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

语法构成

iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
  • 表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用filter表;
  • 管理选项表示 iptables 规则的操作方式,如插入、增加、删除、查看等;
  • 匹配条件用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理;
  • 控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等。

注意事项

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

数据包的常见控制类型

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

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

3.3 添加、查看、删除规则等基本操作

3.3.1 iptables 命令的常用管理选项

管理选项 用法示例
-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

iptables 各字段解读:

  • pkts:对应规则匹配到的报文的个数。
  • bytes:对应匹配到的报文包的大小总和。
  • target:规则对应的 target,往往表示规则对应的“动作”,即规则匹配成功后需要采取的措施。
  • prot:表示规则对应的协议,是否只针对某些协议应用此规则。
  • opt:表示规则对应的选项。
  • in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
  • out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
  • source:表示规则对应的源头地址,可以是一个 IP,也可以是一个网段。
  • destination:表示规则对应的目标地址。可以是一个 IP,也可以是一个网段。
  • packages:匹配到的包数量。
  • bytes:匹配到的总字节数。

3.3.2 添加新的规则

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

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

例 1:不允许任何主机 ping 本主机

iptables -t filter -vL  # 查看filter表内容
iptables -t filter -A INPUT -p icmp -j REJECT   # 不允许任何主机 ping 本主机

在这里插入图片描述
在这里插入图片描述
使用iptables -t filter -A INPUT -p icmp -j REJECT添加规则

在这里插入图片描述
但是,此时主机依然可以被ping
在这里插入图片描述
因为规则链内的匹配顺序遵循匹配即停止的原则
在这里插入图片描述

如果想要我们添加的规则生效,可以使用iptables -t filter -I INPUT -p icmp -j REJECT将规则插入到首位

iptables -t filter -I INPUT -p icmp -j REJECT
iptables -t filter -nvL

在这里插入图片描述

在这里插入图片描述

例 2:允许通过 TCP 协议连接到系统的 22 端口(SSH)

# 允许通过 TCP 协议连接到系统的 22 端口(SSH)。
#规则被插入到 INPUT 链的第 2 个位置,确保它在其他可能存在的规则之前被处理。
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT

插入前
在这里插入图片描述
插入后

在这里插入图片描述

其他示例:

iptables -t filter -A INPUT -p tcp -j ACCEPT    // 允许任何主机 tcp
iptables -I INPUT -p udp -j ACCEPT              // 允许任何主机 udp

在这里插入图片描述

3.3.3 查看规则列表

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

例如,查看 filter 表 INPUT 链中的所有规则,并显示规则序号:

iptables [-t表名] -n -L [链名] |[-- line-numbers]
或
iptables - [vn]L
# 注意:不可以合写为 -Ln

示例:

iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere            
3    ACCEPT     all  --  anywhere             anywhere            
4    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
5    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

在这里插入图片描述

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

例如:以数字地址形式查看 filter 表 INPUT 链中的所有规则:

iptables -nL INPUT     # "-n -L" 可合写为 "-nL"
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

在这里插入图片描述

3.3.4 删除、清空规则

删除一条防火墙规则时,使用管理选项-D
例如,删除 filter 表 INPUT 链中的第五条规则:

iptables -L INPUT --line-numbers
iptables -D INPUT 5
iptables -L INPUT --line-numbers

在这里插入图片描述

第二种写法:

iptables -t filter -A INPUT -p icmp -j REJECT
iptables -L INPUT --line-numbers
iptables -t filter -D INPUT -p icmp -j REJECT

在这里插入图片描述
在这里插入图片描述

清空指定链或表中的所有防火墙规则,使用管理选项“-F”。例如,清空 filter 表 INPUT 链中的所有规则:

iptables -F INPUT
iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination  

在这里插入图片描述

注意:

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

使用管理选项“-F”时,允许省略链名而清空指定表所有链的规则。例如,清空 filter 表、nat 表、mangle 表:

iptables -F  # 清空 filter 表
iptables -t nat -F  # 清空 nat 表
iptables -t mangle -F  # 清空 mangle 表

在这里插入图片描述
使用以下代码查看filter、nat、mangle表中内容:

iptables -nL
iptables -t nat -nL
iptables -t mangle -nL

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:

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

3.3.5 设置默认策略

iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。

iptables [-t表名] -P <链名> <控制类型>

例如,将 filter 表中 FORWARD 链的默认策略设为丢弃,OUTPUT 链的默认策略设为允许:

iptables -P FORWARD DROP    
iptables -P OUTPUT ACCPET

例1:将filter表中INPUT链的默认策略设为丢弃,然后清空INPUT规则,尝试主机是否可以被ping通

iptables -P INPUT DROP
iptables -F INPUT

在这里插入图片描述
在INPUT链中加上允许icmp连接,再次尝试:

iptables -I INPUT -p icmp -j ACCEPT

在这里插入图片描述
在这里插入图片描述

一般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为 DROP,并设置白名单。

示例:

iptables -P INPUT DROP
iptables -t filter -P FORWARD DROP  
iptables -P OUTPUT ACCEPT  

在这里插入图片描述
在这里插入图片描述

需要注意的是,当使用管理选项-F清空链时,默认策略不受影响。因此若要修改默认策略,必须通过管理选项-P重新进行设置。另外,默认策略并不参与链内规则的顺序编排,因此在其他规则之前或之后设置并无区别。

3.4 规则的匹配条件

制定防火墙规则时,匹配条件的设置至关重要。通过精准定义匹配条件,防火墙才能正确识别需要处理的数据包,避免误判。单条规则可包含多个匹配条件,此时所有条件必须同时满足才能触发规则。根据数据包特性和iptables模块结构,匹配条件可分为三大类:通用匹配隐含匹配显式匹配

3.4.1 通用匹配

通用匹配(又称常规匹配)是一种独立运行的匹配方式,无需依赖其他条件或扩展模块即可生效。其主要类型包括:协议匹配地址匹配网络接口匹配

  • 协议匹配:在配置 iptables 规则时,可通过-p参数(或--protocol)指定网络协议类型,例如 tcp、udp、icmp 或 all(匹配所有 IP 数据包)。系统支持的协议类型定义在/etc/protocols文件中。

示例1

# filter表INPUT链中非ICMP协议的连接接受
iptables -I INPUT ! -p icmp -j ACCEPT      # 感叹号”!”表示取反
#  filter表INPUT链中ICMP协议的连接丢弃
iptables -A INPUT -p icmp -j DROP

在这里插入图片描述

此时,服务器无法响应ping请求(ICMP协议),但允许其他协议的入站连接,例如通过TCP 22端口建立的SSH远程连接。
在这里插入图片描述
在这里插入图片描述

  • 地址匹配-s 源地址、-d目的地址,可以是IP、网段、域名、空(任何地址)

示例1

# 源地址192.168.10.123的入站请求丢弃
iptables -A INPUT -s 192.168.10.123 -j DROP

在这里插入图片描述
在这里插入图片描述

  • 接口匹配-i入站网卡、-o出站网卡

示例1

# 源地址为192.168.10.0网段的对于网卡ens33的入站请求被丢弃
iptables -I INPUT -i ens33 -s 192.168.10.0/24 -j DROP

在这里插入图片描述
此时,来自192.168.10.0网段的入站请求在通过网卡ens33时被系统丢弃。

在这里插入图片描述

3.4.2 隐含匹配

隐含匹配要求以特定的协议匹配作为前提,包括端口、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
iptables -I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 -j DROP
iptables -A FORWARD -s 192.168.10.0/24 -p udp --dport 53 -j ACCEPT                 
iptables -A FORWARD -d 192.168.10.0/24 -p udp --sport 53 -j ACCEPT
iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 53 -j ACCEPT

例如,执行iptables -A OUTPUT -p udp --dport 53 -j DROP命令会拦截所有出站UDP协议的53端口请求,这将导致DNS解析功能失效。
在这里插入图片描述
在这里插入图片描述

  • TCP 标记匹配--tcp-flags TCP 标记(了解即可)。
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
 # 丢弃 SYN 请求包,放行其他包
  • ICMP 类型匹配--icmp-type ICMP 类型。可以是字符串、数字代码。(了解即可)
    • Echo-Request (代码为 8) 表示请求。
    • Echo-Reply (代码为 0) 表示回显。
    • Destination-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

3.4.3 显式匹配

显式匹配要求以-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

此时,允许目标端口为 80(HTTP)、22(SSH)、21(FTP控制)、20(FTP数据)、53(DNS)的 TCP 协议入站流量。允许目标端口为 53(DNS)的 UDP 协议入站流量。

在这里插入图片描述

  • IP 范围匹配-m iprange --src-range IP 范围(源IP地址)、-m iprange --dst-range IP 范围(目的IP地址)
iptables -A INPUT -p icmp -m iprange --src-range 192.168.10.100-192.168.10.200 -j DROP
  # 禁止入站源地址位于 192.168.10.100-192.168.10.200 的 icmp数据包

在这里插入图片描述
此时源地址位于 192.168.10.100-192.168.10.200 的主机无法ping通服务器。
在这里插入图片描述

  • MAC 地址匹配-m mac --mac-source MAC 地址(源mac地址)、-m mac --mac-destination MAC 地址(目的mac地址)
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
# 禁止来自某 MAC 地址的数据包通过本机转发
iptables -A FORWARD -m mac --mac-destination xx:xx:xx:xx:xx:xx -j DROP
# 禁止目标某 MAC 地址的数据包通过本机转发

例如,我有一台主机的MAC地址是74:40:BB:56:B0:9F,我想禁止他的所有入站数据请求。

iptables -A INPUT -m mac --mac-source 74:40:BB:56:B0:9F -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 请求数据包(如伪造的网络攻击数据包)

例1:可以通过配置以下4条规则实现 “默认拒绝,明确允许” 的安全策略:

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 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 对进来的包的状态进行检测。已经建立 tcp 连接的包以及该连接相关的包允许通过。
# 比如我和你做生意,我们谈成了生意,到了支付的时候,就可以直接调用与这笔生意相关的支付功能
iptables -P INPUT DROP

其中第三条规则iptables -A INPUT -m state --state ESTABLISH,RELATED -j ACCEPT是服务器主动发起连接的关键,如果不加这条规则,,服务器无法访问外部网路。
在这里插入图片描述
在这里插入图片描述

原因很简单,当服务器主动向外发起连接(比如服务器访问外部 API、更新软件、同步数据等),对方的回应数据包会被视为 “已建立连接的相关流量(ESTABLISHED, RELATED)”。

如果没有这条规则,这些回应会被默认策略(DROP)拦截,导致服务器主动发起的连接无法正常完成。
在这里插入图片描述

3.5 规则的保存与加载

在 Linux 系统中,直接通过 iptables 命令修改的防火墙规则是临时的,当服务重启或系统重启后会丢失。因此需要通过保存和加载操作来持久化规则。

3.5.1 保存当前规则

使用 iptables-save 命令将当前生效的规则保存到文件:

# 保存规则到 /etc/iptables.rules
iptables-save > /etc/iptables.rules

在这里插入图片描述

3.5.2 加载已保存的规则

当需要恢复之前保存的规则时,使用 iptables-restore 命令:

# 从 /etc/iptables.rules 加载规则
iptables-restore < /etc/iptables.rules

在这里插入图片描述
在这里插入图片描述

3.5.3 恢复系统默认规则

如果需要恢复到系统初始配置,可加载系统默认规则文件(不同发行版路径可能不同):

# 恢复系统默认规则(CentOS/RHEL 示例)
iptables-restore < /etc/sysconfig/iptables

# Debian/Ubuntu 系统可能使用
# iptables-restore < /etc/iptables/rules.v4

在这里插入图片描述
在这里插入图片描述

3.5.4 设置开机自动加载规则

如果你担心服务器意外重启,并且为了实现开机自动加载自定义规则,可以创建一个 systemd 服务:

  1. 创建服务文件:
vim /etc/systemd/system/iptables-load.service
  1. 写入以下内容:
[Unit]
Description=Load iptables rules at startup
After=network.target

[Service]
Type=oneshot
# /etc/iptables.rules是保存规则的路径
ExecStart=/sbin/iptables-restore < /etc/iptables.rules
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

在这里插入图片描述

  1. 启用并启动服务:
# 重新加载 systemd 配置
systemctl daemon-reload

# 启用开机自启
systemctl enable iptables-load.service

# 立即加载规则
systemctl start iptables-load.service

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过以上步骤,你的 iptables 规则将在系统重启后自动加载,确保规则持久生效。


总结

本文详细介绍了 Linux 系统中的防火墙工具 iptables,包括其基本概念、表链结构、数据包匹配流程以及如何编写和管理防火墙规则。

通过学习,我们可以掌握如何使用 iptables 来保护服务器,过滤不必要的访问和恶意入侵,确保网络服务的安全稳定运行。

iptables 作为 Linux 系统中最常用的防火墙工具之一,具有强大的功能和灵活的配置方式,是系统管理员和网络安全工程师必备的技能之一。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐