防火墙与 IDS 原理
防火墙与 IDS 原理
一次真实的 APT 攻击链路
2023 年某制造业企业被勒索软件攻击,溯源发现完整链路:
- 初始入侵:员工点击钓鱼邮件附件,下载了一个 Word 文档,文档里的宏执行 PowerShell 脚本
- 横向移动:脚本扫描内网,尝试用 SMB 协议访问其他机器(445 端口)
- 权限提升:拿到一个域账户后用 Mimikatz 抓取哈希
- 数据外泄:用 HTTPS(443 端口)把窃取的数据加密外发到 C2 服务器
- 横向扩散:在 200+ 台机器部署勒索软件,触发后开始加密文件
如果这家企业有完善的边界防御——防火墙封堵 SMB 内网出站、IDS 检测到异常 PowerShell 行为、出口流量审计——攻击链路至少断 3-4 环。
防火墙和 IDS/IPS 是企业网络边界的核心防御。这一章从包过滤的原理讲到 Snort 规则,从 iptables 命令到现代 EDR/XDR 的演进。
问题一:防火墙到底在防什么
防火墙(Firewall)本质是网络流量控制器——根据预定义规则决定允许或拒绝通过的数据流。它不是杀毒软件,不扫描包内容找病毒,而是基于网络层/传输层/应用层的信息做决策。
防火墙的核心防御对象:
- 未授权的入站连接:外网主动连内网(黑客端口扫描)
- 未授权的出站连接:内网主动连外网恶意站点(恶意软件 C2)
- 横向移动:内网机器之间的异常连接(攻击者横向扩散)
- 协议滥用:合法协议被用于非法目的(DNS 隧道、HTTP 隧道)
- 资源滥用:限制 P2P、视频流占用带宽
防火墙的四个分类:
| 类型 | 工作层次 | 决策依据 | 代表 |
|---|---|---|---|
| 包过滤 | L3/L4 | 源/目的 IP、端口、协议 | iptables, nftables |
| 状态检测 | L3/L4 + 状态 | 包过滤 + 连接状态 | iptables state 模块, pf |
| 应用层代理 | L7 | 应用层协议内容 | Squid, HAProxy |
| WAF | L7 (HTTP) | HTTP 请求/响应内容 | ModSecurity, Cloudflare WAF |
问题二:包过滤防火墙
包过滤(Packet Filtering) 是最基础、最快的防火墙形式。它只看每个 IP 包的头部信息,不维护连接状态。
包过滤的决策字段:
| 源 IP | 目的 IP | 协议 | 源端口 | 目的端口 | TCP 标志 | 动作 |经典规则集(iptables 形式):
# 允许内网到外网的 HTTP/HTTPS
iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 443 -j ACCEPT
# 允许外网到 DMZ 的 Web 服务器
iptables -A FORWARD -d 203.0.113.5 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -d 203.0.113.5 -p tcp --dport 443 -j ACCEPT
# 允许 DNS
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
# 默认拒绝所有
iptables -A FORWARD -j DROP包过滤的盲点:
- 不维护连接状态:ACK 扫描可以用任意包通过
- 不检查应用层:HTTP 隧道(80 端口包 SSH 流量)能穿透
- IP 欺骗:源 IP 可以伪造,规则按源 IP 容易被骗
SYN/ACK 攻击:
包过滤默认拒绝所有入站 SYN(防端口扫描),但允许 ACK 通过。攻击者发送带 SYN 标志的 ACK 包——理论上这个包不应该是第一次包(应该是已有连接的后续包),但包过滤不验证连接状态,让伪造 ACK 通过。这就是为什么需要状态检测。
问题三:状态检测防火墙
状态检测(Stateful Inspection) 1994 年由 CheckPoint 提出(Nir Zuk),是现代防火墙的事实标准。它在包过滤基础上维护连接状态表。
状态表:
| 协议 | 源 IP:port | 目的 IP:port | 状态 | 过期时间 |
| TCP | 192.168.1.100:50000 | 8.8.8.8:443 | ESTABLISHED | 300s |只有匹配"已建立连接"状态的包才允许通过。新连接必须先看到 SYN 包。
iptables 状态匹配:
# 允许已建立的连接和相关包通过
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许内网主动发起的新连接
iptables -A FORWARD -s 192.168.1.0/24 -m state --state NEW -j ACCEPT
# 其他拒绝
iptables -A FORWARD -j DROPESTABLISHED 是有双向流量的连接,RELATED 是与已有连接相关(如 FTP 数据连接),NEW 是新建连接。
Linux nftables 现代版:
# nft 配置示例
nft add table inet filter
nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
nft add rule inet filter forward ip saddr 192.168.1.0/24 ct state new tcp dport { 80, 443 } accept
nft add rule inet filter forward ct state established,related accept状态检测的优势:
- 防 SYN 扫描(看不到 ESTABLISHED 状态的包被拒)
- 防 IP 欺骗(伪造的源 IP 不会匹配状态表)
- 防 ACK 扫描(ACK 包不在状态表内被拒)
状态检测的代价:
- 状态表占用内存(每条连接约 200-300 字节)
- 高吞吐场景(百万级并发连接)状态表成为瓶颈
- DDOS 攻击可用海量伪连接耗尽状态表
问题四:应用层代理与 WAF
应用层代理(Application Proxy):在客户端和服务器之间充当中转,能看到应用层协议内容并做处理。
[Client] --HTTP--> [Proxy] --HTTP--> [Web Server]
↑
看到 HTTP 头和 body代理能做包过滤做不到的事:
- 检测 HTTP 请求 body 里的 SQL 注入
- 过滤邮件附件的恶意文件
- 缓存 Web 内容(节省带宽)
- 内容审计(员工访问了什么网站)
Squid 代理示例:
# 安装 Squid
sudo apt install squid
# 配置 /etc/squid/squid.conf
acl localnet src 192.168.1.0/24
http_access allow localnet
http_port 3128
# 客户端配代理
export http_proxy=http://192.168.1.1:3128WAF(Web Application Firewall):专攻 HTTP 协议的防火墙。OWASP Top 10 漏洞(SQL 注入、XSS、CSRF)它都能防。
ModSecurity 规则示例:
# 检测 SQL 注入
SecRule REQUEST_URI "@rx (?i)(?:union.*select|select.*from)" \
"id:1001,phase:1,t:none,log,deny,status:403,msg:'SQL Injection'"
# 检测 XSS
SecRule REQUEST_URI "@rx (?i)<script" \
"id:1002,phase:1,t:none,log,deny,status:403,msg:'XSS Attack'"Cloudflare WAF 是云端 WAF 的代表——所有流量经过 Cloudflare 边缘节点,恶意流量在边缘就被拦截。
问题五:IDS 与 IPS 的本质差异
IDS(Intrusion Detection System):入侵检测系统。只检测不拦截。
[网络] --流量--> [IDS 旁路] --告警--> [管理员]IDS 接在网络镜像端口(SPAN/TAP)上,看到所有流量但不在线路中。检测到攻击时只发告警,不阻断流量。
IPS(Intrusion Prevention System):入侵防御系统。检测到攻击直接拦截。
[网络] --流量--> [IPS 串联] --过滤后流量--> [目标]IPS 必须串接在网络线路上,对延迟敏感(每包都要处理),通常硬件加速。
Snort 是最知名的开源 IDS/IPS:
- 2002 年由 Sourcefire 发布
- 2014 年 Cisco 收购 Sourcefire
- 2020 年 Cisco 推出 Snort 3(多线程、性能 5x)
问题六:Snort 规则详解
Snort 规则基本结构:
<动作> <协议> <源IP> <源端口> -> <目的IP> <目的端口> (<选项>)例子:
alert tcp any any -> 192.168.1.0/24 80 (msg:"HTTP GET with /admin"; content:"/admin"; sid:1000001;)alert tcp任何 TCP 包any any -> 192.168.1.0/24 80任何源到内网 80 端口msg告警消息content匹配包内容sid规则 ID
Snort 规则实战:
# 安装 Snort
sudo apt install snort
# Snort 配置 /etc/snort/snort.conf
ipvar HOME_NET 192.168.1.0/24
ipvar EXTERNAL_NET any
# 写规则 /etc/snort/rules/local.rules
# 检测 SQL 注入
alert tcp $EXTERNAL_NET any -> $HOME_NET 80 (msg:"SQL Injection - UNION SELECT"; content:"UNION"; nocase; content:"SELECT"; nocase; distance:0; sid:1000001; rev:1;)
# 检测目录遍历
alert tcp $EXTERNAL_NET any -> $HOME_NET 80 (msg:"Directory Traversal - /etc/passwd"; content:"/etc/passwd"; sid:1000002; rev:1;)
# 检测 SSH 暴力破解
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:"SSH Brute Force - 10 attempts in 60s"; detection_filter:track by_src, count 10, seconds 60; sid:1000003; rev:1;)
# 运行
sudo snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i eth0关键 Snort 选项:
| 选项 | 作用 |
|---|---|
content:"string" | 包负载包含字符串 |
nocase | 大小写不敏感 |
offset:N | 从第 N 字节开始匹配 |
distance:N | 距上次 content 匹配 N 字节 |
pcre:"/regex/i" | Perl 兼容正则 |
flow:to_server,established | 只匹配流向服务器已建立连接 |
threshold:type both, track by_src, count 5, seconds 60 | 5 次/60 秒阈值 |
classtype:web-application-attack | 攻击分类 |
sid:1000001 | 规则唯一 ID |
rev:1 | 规则版本 |
Snort 输出:
[**] [1:1000001:1] SQL Injection - UNION SELECT [**]
[Classification: Web Application Attack] [Priority: 1]
06/29-12:00:00.123456 203.0.113.5:50000 -> 192.168.1.100:80
TCP TTL:64 TOS:0x0 ID:123 IpLen:20 DgmLen:200 DF
***AP*** Seq: 0x1234 Ack: 0x5678 Win: 0x7210 TcpLen: 32问题七:现代 EDR 与 NDR
传统防火墙 + IDS 的局限是只看网络流量,看不到端点行为。2015 年后,EDR(Endpoint Detection and Response)兴起:
- EDR:装在终端上,监控系统调用、进程行为、文件变化。能检测到 PowerShell 脚本、注册表修改、可疑进程注入
- NDR(Network Detection and Response):分析全网流量,用机器学习识别异常。比传统 IDS 准确率高
- XDR(Extended Detection and Response):把 EDR + NDR + SIEM(安全信息与事件管理)打通
代表产品:
- EDR:CrowdStrike Falcon、SentinelOne、Microsoft Defender for Endpoint
- NDR:Darktrace、Vectra AI、ExtraHop
- XDR:Palo Alto Cortex XDR、Microsoft 365 Defender
Snort 在云原生时代的局限:
- 容器/Pod 内部东西向流量,Snort 看不到
- 加密流量(TLS 1.3)下,Snort 看内容困难
- 微服务调用 RPC(gRPC/HTTP2),传统签名匹配失效
这就是为什么 eBPF + Cilium 等云原生安全工具兴起——在 Linux 内核层观察所有网络行为,不依赖镜像流量。
问题八:企业网络分区与零信任
传统 DMZ 架构:
[Internet] --防火墙1--> [DMZ] --防火墙2--> [内网]
↑ ↑ ↑
外部流量 Web/邮件服务器 办公/数据库DMZ(Demilitarized Zone)放置对外服务(Web、邮件、DNS),内网放核心资产。防火墙 1 限制入站,防火墙 2 限制 DMZ 到内网。
零信任架构(Zero Trust):
传统"内网可信"假设被抛弃——内网已经不再可信(APT 攻击、横向移动、离职员工)。零信任原则:
- Never trust, always verify:每次访问都验证身份
- Least privilege:最小权限,按需授权
- Assume breach:假设内网已被入侵,限制爆炸半径
实现技术:
- 微隔离(Microsegmentation):每个工作负载独立的防火墙规则
- 身份代理(BeyondCorp, Google 2011):基于用户身份和设备状态授权
- SDP(Software Defined Perimeter):先认证后连接,黑客看不到内网服务
问题九:企业防火墙选型
开源方案:
- iptables/nftables:Linux 内核级,灵活但配置复杂
- pfSense:基于 FreeBSD,Web 管理,企业级功能
- OPNsense:pfSense 分支,更现代的 UI
- VyOS:Linux 路由 + 防火墙 + VPN
商业方案:
- Palo Alto Networks:NGFW 行业标杆,价格高
- Fortinet FortiGate:性价比高
- Check Point:老牌厂商,企业市场份额大
- Cisco ASA/Firepower:和 Cisco 设备集成好
- 华为/深信服/新华三:国内企业市场主流
云原生:
- AWS Security Groups:云上虚拟防火墙
- Azure NSG:网络安全组
- GCP Firewall Rules:GCP 防火墙
- Cilium:Kubernetes 网络策略 + eBPF
实战命令
# iptables 基础
sudo iptables -L -n -v # 看规则
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH
sudo iptables -A INPUT -j DROP # 拒绝其他
sudo iptables-save > /etc/iptables.rules # 保存
# nftables 基础
sudo nft list ruleset
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
sudo nft add rule inet filter input tcp dport 22 accept
# 看连接状态
sudo conntrack -L # 当前所有连接
sudo conntrack -S # 统计
# 抓包验证防火墙规则
sudo tcpdump -ni eth0 -X # 看到被拒绝的包(但 ICMP Destination Unreachable 由内核回)
# Snort
sudo snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i eth0
# 看 Snort 告警统计
snort -r /var/log/snort/snort.log.* -A console | head -100思考题
- 包过滤防火墙允许 80 端口出站,攻击者把 SSH 流量封装在 HTTP 协议里(80 端口)。包过滤能拦截吗?应用层代理能拦截吗?怎么做?
- 状态检测防火墙维护连接状态表。如果一个 Web 服务器每秒处理 10 万个并发 HTTP/2 连接,状态表大约占多少内存?DDOS 攻击如何用状态表耗尽防火墙资源?
- Snort 规则
alert tcp any any -> $HOME_NET 80 (msg:"Test"; content:"<script>"; nocase; sid:1;)在 HTTP/2 加密下还工作吗?为什么? - 假设你是某电商的安全工程师,目标是保护 Web 应用层。设计一套 WAF 规则防 OWASP Top 10 攻击。规则优先级怎么排序?误报怎么减少?
- 零信任架构要求"每次访问都验证身份"。但每次都验证用户体验会变差(每次输入密码)。用什么技术平衡安全和体验?(提示:MFA、风险评估、设备指纹)
- 内网有一台 Linux 服务器被入侵,攻击者用 HTTPS(443 端口)和 C2 服务器通信。防火墙能检测吗?IDS 能检测吗?什么情况下能检测,什么情况下不能?
延伸阅读
- RFC 2979: Behavior of and Requirements for Internet Firewalls
- 《网络防御与安全对策》(Cheswick & Bellovin)
- Snort 官方文档:snort.org/docs
- OWASP Top 10:owasp.org/Top10
- 《Applied Network Security Monitoring》(Chris Sanders)
- 动手实验:用 iptables 搭建一个家用网关防火墙,限制内网出站,验证规则