Linux 网络管理:防火墙配置
1. 防火墙概述
防火墙是保护计算机系统和网络免受未经授权访问和网络攻击的安全机制。Linux 系统中,防火墙通过控制进入和离开网络的数据包,实现网络流量的过滤和管理。
Linux 上的防火墙配置工具有多种,其中最为常用的是 iptables
和现代 firewalld
,以及一些其他如 ufw
这样的简化管理工具。
2. Linux 防火墙的基本原理
防火墙的基本工作原理是根据设定的规则对网络数据包进行过滤和处理,规则通常包括以下几部分:
- 源地址:数据包的来源地址,可以是 IP 或网络段。
- 目标地址:数据包的目的地址。
- 协议类型:如 TCP、UDP、ICMP 等。
- 源端口和目标端口:与传输协议相关联的端口号,如 HTTP 服务的 80 端口。
防火墙通过链(Chains)和规则(Rules)来定义如何处理数据包:
- 链(Chains):防火墙规则的处理路径,通常分为三类:
- INPUT:进入系统的数据包(例如从外部网络到本地主机)。
- FORWARD:转发通过本地系统的数据包(例如路由设备的功能)。
- OUTPUT:从本地系统发送出去的数据包。 - 规则(Rules):每个链上可以设置多条规则,定义了如何处理特定的数据包。常见的动作包括:
- ACCEPT:允许数据包通过。
- DROP:丢弃数据包,不给出响应。
- REJECT:拒绝数据包并返回错误信息。
3. iptables
:经典的防火墙工具
iptables
是 Linux 内核中的网络数据包过滤框架,提供了强大的防火墙功能,主要管理 IPv4 的防火墙规则。
3.1 iptables
基本语法
iptables
命令的基本格式如下:
iptables [选项] 链名 [条件匹配] -j 动作
- 链名:指定在哪个链上操作(如 INPUT、FORWARD、OUTPUT)。
- 条件匹配:指定数据包匹配条件,如源地址、目标地址、协议等。
- 动作:定义匹配规则后的处理动作,如 ACCEPT、DROP、REJECT。
3.2 常用 iptables
命令
- 查看当前规则
iptables -L
- 允许某个端口的流量
允许 80 端口的 HTTP 流量:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- 拒绝特定 IP 地址
阻止来自 192.168.1.100
的所有流量:
iptables -A INPUT -s 192.168.1.100 -j DROP
- 删除特定规则
假设想删除特定的规则,可以使用 -D
参数:
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
- 保存规则
iptables
的规则默认在系统重启后会丢失,因此需要手动保存。根据不同的发行版,保存命令可能不同:
在基于 Debian 系列的系统中,可以通过 iptables-save
命令保存规则:
iptables-save > /etc/iptables/rules.v4
然后,通过 iptables-restore
恢复:
iptables-restore < /etc/iptables/rules.v4
在基于 CentOS 或 RHEL 的系统中,保存规则可以使用以下命令:
service iptables save
3.3 iptables
的表和链
iptables
使用不同的表来管理不同类型的防火墙规则,每个表包含多个链:
-
filter 表:默认表,管理最常见的输入、输出和转发规则。常用链包括:
- INPUT:处理进入本机的数据包。
- FORWARD:处理通过本机转发的数据包。
- OUTPUT:处理本机发送的数据包。 -
nat 表:处理与网络地址转换相关的规则。常用链包括:
- PREROUTING:在数据包进入路由前处理。
- POSTROUTING:在数据包路由后处理。
- OUTPUT:处理本地生成的需要 NAT 的数据包。 -
mangle 表:用于修改数据包的服务类型、TTL 等特性。
例如,配置 NAT 地址转换时:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
4. firewalld
:现代防火墙管理工具
firewalld
是 iptables
的一个更高级的替代品,提供了动态防火墙管理。它简化了防火墙规则的管理,并支持区域概念,允许根据网络接口或源地址设置不同的防火墙策略。
4.1 firewalld
的基本概念
- 区域(Zones):每个网络接口或源地址可以分配到一个区域,区域定义了不同的信任级别。例如,
public
区域默认会拒绝大部分的入站流量,而trusted
区域则允许所有流量。 - 服务(Services):
firewalld
通过预定义的服务(如 HTTP、SSH)来简化规则管理。服务包含了默认端口、协议的定义,用户可以通过启用或禁用服务来管理网络访问。 - 即时与永久规则:
firewalld
允许即时应用规则(不重启生效),并区分永久规则和即时规则。永久规则在重启系统后依然有效。
4.2 firewalld
基本操作
- 查看防火墙状态
sudo firewall-cmd --state
- 查看当前区域和规则
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all
- 启用或禁用服务
例如,启用 HTTP 服务:
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
这里 --permanent
使规则永久生效,--reload
用于重新加载配置。
- 添加端口规则
除了预定义的服务,用户也可以通过端口号直接添加规则。例如,允许 8080 端口的流量:
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
- 删除规则
删除某个服务或端口规则:
sudo firewall-cmd --remove-service=http --permanent
sudo firewall-cmd --reload
4.3 区域配置
每个网络接口可以分配到不同的区域,默认情况下,所有接口分配到 public
区域。可以使用以下命令查看接口所属区域:
sudo firewall-cmd --get-active-zones
更改接口所属区域:
sudo firewall-cmd --zone=trusted --change-interface=eth0 --permanent
sudo firewall-cmd --reload
5. ufw
:简化的防火墙管理工具
ufw
(Uncomplicated Firewall)是 Ubuntu 系统上简化防火墙管理的工具,它是 iptables
的前端工具,旨在提供更加用户友好的命令来管理防火墙。
5.1 ufw
基本命令
- 启用防火墙
sudo ufw enable
- 查看防火墙状态
sudo ufw status
- 允许某个服务或端口
允许 HTTP 服务:
sudo ufw allow http
允许 22 端口的 SSH 流量:
sudo ufw allow 22/tcp
- 拒绝特定 IP 地址的连接
sudo ufw deny from 192.168.1.100
- 禁用防火墙
sudo ufw disable
5.2 配置文件管理
ufw
的配置文件位于 /etc/ufw/ufw.conf
,可以在这里启用或禁用防火墙启动时自动加载。
6. 防火墙策略配置示例
假设我们要为一台 Web 服务器配置防火墙,目标是允许 HTTP(80)和 HTTPS(443)流量,同时阻止其他所有入站流量。我们可以使用 iptables
和 firewalld
配置如下:
使用 iptables
配置:
iptables -P INPUT DROP # 默认丢弃所有入站流量
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT # 允许所有出站流量
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许现有连接
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 HTTP 流量
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许 HTTPS 流量
使用 firewalld
配置:
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
7. 总结
Linux 的防火墙工具如 iptables
、firewalld
和 ufw
提供了灵活强大的网络安全管理手段。通过配置和管理防火墙规则,可以有效控制网络流量,防止不必要的外部访问,同时保护系统免受潜在的网络攻击。不同工具适合不同场景,iptables
提供了细粒度的控制,firewalld
提供了动态防火墙管理,而 ufw
则简化了配置过程。