目录
一 Linux防火墙基础
Linux 防火墙是一种用于保护 Linux 系统网络安全的机制,通过对网络数据包进行过滤和控制,来实现对系统的访问控制和安全防护。
Linux系统中防火墙的类型包括netfilter和iptables的区别:
- Netfilter:它是 Linux 内核里的一个框架,处于内核层面。其功能是提供数据包过滤、网络地址转换(NAT)以及数据包修改等基础功能,为防火墙的实现奠定了基础,是 Linux 系统进行网络数据包处理的核心机制。
- iptables:作为一个用户空间的工具,iptables 主要用于和 Netfilter 框架进行交互。用户通过它可以方便地定义和管理防火墙规则,这些规则最终会被传递给 Netfilter 框架,由 Netfilter 在数据包处理过程中执行。
1 iptables的表,链结构
(1)规则表
在 iptables
中,规则表是规则的集合,不同的表用于实现不同的功能。以下是常见的规则表及其功能:
filter 表
- 功能:这是最常用的表,主要用于进行数据包过滤,决定是否允许数据包通过。例如,你可以使用它来控制哪些 IP 地址可以访问你的服务器,或者限制对特定端口的访问。
nat 表
- 功能:主要用于网络地址转换(NAT),包括源地址转换(SNAT)和目的地址转换(DNAT)。SNAT 用于将内部网络的私有 IP 地址转换为公共 IP 地址,使得内部网络中的设备能够访问外部网络;DNAT 用于将外部网络的请求转发到内部网络的特定设备上。
mangle 表
- 功能:用于对数据包进行更细致的修改,如修改数据包的 TOS(服务类型)、TTL(生存时间)等字段。通过修改这些字段,可以影响数据包在网络中的传输行为。
raw 表
- 功能:主要用于决定数据包是否要进行状态跟踪。在
iptables
中,默认会对数据包进行状态跟踪,以实现更智能的过滤规则。但在某些情况下,你可能不希望对某些数据包进行状态跟踪,这时就可以使用 raw 表来禁用状态跟踪。
(2)规则链
规则链是规则的有序集合,每个规则链负责处理特定类型或方向的数据包。以下是常见的规则链及其功能:
名称 | 功能 |
INPUT链 | 处理进入本机的数据包。当外部网络的数据包到达服务器时,首先会经过 INPUT 链的检查,根据链中的规则决定是否允许该数据包进入服务器。 |
OUTPUT链 | 处理从本机发出的数据包。当服务器内部的程序向外发送数据包时,会经过 OUTPUT 链的检查,根据链中的规则决定是否允许该数据包发出。 |
FORWARD链 | 处理经过本机转发的数据包。当服务器作为网关或路由器时,会有一些数据包需要从一个网络接口转发到另一个网络接口,这些数据包会经过 FORWARD 链的检查。 |
PREROUTING链 | 在数据包进行路由选择之前对其进行处理。通常用于进行目的地址转换(DNAT),可以根据规则将数据包的目的地址修改为其他地址。 |
POSTROUTING链 | 在数据包进行路由选择之后对其进行处理。通常用于进行源地址转换(SNAT),可以根据规则将数据包的源地址修改为其他地址。 |
2 数据包过滤的匹配流程
(1)规则表之间的顺序
当数据包进入系统时,会按照 raw
、mangle
、nat
、filter
这样的顺序依次经过各个表。
(2)规则链之间的顺序
- 入站数据流:数据包首先到达
PREROUTING
链,在这个链中主要进行目的地址转换(DNAT)操作,能够根据规则修改数据包的目的地址。经过PREROUTING
链处理后,数据包会进入INPUT
链,该链会根据规则决定是否允许数据包进入本机。 - 转发数据流向:数据包首先进入
OUTPUT
链,此链会对从本机发出的数据包进行过滤,决定是否允许数据包发出。经过OUTPUT
链处理后,数据包会进入POSTROUTING
链,在这个链中主要进行源地址转换(SNAT)操作,可根据规则修改数据包的源地址。 - 出战数据流向:当数据包是经过本机进行转发时,会依次经过
PREROUTING
链、FORWARD
链、POSTROUTING
链。
(3)规则链内部各条防火墙规则之间的顺序
规则链内规则按从上到下顺序匹配。数据包进入规则链后,先检查首条规则,若匹配则执行对应动作(如允许、拒绝、丢弃),不再检查后续规则;若不匹配则继续检查下一条,直至找到匹配规则或遍历完链。配置时应将常用或严格规则放前面以提高匹配效率。
二 编写防火墙规则
1 iptables的安装
安装iptables
sudo yum install iptables 或
sudo dnf install iptables
启动iptables防火墙并设置开机启动
systemctl start iptables
systemctl enable iptables
2 基本语法,数据包控制类型
iptables 的基本语法结构
iptables [选项] [链名] [条件匹配] [动作]
- 选项用于指定操作类型(如添加、删除、查看等);
- 链名包括 INPUT(处理进入本机的数据包)、OUTPUT(处理本机发出的数据包)、FORWARD(处理转发的数据包)等;
- 条件匹配可根据源 IP、目的 IP、端口号、协议类型(如 TCP、UDP 等)等进行设置;
- 动作常见的有 ACCEPT(允许通过)、DROP(丢弃数据包)、REJECT(拒绝并返回错误信息)、LOG(记录日志信息并传递给下一条)。
示例:
3 添加,查看,删除规则等基本操作
类别 | 选项 | 用途 |
增加 | -A | 追加到最后一行 |
-i | 插入到第一行(或指定序号) | |
查看 | -L | 列出所有规则 |
-n | 以数字形式显示 | |
-v | 详细信息 | |
--line(--line-numbers) | 显示序号 | |
删除 | -D | 删除一条(指定序号或内容) |
-F | 清空所有 | |
修改 | -R | 替换某条规则 |
设置默认 | -P | 设置默认规则 |
(1)添加新的规则
允许来自特定 IP(如 192.168.1.100)的主机通过 SSH(默认端口 22)访问本机,命令为
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
- 其中 “-A” 表示追加规则到指定链(这里是 INPUT 链)。
(2)查看规则列表
使用 “iptables -L” 命令可以列出当前 iptables 的规则列表。若要查看更详细的信息,可使用 “iptables -L -n -v”,“-n” 表示以数字形式显示 IP 地址和端口号,“-v” 表示显示详细信息。
(3)删除,清空规则
- 删除指定规则,比如要删除刚才添加的允许 SSH 访问的规则,可先使用 “iptables -L --line-numbers” 查看规则的序号,然后使用 “iptables -D INPUT [规则序号]” 进行删除。
- 清空所有规则,可使用 “iptables -F” 命令,该命令会清空所有链中的规则。
iptables -D INPUT 3 //删除序列3
iptables -n -L INPUT //查看规则的序号
iptables -F INPUT
(4)设置默认策略
设置 INPUT 链的默认策略为 DROP,命令为 “iptables -P INPUT DROP”;设置 OUTPUT 链的默认策略为 ACCEPT,命令为 “iptables -P OUTPUT ACCEPT”。“-P” 选项用于设置默认策略。
三 规则的匹配条件
1 通用匹配
(1)协议匹配
协议匹配是防火墙规则中常用的匹配方式,用于根据数据包所使用的协议类型来进行筛选和控制。常见的协议类型包括:
- TCP(传输控制协议):是一种面向连接的、可靠的传输层协议,常用于需要数据可靠传输的应用,如 HTTP(80 端口)、HTTPS(443 端口)、SSH(22 端口)、SMTP(25 端口)、POP3(110 端口)等服务。在 iptables 中,可使用 “-p tcp” 来匹配 TCP 协议的数据包。
- UDP(用户数据报协议):是一种无连接的、不可靠的传输层协议,常用于对实时性要求较高、允许少量数据丢失的应用,如 DNS(53 端口)、DHCP(67/68 端口)、TFTP(69 端口)、SNMP(161 端口)等服务。使用 “-p udp” 可匹配 UDP 协议的数据包。
- ICMP(互联网控制报文协议):主要用于在 IP 主机、路由器之间传递控制消息,如 ping 命令使用的就是 ICMP 协议。通过 “-p icmp” 来匹配 ICMP 协议的数据包。此外,还可以进一步根据 ICMP 的类型和代码进行更精细的匹配。
iptables -I INPUT -p icmp -j DROP #"-p 协议名"
iptables -A FORWARD ! -p icmp -j ACCEPT
(2)地址匹配
地址匹配用于根据数据包的源 IP 地址或目的 IP 地址来进行筛选和控制,以便允许或阻止特定 IP 地址的设备与本地系统进行通信。
- 源地址匹配:使用 “-s” 选项指定源 IP 地址,例如 “iptables -A INPUT -s 192.168.1.100 -j ACCEPT” 表示允许来自 IP 地址为 192.168.1.100 的设备的数据包进入 INPUT 链。也可以指定一个 IP 地址段,如 “iptables -A INPUT -s 192.168.1.0/24 -j DROP” 表示丢弃来自 192.168.1.0 到 192.168.1.255 这个网段的所有数据包。
- 目的地址匹配:使用 “-d” 选项指定目的 IP 地址,例如 “iptables -A OUTPUT -d 10.0.0.10 -j ACCEPT” 表示允许发往 IP 地址为 10.0.0.10 的数据包从 OUTPUT 链发出。同样可以指定目的 IP 地址段进行匹配。
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP
(3)网络接口匹配
网络接口匹配是根据数据包进出的网络接口来进行筛选和控制,有助于更精确地管理不同网络连接上的流量。
- 输入接口匹配:使用 “-i” 选项指定输入接口,例如 “iptables -A INPUT -i eth0 -j ACCEPT” 表示只允许从 eth0 网络接口进入的数据包通过 INPUT 链。常用于区分不同网络连接(如内网、外网接口),对进入的流量进行不同的处理。
- 输出接口匹配:使用 “-o” 选项指定输出接口,例如 “iptables -A OUTPUT -o wlan0 -j DROP” 表示丢弃从 wlan0 网络接口发出的数据包。可以根据实际的网络拓扑和安全需求,对从特定接口发出的流量进行控制。
iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i ens33 -s 172.16.0.0/16 -j DROP
iptables -A INPUT -i ens33 -s 192.186.0.0/16 -j DROP
2 隐含匹配
(1)端口匹配
- 原理:端口是网络通信中用于区分不同应用程序或服务的逻辑标识。在 TCP 和 UDP 协议中,每个数据包都包含源端口和目的端口信息。端口匹配通过检查数据包中的端口号,来决定是否应用相应的规则。
- 示例:在
iptables
中,使用--sport
指定源端口,--dport
指定目的端口。- 允许外部主机访问本地的 HTTP 服务(默认端口 80):
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- 允许本地主机访问外部的 DNS 服务(UDP 端口 53):
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
(2)ICMP类型匹配
- 原理:ICMP(Internet Control Message Protocol,互联网控制报文协议)用于在 IP 主机、路由器之间传递控制消息,不同类型的 ICMP 消息用于不同的目的。ICMP 类型匹配通过检查数据包中的 ICMP 类型字段,对不同类型的 ICMP 消息进行不同的处理。
- 示例:在
iptables
中,使用--icmp-type
指定 ICMP 类型。- 允许本地主机接收外部的
ping
请求(ICMP 类型为 8):
- 允许本地主机接收外部的
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
- 允许本地主机发送
ping
响应(ICMP 类型为 0):
iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
3 显示匹配
(1)多端口匹配
- 原理:同时指定多个源或目的端口,通过特定语法参数列出端口号供防火墙识别。
- 用途:统一管理多种服务端口,简化规则设置。
- 示例:iptables 中用 “--multiport”,如
- “iptables -A INPUT -p tcp --dport --multiport 22,80,443 -j ACCEPT”。
(2)IP范围匹配
- 原理:IP 范围匹配通过指定源 IP 地址或目的 IP 地址的范围来筛选数据包。可以使用 CIDR 表示法或指定起始和结束 IP 地址来定义范围。
- 示例:在
iptables
中,使用-s
选项指定源 IP 范围,-d
选项指定目的 IP 范围。- 允许来自 192.168.1.0/24 子网的主机访问本地服务器:
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
- 阻止发往 10.0.0.0/8 子网的数据包:
iptables -A OUTPUT -d 10.0.0.0/8 -j DROP
(3)MAC地址匹配
- 原理:MAC 地址匹配是根据数据包的源 MAC 地址来进行匹配。MAC 地址是网络设备的物理地址,在局域网内具有唯一性。
- 示例:在
iptables
中,使用-m mac
模块和--mac-source
选项进行 MAC 地址匹配。- 允许 MAC 地址为 00:11:22:33:44:55 的设备访问本地网络:
iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT
- 阻止 MAC 地址为 66:77:88:99:AA:BB 的设备访问本地网络:
iptables -A INPUT -m mac --mac-source 66:77:88:99:AA:BB -j DROP
(4)状态匹配
- 原理:状态匹配基于连接的状态信息进行数据包的筛选。防火墙会跟踪网络连接的状态,如新建连接(NEW)、已建立连接(ESTABLISHED)、相关连接(RELATED)和无效连接(INVALID)等。
- 示例:在
iptables
中,使用-m state
模块和--state
选项进行状态匹配。- 允许已建立连接和相关连接的数据包进入:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 拒绝新建连接的数据包(除非有特定规则允许):
iptables -A INPUT -m state --state NEW -j DROP