Linux防火墙技术
概述
-
Linux防火墙概述
- Linux防火墙是一种基于Linux操作系统的网络安全工具,用于控制进出系统的网络流量。它可以根据预设的规则,允许、拒绝或者修改网络数据包,从而保护系统免受未经授权的访问、网络攻击等安全威胁。
-
主要的Linux防火墙技术
- iptables
- 工作原理 :
- iptables是基于内核的防火墙工具,它通过规则链(chains)和表(tables)来工作。主要有三个表:
filter(用于过滤数据包,这是最常用的表)、nat(用于网络地址转换)和mangle(用于修改数据包)。每个表包含不同的链,例如在filter表中有INPUT(处理进入本机的数据包)、OUTPUT(处理从本机发出的数据包)和FORWARD(处理转发的数据包)等链。当一个数据包进入系统时,它会根据数据包的流向(进入、发出还是转发)进入相应的链,然后按照链中的规则进行处理。规则可以是允许(ACCEPT)、拒绝(DROP)、记录日志(LOG)等操作。例如,iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT这条规则表示允许来自192.168.1.0/24网段的TCP协议、目的端口为80的数据包进入系统。
- iptables是基于内核的防火墙工具,它通过规则链(chains)和表(tables)来工作。主要有三个表:
- 配置方式 :
- 可以通过命令行进行配置。例如,添加规则使用
-A(追加规则)或-I(插入规则)选项,删除规则使用-D选项。如iptables -D INPUT 1可以删除INPUT链中的第一条规则。除了命令行配置,也可以将规则写成脚本文件,以便于管理和重复使用。
- 可以通过命令行进行配置。例如,添加规则使用
- 应用场景 :
- 适用于各种Linux服务器和网络环境。在Web服务器防护中,可以限制只有特定IP段的用户能够访问HTTP或HTTPS服务;在数据库服务器防护中,可防止外部恶意访问数据库端口。
- 工作原理 :
- ufw(Uncomplicated Firewall)
- 工作原理 :
- ufw是一个简化的防火墙工具,它基于iptables构建,通过简单的命令来配置防火墙规则。它使用应用程序名称或端口号来定义规则。例如,
ufw allow ssh命令会自动识别SSH服务对应的端口(通常是22),并允许通过这个端口的流量,其实质是在iptables底层添加了相应的允许规则。
- ufw是一个简化的防火墙工具,它基于iptables构建,通过简单的命令来配置防火墙规则。它使用应用程序名称或端口号来定义规则。例如,
- 配置方式 :
- 主要通过命令行进行配置。基本的命令包括
allow(允许)、deny(拒绝)和reject(拒绝并返回错误信息)。例如,ufw deny http会阻止HTTP(端口80)的流量。还可以通过ufw enable来启用防火墙,ufw disable来禁用防火墙。
- 主要通过命令行进行配置。基本的命令包括
- 应用场景 :
- 对于初学者或者在简单的Linux服务器环境中非常实用。例如,在个人博客服务器上,可以快速地使用ufw允许Web流量(HTTP和HTTPS),同时拒绝其他不必要的端口访问。
- 工作原理 :
- firewalld
- 工作原理 :
- firewalld是一个动态防火墙管理工具,它使用区域(zones)的概念来管理网络流量。不同的区域有不同的默认策略,例如
public区域默认拒绝传入连接,trusted区域允许所有连接等。每个区域包含服务(如HTTP、HTTPS等服务)和端口的规则。当一个网络接口与一个区域关联后,这个接口的网络流量就会按照该区域的规则进行处理。例如,将一个网络接口关联到public区域后,如果要允许HTTP服务,就需要将HTTP服务添加到public区域的允许列表中。
- firewalld是一个动态防火墙管理工具,它使用区域(zones)的概念来管理网络流量。不同的区域有不同的默认策略,例如
- 配置方式 :
- 可以通过命令行工具
firewall - cmd进行配置。例如,firewall - cmd - - zone = public - - add - service = http - - permanent可以将HTTP服务添加到public区域的永久规则中,然后使用firewall - cmd - - reload来重新加载规则,使新规则生效。也可以通过图形化工具(如在一些Linux桌面环境中)进行配置。
- 可以通过命令行工具
- 应用场景 :
- 在企业级Linux服务器和网络环境中应用广泛。例如,在企业内部网络与外部网络之间的边界服务器上,通过合理配置不同的区域,可以有效地控制内部和外部网络之间的访问,同时方便地管理各种网络服务的访问权限。
- 工作原理 :
- iptables
-
Linux防火墙的高级功能
- 网络地址转换(NAT) :
- 例如在iptables的
nat表中,可以实现源地址转换(SNAT)和目的地址转换(DNAT)。源地址转换通常用于内部网络通过一个公共IP地址访问外部网络,这样外部网络看到的是公共IP地址而不是内部网络各个主机的私有IP地址。目的地址转换则可以用于将外部网络对公共IP地址的访问转发到内部网络的特定服务器上,例如将外部对公司公网IP的HTTP请求转发到内部的Web服务器上。
- 例如在iptables的
- 端口转发 :
- 通过iptables或者firewalld等工具可以实现端口转发。例如,将外部访问本地服务器的端口8080的流量转发到内部网络的另一个服务器的端口80上,这在隐藏内部服务器真实端口或者将多个服务映射到不同外部端口时非常有用。
- 入侵检测和防御(基于防火墙规则) :
- 一些高级的Linux防火墙配置可以实现简单的入侵检测。例如,通过设置规则来限制某个IP地址在短时间内对系统端口的连接次数,当超过设定的阈值时,将该IP地址的访问进行拒绝或者记录日志,从而起到一定的入侵防御作用。
- 网络地址转换(NAT) :
iptable详细说明
-
基本概念
- 表(Tables) :iptables主要有三个表,每个表用于不同的目的。
- filter表:这是最常用的表,用于过滤数据包,决定数据包是被允许(ACCEPT)、拒绝(DROP)还是被丢弃并返回一个ICMP消息(REJECT)。例如,控制对本地主机的访问,像允许或禁止特定IP地址访问本地的SSH服务(端口22)就是在这个表中操作。
- nat表:主要用于网络地址转换(NAT)。它包含两种类型的转换,源地址转换(SNAT)和目的地址转换(DNAT)。SNAT用于内部网络通过一个公共IP地址访问外部网络,隐藏内部网络的私有IP地址。例如,在一个使用私有IP地址的局域网中,通过SNAT将内部主机的IP地址转换为路由器的公共IP地址来访问互联网。DNAT则用于将外部网络对公共IP地址的访问转发到内部网络的特定主机或端口上。比如,将外部对公司公网IP的HTTP请求(端口80)转发到内部的Web服务器上。
- mangle表:用于修改数据包的某些部分,如修改IP头中的TOS(Type of Service)字段,以实现对网络流量的优先级划分或者标记数据包用于其他网络设备(如路由器)的特殊处理。不过这种用法相对复杂,在一般的网络安全场景中使用较少。
- 链(Chains) :每个表包含不同的链,这些链是规则的集合,数据包会按照特定的顺序在链中进行处理。
- INPUT链:用于处理进入本机的数据包。例如,当外部网络的一台主机尝试向本地主机发送数据包时,这个数据包首先会经过INPUT链。在这里可以设置规则,比如只允许来自特定IP网段的主机访问本地主机的某些服务端口。
- OUTPUT链:用于处理从本机发出的数据包。如果本地主机主动向外部网络发送数据包,这些数据包会经过OUTPUT链。可以在这里设置规则来限制本地主机的对外访问,比如禁止本地主机访问某些恶意网站或者限制其只能向特定的服务器发送特定类型的数据包。
- FORWARD链:用于处理转发的数据包。这在Linux主机作为路由器或者网关的情况下使用。例如,当内部网络的一台主机通过Linux主机转发数据包来访问外部网络,或者外部网络的数据包通过Linux主机转发到内部网络的其他主机时,这些数据包会经过FORWARD链。可以在这里设置规则来控制内部网络和外部网络之间的数据包转发,比如禁止某些外部IP地址访问内部网络的特定网段。
- 表(Tables) :iptables主要有三个表,每个表用于不同的目的。
-
规则(Rules)
- 语法结构 :iptables规则的基本语法是
iptables -t <表名> <命令> <链名> <匹配条件> -j <动作>。例如,iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT。-t <表名>:指定要操作的表,如filter、nat或mangle,如果省略这个参数,默认操作filter表。<命令>:常见的命令有-A(追加规则)、-I(插入规则)、-D(删除规则)、-F(清空链中的所有规则)等。例如,-A INPUT表示在INPUT链的末尾追加一条规则。<链名>:指定要操作的链,如INPUT、OUTPUT或FORWARD。<匹配条件>:这是规则的核心部分,用于确定哪些数据包符合这条规则。可以通过源IP地址(-s)、目的IP地址(-d)、协议类型(-p,如tcp、udp等)、端口号(--sport为源端口,--dport为目的端口)等来匹配数据包。例如,-s 192.168.1.0/24表示源IP地址来自192.168.1.0/24网段的数据包,-p tcp --dport 80表示TCP协议且目的端口为80的数据包。-j <动作>:指定当数据包符合匹配条件时要执行的动作,常见的动作有ACCEPT(允许数据包通过)、DROP(直接丢弃数据包,不返回任何信息)、REJECT(丢弃数据包并返回一个ICMP错误消息)、LOG(记录数据包的相关信息到日志)等。
- 语法结构 :iptables规则的基本语法是
-
配置示例
-
允许特定IP访问本地服务 :假设要允许来自
192.168.1.0/24网段的主机访问本地的SSH服务(端口22),可以使用以下规则:iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT -
禁止外部访问本地某端口 :要禁止外部主机访问本地主机的某个端口(例如端口3306,可能是MySQL数据库端口),可以使用以下规则:
iptables -t filter -A INPUT -p tcp --dport 3306 -j DROP -
实现端口转发(DNAT) :假设本地主机有两个网络接口,一个连接外部网络(公网IP),一个连接内部网络(私有IP),要将外部网络对本地主机公网IP的端口8080的访问转发到内部网络的一台Web服务器(私有IP地址为
192.168.1.10)的端口80上,可以使用以下规则:iptables -t nat -A PREROUTING -i <公网接口名> -p tcp --dport 8080 -j DNAT --to - destination 192.168.1.10:80
-
-
保存和恢复规则
- 在不同的Linux发行版中,保存和恢复iptables规则的方式有所不同。
- CentOS系统 :可以使用
service iptables save命令将当前的iptables规则保存到配置文件中,这样在系统重启后规则依然有效。 - Ubuntu系统 :需要安装
iptables - persistent软件包(sudo apt - get install iptables - persistent),安装过程中会提示是否保存当前规则,或者之后可以使用netfilter - persistent save命令保存规则。在系统重启后,这些规则会自动加载。
- CentOS系统 :可以使用
- 在不同的Linux发行版中,保存和恢复iptables规则的方式有所不同。
iptables常用命令
iptables 是 Linux 下用于配置内核防火墙的工具。它允许你定义规则,这些规则决定了如何处理通过网络接口传输的数据包。以下是一些常用的 iptables 命令和示例:
基本命令格式
sh
iptables [选项] [链] [条件] [动作]
常用选项
-A <链>: 向指定链追加一条规则。-D <链> [规则编号|匹配条件]: 从指定链中删除一条规则。-I <链> [规则编号]: 在指定链的指定位置插入一条规则(默认位置为链的开头)。-L [链] [选项]: 列出指定链中的所有规则。-F <链>: 清空指定链中的所有规则。-X <链>: 删除用户自定义的链(必须确保链为空)。-P <链> <动作>: 设置指定链的默认策略。-n: 以数字形式显示地址和端口号。-v: 显示详细信息(如包计数和字节计数)。-t <表>: 指定要操作的表(默认是filter表,其他表包括nat、mangle和raw)。
常用链
INPUT: 处理进入本机的数据包。FORWARD: 处理经过本机的转发数据包。OUTPUT: 处理从本机发出的数据包。
常用动作
ACCEPT: 允许数据包通过。DROP: 丢弃数据包,不给出任何回应。REJECT: 拒绝数据包通过,并向发送方发送一个回应。LOG: 记录数据包信息,然后按照默认策略处理(通常与-j一起使用)。
示例
-
列出所有规则
shiptables -L -v -n -
清空所有规则
shiptables -F -
设置默认策略
shiptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT -
允许 SSH 连接
shiptables -A INPUT -p tcp --dport 22 -j ACCEPT -
允许 HTTP 和 HTTPS 连接
shiptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT -
拒绝所有 ICMP(ping)请求
shiptables -A INPUT -p icmp --icmp-type echo-request -j DROP -
记录并丢弃所有进入的 UDP 数据包
shiptables -A INPUT -p udp -j LOG --log-prefix "UDP Packet: " --log-level 4 iptables -A INPUT -p udp -j DROP -
删除规则
删除所有允许 SSH 连接的规则(假设这是第一条规则):
shiptables -D INPUT 1或者通过匹配条件删除:
shiptables -D INPUT -p tcp --dport 22 -j ACCEPT -
创建自定义链
shiptables -N MYCHAIN -
将数据包重定向到自定义链
shiptables -A INPUT -p tcp --dport 8080 -j MYCHAIN -
在自定义链中添加规则
shiptables -A MYCHAIN -j ACCEPT -
删除自定义链(确保链为空)
shiptables -X MYCHAIN
这些命令和示例应该能帮助你入门 iptables 的基本使用。如果你需要更复杂的配置,建议查阅 iptables 的官方文档或相关教程。
Firewalld详细介绍
- 基本概念
- 动态管理:Firewalld是一个动态防火墙管理工具,与传统的iptables相比,它能够在运行时动态地更新规则,而不需要像iptables那样重新加载整个规则集。这意味着可以在不中断现有连接的情况下,对防火墙规则进行修改,使得网络服务的管理更加灵活。
- 区域(Zones)概念 :它使用区域来管理网络流量。每个区域代表一种特定的信任级别或网络环境,有不同的默认策略。例如,
trusted区域允许所有传入的网络连接,因为这个区域通常用于完全信任的网络,如本地内部网络;而public区域默认拒绝传入连接,用于连接不可信的公共网络,如互联网。 - 服务(Services)和端口(Ports) :Firewalld通过服务和端口来定义允许或禁止的网络流量。服务是指一系列相关的端口和协议,例如
http服务通常关联端口80和TCP协议。可以通过允许或禁止特定的服务或端口来控制网络访问。
-
安装和启动
- 安装 :在许多Linux发行版中,Firewalld是预装的。如果没有安装,在CentOS系统中可以使用
yum install firewalld命令进行安装,在Ubuntu等基于Debian的系统中,虽然不是默认的防火墙工具,但也可以通过添加适当的软件源来安装。 - 启动和停止 :使用
systemctl命令来控制Firewalld的启动和停止。例如,systemctl start firewalld可以启动Firewalld服务,systemctl stop firewalld则停止服务。同时,可以使用systemctl status firewalld来查看Firewalld的当前状态,包括是否正在运行、最近的日志信息等。
- 安装 :在许多Linux发行版中,Firewalld是预装的。如果没有安装,在CentOS系统中可以使用
-
区域管理
- 查看区域列表 :使用
firewall - cmd --get - zones命令可以查看Firewalld中所有可用的区域,例如public、trusted、drop等。每个区域都有其特定的用途和默认规则。 - 设置默认区域 :可以使用
firewall - cmd --set - default - zone=<区域名称>命令来设置默认区域。例如,firewall - cmd --set - default - zone=public将默认区域设置为public,这意味着新添加的网络接口如果没有特别指定区域,将使用public区域的规则。 - 区域的详细信息 :通过
firewall - cmd --zone=<区域名称> --list - all命令可以查看特定区域的详细信息,包括允许的服务、端口、源IP地址等。例如,firewall - cmd --zone=public --list - all会列出public区域的所有设置。在public区域中,默认情况下只允许一些基本的服务,如dhcpv6 - client,对于其他服务和端口通常是禁止的。
- 查看区域列表 :使用
-
服务和端口管理
- 允许和禁止服务 :使用
firewall - cmd --zone=<区域名称> --add - service=<服务名称> --permanent命令可以永久地将一个服务添加到指定区域的允许列表中。例如,要在public区域允许http服务,可以使用firewall - cmd --zone=public --add - service=http --permanent。相对应地,使用firewall - cmd --zone=<区域名称> --remove - service=<服务名称>命令来删除服务。 - 允许和禁止端口 :通过
firewall - cmd --zone=<区域名称> --add - port=<端口号/协议> --permanent命令可以添加端口。例如,要在public区域允许TCP协议的8080端口,可以使用firewall - cmd --zone=public --add - port=8080/tcp --permanent。同样,使用firewall - cmd --zone=<区域名称> --remove - port=<端口号/协议>来删除端口。 - 重新加载规则 :在添加或修改规则后,需要使用
firewall - cmd --reload命令来重新加载Firewalld的规则,使新规则生效。
- 允许和禁止服务 :使用
-
富规则(Rich Rules)
- 定义和使用 :富规则是一种更灵活的规则定义方式,可以基于源IP地址、目的IP地址、端口、协议、用户等多种条件来定义防火墙规则。例如,
firewall - cmd --zone=public --add - rich - rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent这条富规则表示允许来自192.168.1.0/24网段的主机访问http服务,并将这个规则永久添加到public区域。 - 优势:富规则提供了比普通的服务和端口规则更细粒度的控制,能够满足复杂的网络安全策略需求,例如限制特定用户组或特定IP范围对某些服务的访问,同时允许其他用户或IP正常访问。
- 定义和使用 :富规则是一种更灵活的规则定义方式,可以基于源IP地址、目的IP地址、端口、协议、用户等多种条件来定义防火墙规则。例如,
filewall常见命令行
-
基本操作命令
- 查看Firewalld状态
- 命令:
systemctl status firewalld - 示例:在终端中输入
systemctl status firewalld,会显示Firewalld服务的当前状态。如果服务正在运行,会显示类似"active (running)"的信息,同时还会展示一些最近的日志信息,如启动时间、加载的配置文件等。
- 命令:
- 启动Firewalld服务
- 命令:
systemctl start firewalld - 示例:当需要开启Firewalld防护时,使用
systemctl start firewalld命令,它会启动Firewalld服务,并且根据默认配置或之前保存的配置加载防火墙规则。
- 命令:
- 停止Firewalld服务
- 命令:
systemctl stop firewalld - 示例:在某些特殊情况下,如进行网络故障排查或者暂时不需要防火墙保护时,可以使用
systemctl stop firewalld命令来停止Firewalld服务。
- 命令:
- 查看Firewalld状态
-
区域(Zone)相关命令
- 查看所有区域
- 命令:
firewall - cmd --get - zones - 示例:执行
firewall - cmd --get - zones命令,会列出Firewalld中所有可用的区域,如public、trusted、drop等。每个区域都有自己的默认策略和规则设置,用于适应不同的网络环境。
- 命令:
- 设置默认区域
- 命令:
firewall - cmd --set - default - zone=<区域名称> - 示例:例如,
firewall - cmd --set - default - zone=public将默认区域设置为public。这意味着新添加的网络接口如果没有特别指定区域,将使用public区域的规则来处理网络流量。
- 命令:
- 查看特定区域的详细信息
- 命令:
firewall - cmd --zone=<区域名称> --list - all - 示例:若想了解
public区域的详细设置,可使用firewall - cmd --zone=public --list - all命令。输出内容包括该区域允许的服务、端口、源IP地址范围、ICMP类型等信息,有助于了解当前区域的网络访问策略。
- 命令:
- 查看所有区域
-
服务(Service)和端口(Port)相关命令
- 允许服务进入特定区域(永久生效)
- 命令:
firewall - cmd --zone=<区域名称> --add - service=<服务名称> --permanent - 示例:要在
public区域永久允许http服务,可使用firewall - cmd --zone=public --add - service=http --permanent命令。这会将http服务添加到public区域的允许访问列表中,使得外部网络可以访问该区域内主机提供的http服务。
- 命令:
- 禁止服务进入特定区域
- 命令:
firewall - cmd --zone=<区域名称> --remove - service=<服务名称> - 示例:如果要禁止
https服务在public区域的访问,可使用firewall - cmd --zone=public --remove - service=https命令。
- 命令:
- 允许端口进入特定区域(永久生效)
- 命令:
firewall - cmd --zone=<区域名称> --add - port=<端口号/协议> --permanent - 示例:要在
public区域永久允许TCP协议的8080端口,可使用firewall - cmd --zone=public --add - port=8080/tcp --permanent命令。
- 命令:
- 禁止端口进入特定区域
- 命令:
firewall - cmd --zone=<区域名称> --remove - port=<端口号/协议> - 示例:若要禁止UDP协议的53端口在
public区域的访问,可使用firewall - cmd --zone=public --remove - port=53/udp命令。
- 命令:
- 重新加载规则
- 命令:
firewall - cmd --reload - 示例:在对防火墙的服务或端口规则进行添加、删除或修改后,需要使用
firewall - cmd --reload命令来重新加载规则,使新的设置生效。例如,在添加了一个新的服务到public区域后,必须执行firewall - cmd --reload才能让这个服务真正被允许访问。
- 命令:
- 允许服务进入特定区域(永久生效)
-
富规则(Rich Rule)相关命令
- 添加富规则(永久生效)
- 命令:
firewall - cmd --zone=<区域名称> --add - rich - rule='<富规则内容>' --permanent - 示例:
firewall - cmd --zone=public --add - rich - rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent。这条命令在public区域添加了一条富规则,允许来自192.168.1.0/24网段的主机访问http服务,并且这个规则会永久生效。
- 命令:
- 删除富规则
- 命令:
firewall - cmd --zone=<区域名称> --remove - rich - rule='<富规则内容>' - 示例:如果要删除之前添加的富规则,可以使用
firewall - cmd --zone=public --remove - rich - rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept'命令。
- 命令:
- 添加富规则(永久生效)