Contents

一文讲透 Linux 防火墙:从入门到精通的完整指南

一文讲透 Linux 防火墙:从入门到精通的完整指南

前言

Linux防火墙是系统安全的第一道防线,对于任何Linux服务器来说都是必不可少的安全配置。本文将从基础概念到高级应用,全面解析Linux防火墙的工作原理、配置方法和最佳实践。

什么是防火墙

防火墙是一种网络安全系统,用于监控和控制进出网络的网络流量。它根据预定义的安全规则来决定是否允许特定的网络连接通过。

防火墙的主要功能

  • 包过滤:检查每个数据包,根据规则决定是否放行
  • 状态检测:跟踪连接状态,只允许合法的响应流量
  • 网络地址转换(NAT):隐藏内部网络结构
  • 端口转发:将外部请求转发到内部特定主机

Linux防火墙的演进历史

1. ipfwadm(Linux 2.0)

最早的Linux防火墙工具,功能相对简单。

2. ipchains(Linux 2.2)

引入了链的概念,提供了更灵活的规则管理。

3. iptables(Linux 2.4/2.6)

现代Linux防火墙的基础,功能强大,至今仍在广泛使用。

4. nftables(Linux 3.13+)

新一代防火墙框架,旨在替代iptables,提供更简洁的语法和更好的性能。

5. firewalld

基于区域的动态防火墙管理工具,提供了更友好的用户界面。

iptables 详解

基本概念

iptables基于表(tables)、链(chains)和规则(rules)的概念:

表(Tables)

  • filter表:默认表,用于包过滤
  • nat表:网络地址转换
  • mangle表:修改数据包
  • raw表:配置数据包处理方式

链(Chains)

  • INPUT:处理进入本机的数据包
  • OUTPUT:处理本机发出的数据包
  • FORWARD:处理经过本机转发的数据包
  • PREROUTING:路由前处理
  • POSTROUTING:路由后处理

基本语法

iptables [-t 表名] 命令 [链名] [条件] [-j 目标]

常用命令

查看规则

# 查看所有规则
iptables -L -n -v

# 查看特定表
iptables -t nat -L -n -v

# 查看规则编号
iptables -L -n --line-numbers

添加规则

# 允许SSH连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

删除规则

# 按编号删除
iptables -D INPUT 3

# 按规则删除
iptables -D INPUT -p tcp --dport 22 -j ACCEPT

保存和恢复规则

# 保存规则(CentOS/RHEL)
service iptables save

# 保存规则(Ubuntu/Debian)
iptables-save > /etc/iptables/rules.v4

# 恢复规则
iptables-restore < /etc/iptables/rules.v4

实战案例

基础安全配置

#!/bin/bash
# 清空现有规则
iptables -F
iptables -X

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许HTTP和HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT

# 防止Ping洪水攻击
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

Web服务器配置

#!/bin/bash
# Web服务器防火墙配置

# 允许HTTP和HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许SSH(指定特定IP)
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT

# 允许数据库连接(仅限内网)
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT

# 限制连接频率
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

firewalld 详解

基本概念

firewalld引入了"区域(zone)“的概念,每个区域代表不同的信任级别:

预定义区域

  • drop:丢弃所有进入的数据包
  • block:拒绝所有进入的连接请求
  • public:不信任的公共区域
  • external:外部网络,启用伪装
  • dmz:非军事区,隔离的服务器
  • work:工作网络,相对可信
  • home:家庭网络,基本可信
  • internal:内部网络,完全可信
  • trusted:完全信任,允许所有连接

基本命令

查看状态和信息

# 查看firewalld状态
firewall-cmd --state

# 查看活动区域
firewall-cmd --get-active-zones

# 查看默认区域
firewall-cmd --get-default-zone

# 查看区域详细信息
firewall-cmd --zone=public --list-all

配置端口和服务

# 添加端口(临时)
firewall-cmd --zone=public --add-port=80/tcp

# 添加端口(永久)
firewall-cmd --zone=public --add-port=80/tcp --permanent

# 添加服务
firewall-cmd --zone=public --add-service=http

# 删除端口
firewall-cmd --zone=public --remove-port=80/tcp

配置富规则(Rich Rules)

# 允许特定IP访问SSH
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'

# 拒绝特定IP访问
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.1" reject'

# 端口转发
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" forward-port port="8080" protocol="tcp" to-port="80"'

实战案例

配置Web服务器

#!/bin/bash
# 设置默认区域为public
firewall-cmd --set-default-zone=public

# 添加HTTP和HTTPS服务
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent

# 允许特定IP访问SSH
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent

# 重新加载配置
firewall-cmd --reload

配置端口转发

#!/bin/bash
# 启用IP伪装
firewall-cmd --zone=public --add-masquerade --permanent

# 配置端口转发(将外部8080转发到内部80)
firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80 --permanent

# 重新加载配置
firewall-cmd --reload

nftables 详解

基本概念

nftables是iptables的替代品,提供了更现代化的语法和更好的性能。

主要组件

  • 表(tables):包含链的容器
  • 链(chains):包含规则的容器
  • 规则(rules):具体的过滤条件
  • 集合(sets):可以包含多个元素的容器

基本语法

nft [list|add|delete|flush] [table|chain|rule|set] [family] [table] [handle]

实战案例

基础配置

#!/bin/bash
# 清空现有规则
nft flush ruleset

# 创建表
nft add table inet filter

# 创建链
nft add chain inet filter input { type filter hook input priority 0 \; }
nft add chain inet filter output { type filter hook output priority 0 \; }
nft add chain inet filter forward { type filter hook forward priority 0 \; }

# 添加规则
# 允许本地回环
nft add rule inet filter input iif lo accept

# 允许已建立的连接
nft add rule inet filter input ct state established,related accept

# 允许SSH
nft add rule inet filter input tcp dport 22 accept

# 允许HTTP和HTTPS
nft add rule inet filter input tcp dport {80, 443} accept

# 默认拒绝
nft add rule inet filter input drop

防火墙最佳实践

1. 最小权限原则

  • 只允许必要的服务和端口
  • 限制访问来源IP范围
  • 使用特定的协议和端口

2. 分层防护

  • 网络层防火墙
  • 主机防火墙
  • 应用层安全

3. 定期审查

  • 定期检查防火墙规则
  • 删除不必要的规则
  • 更新安全策略

4. 日志监控

  • 启用防火墙日志
  • 监控异常连接
  • 设置告警机制

5. 测试验证

  • 测试规则有效性
  • 验证安全策略
  • 定期渗透测试

常见问题排查

1. 连接被拒绝

# 检查防火墙状态
iptables -L -n -v
firewall-cmd --list-all

# 检查特定端口
netstat -tlnp | grep 端口号
ss -tlnp | grep 端口号

2. 规则不生效

# 检查规则顺序
iptables -L -n --line-numbers

# 检查默认策略
iptables -L -n | grep policy

# 重新加载配置
firewall-cmd --reload

3. 性能问题

# 检查规则数量
iptables -L -n | wc -l

# 检查系统负载
top
htop

总结

Linux防火墙是系统安全的重要组成部分,掌握其配置和管理对于系统管理员来说至关重要。无论是传统的iptables,还是现代的firewalld和nftables,都有其特定的应用场景和优势。

在实际应用中,应该根据具体需求选择合适的防火墙工具,并遵循最佳实践,构建多层防护的安全体系。同时,要定期审查和更新防火墙规则,确保系统安全策略的有效性。

记住,防火墙只是安全防护的一部分,还需要结合其他安全措施,如入侵检测系统、安全审计、访问控制等,才能构建完整的安全防护体系。


本文详细讲解了Linux防火墙的各个方面,从基础概念到实际应用,希望能帮助读者全面掌握Linux防火墙技术。