网络安全从基础到实战 第3篇:防火墙的理解与配置
Network Security Series Part 3: Understanding and Configuring Firewalls
前言:防火墙,网络安全的第一道防线
防火墙(Firewall)是网络安全中最基本也是最核心的组成部分。正如建筑物的防火墙可以阻止火灾蔓延一样,网络防火墙的作用是保护内部网络免受外部威胁。自1988年Morris蠕虫事件后,防火墙技术开始迅速发展,如今已成为所有组织必不可少的安全基础设施。
在本篇第3部分中,我们将系统地学习防火墙的基本概念、各种类型、架构设计,以及Linux和Windows中的实际配置方法。
1. 什么是防火墙?
1.1 防火墙的定义和作用
防火墙是一种根据预定义的安全规则监控和控制网络流量的网络安全系统。它在可信的内部网络和不可信的外部网络(通常是互联网)之间充当屏障。
防火墙的主要功能如下:
- 流量过滤:只允许授权的流量通过,阻止其他流量
- 访问控制:允许/拒绝对特定IP、端口、协议的访问
- 日志记录和监控:记录所有网络活动
- NAT(网络地址转换):隐藏内部IP地址
- VPN终端:支持安全的远程访问
1.2 防火墙的工作原理
防火墙检查网络数据包的头部信息(源/目的IP、端口号、协议等),并与预定义的规则进行比较。如果规则匹配,则执行相应的操作(允许、拒绝、记录)。
数据包到达 → 规则匹配 → 找到匹配规则 → 执行相应操作
↓
没有匹配规则 → 应用默认策略(Default Policy)
2. 防火墙的类型
2.1 包过滤防火墙(Packet Filtering Firewall)
这是最基本的防火墙形式,在OSI第3~4层(网络层、传输层)运行。它独立检查每个数据包,仅基于数据包头部信息进行过滤。
优点:
- 处理速度快
- 资源占用低
- 实现简单
缺点:
- 不跟踪连接状态
- 对应用层攻击脆弱
- 对IP欺骗攻击脆弱
2.2 状态检测防火墙(Stateful Inspection Firewall)
这是跟踪连接状态的防火墙,是目前最广泛使用的方式。它维护会话表来识别连接的状态(新连接、现有连接、相关连接)。
状态表示例:
┌─────────────┬─────────────┬───────┬───────┬─────────┐
│ Source IP │ Dest IP │ SPort │ DPort │ State │
├─────────────┼─────────────┼───────┼───────┼─────────┤
│ 192.168.1.10│ 8.8.8.8 │ 45123 │ 53 │ ESTAB │
│ 192.168.1.20│ 142.250.1.1 │ 52341 │ 443 │ ESTAB │
│ 192.168.1.15│ 104.16.1.1 │ 38921 │ 80 │ TIME_WT │
└─────────────┴─────────────┴───────┴───────┴─────────┘
优点:
- 基于连接状态的精确过滤
- 自动允许响应数据包,简化规则
- 可检测DoS攻击
2.3 应用层网关(Application Level Gateway / Proxy Firewall)
在OSI第7层(应用层)运行,完全理解和检查特定应用协议。在客户端和服务器之间充当代理。
优点:
- 可进行深度包检测(DPI)
- 阻止应用层攻击
- 用户认证功能
- 内容过滤
缺点:
- 处理速度较慢
- 资源占用高
- 支持的协议有限
2.4 下一代防火墙(NGFW: Next-Generation Firewall)
NGFW是将传统防火墙功能与各种安全功能集成的现代防火墙。代表性产品包括Palo Alto Networks、Fortinet FortiGate、Cisco Firepower等。
NGFW的主要功能:
- 应用识别:基于应用而非端口的策略
- 用户识别:基于用户/组而非IP的策略
- IPS(入侵防御系统):实时威胁检测和阻止
- SSL/TLS检测:解密并检查加密流量
- 沙箱:隔离分析可疑文件
- 威胁情报:实时威胁信息集成
| 功能 | 包过滤 | 状态检测 | 应用层 | NGFW |
|---|---|---|---|---|
| 工作层 | L3-L4 | L3-L4 | L7 | L3-L7 |
| 状态跟踪 | X | O | O | O |
| DPI | X | X | O | O |
| IPS集成 | X | X | X | O |
| 处理速度 | 快 | 快 | 慢 | 中等 |
3. 防火墙架构
3.1 屏蔽主机架构(Screened Host Architecture)
这是屏蔽路由器和堡垒主机(Bastion Host)的组合结构。从外部到内部网络的访问必须通过堡垒主机。
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ 互联网 │────│ 屏蔽路由器 │────│ 堡垒主机 │────│ 内部网络 │
│ │ │ │ │ (Bastion Host) │ │ │
└─────────────┘ └──────────────┘ └─────────────────┘ └─────────────┘
3.2 屏蔽子网架构(DMZ)
DMZ(非军事区)是位于外部和内部网络之间的隔离网络区域。在此放置需要向外部提供服务的服务器,如Web服务器、邮件服务器等。
┌─────────────────────────────────┐
│ DMZ区域 │
│ ┌─────────┐ ┌─────────┐ │
┌─────────┐ │ │ Web服务器│ │邮件服务器│ │ ┌───────────────┐
│ 互联网 │─────────│ └─────────┘ └─────────┘ │─────────│ 内部网络 │
└─────────┘ │ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ DNS │ │ FTP │ │ │ ┌──────────┐ │
│ │ └─────────┘ └─────────┘ │ │ │ 业务服务器│ │
│ └─────────────────────────────────┘ │ │ 数据库服务器│ │
│ │ │ └──────────┘ │
│ ┌────────┴────────┐ └───────────────┘
└──────────────│ 外部防火墙 │
└─────────────────┘
│
┌────────┴────────┐
│ 内部防火墙 │
└─────────────────┘
DMZ设计原则:
- DMZ服务器不能直接连接到内部网络
- 只允许从内部到DMZ的连接(必要时)
- 最小化DMZ服务器之间的通信
- 每个服务器只开放必要的端口
4. Linux iptables/nftables基础
4.1 iptables概述
iptables是使用Linux内核netfilter框架的防火墙工具。它由表(Table)、链(Chain)、规则(Rule)的层级结构组成。
主要表:
- filter:包过滤(默认表)
- nat:网络地址转换
- mangle:修改包头
- raw:设置连接跟踪例外
filter表的基本链:
- INPUT:进入本地系统的数据包
- OUTPUT:从本地系统发出的数据包
- FORWARD:通过系统的数据包(路由)
4.2 iptables基本命令
# 查看当前规则
sudo iptables -L -n -v
# 查看特定表的规则
sudo iptables -t nat -L -n -v
# 添加规则 (Append)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 插入规则 (Insert) - 指定位置
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# 删除规则
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 删除链中所有规则
sudo iptables -F INPUT
# 设置默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
4.3 实用iptables规则示例
#!/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 OUTPUT -o lo -j ACCEPT
# 允许已建立和相关连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许SSH (仅限特定IP)
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
# 允许HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# 允许ICMP (ping) (有限制)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# 日志记录 (被拒绝的数据包)
iptables -A INPUT -j LOG --log-prefix "iptables-dropped: " --log-level 4
# 拒绝其余所有 (默认策略已是DROP,但明确指定)
iptables -A INPUT -j DROP
# 保存规则
iptables-save > /etc/iptables/rules.v4
4.4 nftables - iptables的继任者
nftables是替代iptables的最新防火墙框架。它提供更简洁的语法和改进的性能。
# nftables基本配置示例
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# 允许环回
iif lo accept
# 允许已建立的连接
ct state established,related accept
# 允许SSH
tcp dport 22 accept
# 允许HTTP/HTTPS
tcp dport { 80, 443 } accept
# 允许ICMP
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# 记录日志后丢弃
log prefix "nftables-dropped: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
5. UFW(Uncomplicated Firewall)配置
UFW是Ubuntu/Debian系统上的前端工具,可以轻松管理iptables。
5.1 UFW基本命令
# 查看UFW状态
sudo ufw status verbose
# 启用/禁用UFW
sudo ufw enable
sudo ufw disable
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许端口
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 允许特定IP访问
sudo ufw allow from 192.168.1.0/24 to any port 22
# 拒绝特定端口
sudo ufw deny 3306/tcp
# 删除规则
sudo ufw delete allow 80/tcp
# 按规则编号删除
sudo ufw status numbered
sudo ufw delete 3
# 使用应用配置文件
sudo ufw app list
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
5.2 UFW高级配置
# 速率限制 (防暴力破解)
sudo ufw limit ssh/tcp
# 只允许特定接口
sudo ufw allow in on eth0 to any port 80
# 日志设置
sudo ufw logging on
sudo ufw logging medium # off, low, medium, high, full
# IPv6设置 (/etc/default/ufw)
# IPV6=yes
6. Windows防火墙
6.1 Windows Defender防火墙GUI设置
Windows默认提供Windows Defender防火墙。可以在控制面板或Windows安全中心进行设置。
主要设置路径:
- 控制面板 > 系统和安全 > Windows Defender防火墙
- Windows安全中心 > 防火墙和网络保护
- 高级安全Windows Defender防火墙 (wf.msc)
6.2 使用PowerShell管理防火墙
# 查看防火墙状态
Get-NetFirewallProfile
# 启用/禁用特定配置文件防火墙
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
# 查询入站规则
Get-NetFirewallRule -Direction Inbound | Where-Object {$_.Enabled -eq 'True'}
# 添加新入站规则 (允许HTTP)
New-NetFirewallRule -DisplayName "Allow HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
# 添加新入站规则 (只允许特定IP SSH)
New-NetFirewallRule -DisplayName "Allow SSH from Internal" -Direction Inbound -Protocol TCP -LocalPort 22 -RemoteAddress 192.168.1.0/24 -Action Allow
# 删除规则
Remove-NetFirewallRule -DisplayName "Allow HTTP"
# 禁用规则
Disable-NetFirewallRule -DisplayName "Allow HTTP"
# 添加出站规则 (阻止特定端口)
New-NetFirewallRule -DisplayName "Block Telnet Outbound" -Direction Outbound -Protocol TCP -RemotePort 23 -Action Block
# 导出所有规则
netsh advfirewall export "C:\firewall-backup.wfw"
# 导入规则
netsh advfirewall import "C:\firewall-backup.wfw"
6.3 使用netsh管理防火墙
REM 查看防火墙状态
netsh advfirewall show allprofiles
REM 启用防火墙
netsh advfirewall set allprofiles state on
REM 开放端口
netsh advfirewall firewall add rule name="Open HTTP" dir=in action=allow protocol=tcp localport=80
REM 删除规则
netsh advfirewall firewall delete rule name="Open HTTP"
REM 查询所有入站规则
netsh advfirewall firewall show rule name=all dir=in
7. 防火墙策略设计原则
7.1 最小权限原则(Principle of Least Privilege)
采用白名单(Whitelist)方式,只允许必要的流量,拒绝其他所有流量。
好的做法:
- 默认策略:拒绝所有入站流量 (DROP)
- 例外:只明确允许必要的服务
不好的做法:
- 默认策略:允许所有流量 (ACCEPT)
- 例外:只阻止危险端口(黑名单)
7.2 纵深防御(Defense in Depth)
不依赖单一防火墙,构建多层安全体系。
- 网络边界防火墙:外部/内部网络边界
- 网段防火墙:内部网络网段之间
- 主机防火墙:单个服务器/工作站
7.3 规则顺序优化
防火墙规则从上到下顺序处理。高效的规则顺序:
- 将最常匹配的规则放在最上面
- 明确的拒绝规则放在允许规则之前
- 更具体的规则放在一般规则之前
- 最后是默认拒绝规则
7.4 文档化和变更管理
所有防火墙规则必须文档化,变更时必须经过审批流程。
防火墙规则文档化模板:
┌────────┬────────────┬──────────┬────────┬────────────┬────────────┬──────────┐
│ 规则ID │ 源地址 │ 目的地 │ 端口 │ 协议 │ 动作 │ 备注 │
├────────┼────────────┼──────────┼────────┼────────────┼────────────┼──────────┤
│ FW-001 │ Any │ DMZ-WEB │ 443 │ TCP │ Allow │ HTTPS │
│ FW-002 │ Internal │ DMZ-DB │ 3306 │ TCP │ Allow │ MySQL │
│ FW-003 │ Admin-Net │ Any │ 22 │ TCP │ Allow │ SSH │
│ FW-999 │ Any │ Any │ Any │ Any │ Deny + Log │ 默认拒绝 │
└────────┴────────────┴──────────┴────────┴────────────┴────────────┴──────────┘
8. 防火墙日志分析
8.1 日志的重要性
防火墙日志对于安全事件检测、取证分析、合规性等至关重要。为了有效的日志管理:
- 记录所有被阻止的流量
- 记录重要的允许流量
- 确保足够的存储期限(至少90天,建议1年)
- 集中式日志管理(与SIEM集成)
8.2 Linux防火墙日志分析
# 查看iptables日志
tail -f /var/log/kern.log | grep "iptables"
tail -f /var/log/syslog | grep "iptables-dropped"
# 被阻止IP地址 Top 10
grep "iptables-dropped" /var/log/syslog | \
awk '{for(i=1;i<=NF;i++) if($i ~ /SRC=/) print $i}' | \
cut -d= -f2 | sort | uniq -c | sort -rn | head -10
# 被阻止目的端口 Top 10
grep "iptables-dropped" /var/log/syslog | \
awk '{for(i=1;i<=NF;i++) if($i ~ /DPT=/) print $i}' | \
cut -d= -f2 | sort | uniq -c | sort -rn | head -10
# 按时间段统计阻止次数
grep "iptables-dropped" /var/log/syslog | \
awk '{print $1, $2, $3}' | \
cut -d: -f1,2 | uniq -c
8.3 Windows防火墙日志分析
# 启用防火墙日志
Set-NetFirewallProfile -Profile Domain,Public,Private -LogBlocked True -LogAllowed True -LogFileName "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
# 日志文件位置
# C:\Windows\System32\LogFiles\Firewall\pfirewall.log
# 使用PowerShell分析日志
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" |
Where-Object { $_ -match "DROP" } |
Select-Object -Last 100
# 被阻止连接的源IP统计
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" |
Where-Object { $_ -match "DROP" } |
ForEach-Object { ($_ -split '\s+')[4] } |
Group-Object | Sort-Object Count -Descending | Select-Object -First 10
8.4 日志分析时需要注意的模式
发现以下模式时需要注意:
- 端口扫描:同一源地址尝试连接多个端口
- 暴力破解攻击:对SSH(22)、RDP(3389)端口的重复连接尝试
- 异常出站连接:从内部到外部的异常流量
- 非标准端口使用:普通服务使用非标准端口连接
- 夜间/周末流量激增:工作时间外的异常活动
9. 总结及下篇预告
本篇我们学习了防火墙的基本概念、各种类型、架构设计,以及Linux和Windows中的实际配置方法。防火墙作为网络安全的第一道防线,正确的设计和持续的管理是必不可少的。
核心要点:
- 防火墙应使用白名单方式配置(默认拒绝,只允许必要的)
- 利用状态检测防火墙以上的功能实现精细过滤
- 通过DMZ实现网络分段
- 所有规则的文档化和变更管理
- 通过日志分析进行持续监控
下一篇第4部分将介绍IDS/IPS(入侵检测/防御系统)。我们将学习Snort、Suricata的安装和配置、检测规则编写,以及与SIEM的集成。