一文讲透 Linux 防火墙:从入门到精通的完整指南
Contents
一文讲透 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 ACCEPTWeb服务器配置
#!/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 ACCEPTfirewalld 详解
基本概念
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 --reloadnftables 详解
基本概念
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 --reload3. 性能问题
# 检查规则数量
iptables -L -n | wc -l
# 检查系统负载
top
htop总结
Linux防火墙是系统安全的重要组成部分,掌握其配置和管理对于系统管理员来说至关重要。无论是传统的iptables,还是现代的firewalld和nftables,都有其特定的应用场景和优势。
在实际应用中,应该根据具体需求选择合适的防火墙工具,并遵循最佳实践,构建多层防护的安全体系。同时,要定期审查和更新防火墙规则,确保系统安全策略的有效性。
记住,防火墙只是安全防护的一部分,还需要结合其他安全措施,如入侵检测系统、安全审计、访问控制等,才能构建完整的安全防护体系。
本文详细讲解了Linux防火墙的各个方面,从基础概念到实际应用,希望能帮助读者全面掌握Linux防火墙技术。