10.1 安全策略设计原则

10.1.1 最小权限原则

最小权限原则是网络安全的基础,要求只开放必要的服务和端口,拒绝所有不必要的访问。

1. 默认拒绝策略

#!/bin/bash
# default_deny_policy.sh

# 设置默认拒绝策略
setup_default_deny() {
    echo "Setting up default deny policy..."
    
    # 清空现有规则
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X
    iptables -t mangle -F
    iptables -t mangle -X
    
    # 设置默认策略为 DROP
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    
    # 允许本地回环
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    
    # 允许已建立的连接
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    echo "Default deny policy configured successfully"
}

# 基础服务白名单
setup_basic_whitelist() {
    echo "Setting up basic service whitelist..."
    
    # SSH 访问(限制源地址)
    iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT
    
    # DNS 查询
    iptables -A OUTPUT -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
    iptables -A OUTPUT -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
    
    # NTP 时间同步
    iptables -A OUTPUT -p udp --dport 123 -m conntrack --ctstate NEW -j ACCEPT
    
    # HTTP/HTTPS 出站(用于软件更新)
    iptables -A OUTPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
    iptables -A OUTPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
    
    echo "Basic whitelist configured"
}

setup_default_deny
setup_basic_whitelist

2. 分层防护策略

#!/bin/bash
# layered_defense.sh

# 网络层防护
network_layer_protection() {
    echo "Configuring network layer protection..."
    
    # 防止 IP 欺骗
    iptables -A INPUT -s 127.0.0.0/8 ! -i lo -j DROP
    iptables -A INPUT -s 169.254.0.0/16 -j DROP
    iptables -A INPUT -s 224.0.0.0/4 -j DROP
    iptables -A INPUT -s 240.0.0.0/5 -j DROP
    
    # 防止私有地址从公网接口进入
    public_interface="eth0"  # 根据实际情况修改
    iptables -A INPUT -i $public_interface -s 10.0.0.0/8 -j DROP
    iptables -A INPUT -i $public_interface -s 172.16.0.0/12 -j DROP
    iptables -A INPUT -i $public_interface -s 192.168.0.0/16 -j DROP
    
    # 防止广播和多播攻击
    iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP
    iptables -A INPUT -m pkttype --pkt-type multicast -j DROP
    
    echo "Network layer protection configured"
}

# 传输层防护
transport_layer_protection() {
    echo "Configuring transport layer protection..."
    
    # TCP SYN Flood 防护
    iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
    iptables -A INPUT -p tcp --syn -j DROP
    
    # 防止端口扫描
    iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
    iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
    iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
    iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
    iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
    iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    
    # ICMP 限制
    iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    
    echo "Transport layer protection configured"
}

# 应用层防护
application_layer_protection() {
    echo "Configuring application layer protection..."
    
    # HTTP/HTTPS 连接限制
    iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT
    iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 20 -j REJECT
    
    # SSH 暴力破解防护
    iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --set
    iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --rcheck --seconds 60 --hitcount 4 -j DROP
    
    # 防止常见攻击字符串
    iptables -A INPUT -p tcp --dport 80 -m string --string "../" --algo bm -j DROP
    iptables -A INPUT -p tcp --dport 80 -m string --string "<script" --algo bm -j DROP
    iptables -A INPUT -p tcp --dport 80 -m string --string "SELECT * FROM" --algo bm -j DROP
    
    echo "Application layer protection configured"
}

network_layer_protection
transport_layer_protection
application_layer_protection

10.1.2 深度防御策略

1. 多层防护配置

#!/bin/bash
# defense_in_depth.sh

# 边界防护
boundary_protection() {
    echo "Configuring boundary protection..."
    
    # 外网接口防护
    external_interface="eth0"
    
    # 拒绝直接访问内部服务
    iptables -A FORWARD -i $external_interface -d 192.168.0.0/16 -p tcp --dport 3306 -j DROP  # MySQL
    iptables -A FORWARD -i $external_interface -d 192.168.0.0/16 -p tcp --dport 5432 -j DROP  # PostgreSQL
    iptables -A FORWARD -i $external_interface -d 192.168.0.0/16 -p tcp --dport 6379 -j DROP  # Redis
    iptables -A FORWARD -i $external_interface -d 192.168.0.0/16 -p tcp --dport 27017 -j DROP # MongoDB
    
    # 限制出站连接
    iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 25 -j DROP   # SMTP
    iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 587 -j DROP  # SMTP TLS
    iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 465 -j DROP  # SMTP SSL
    
    echo "Boundary protection configured"
}

# 内网分段防护
internal_segmentation() {
    echo "Configuring internal network segmentation..."
    
    # DMZ 区域规则
    dmz_network="192.168.10.0/24"
    internal_network="192.168.20.0/24"
    
    # DMZ 只能访问特定的内网服务
    iptables -A FORWARD -s $dmz_network -d $internal_network -p tcp --dport 3306 -j ACCEPT  # 数据库访问
    iptables -A FORWARD -s $dmz_network -d $internal_network -p tcp --dport 6379 -j ACCEPT  # Redis 访问
    iptables -A FORWARD -s $dmz_network -d $internal_network -j DROP  # 其他访问拒绝
    
    # 内网不能直接访问 DMZ 的管理端口
    iptables -A FORWARD -s $internal_network -d $dmz_network -p tcp --dport 22 -j DROP
    iptables -A FORWARD -s $internal_network -d $dmz_network -p tcp --dport 3389 -j DROP
    
    echo "Internal segmentation configured"
}

# 服务隔离
service_isolation() {
    echo "Configuring service isolation..."
    
    # Web 服务器只能访问数据库服务器
    web_servers="192.168.10.10,192.168.10.11"
    db_server="192.168.20.10"
    
    iptables -A FORWARD -s $web_servers -d $db_server -p tcp --dport 3306 -j ACCEPT
    iptables -A FORWARD -s $web_servers -d 192.168.20.0/24 -j DROP
    
    # 数据库服务器不能主动连接外部
    iptables -A FORWARD -s $db_server -d 0.0.0.0/0 -m conntrack --ctstate NEW -j DROP
    
    echo "Service isolation configured"
}

boundary_protection
internal_segmentation
service_isolation

10.2 常见攻击防护

10.2.1 DDoS 攻击防护

1. SYN Flood 防护

#!/bin/bash
# syn_flood_protection.sh

# SYN Flood 防护配置
setup_syn_flood_protection() {
    echo "Configuring SYN Flood protection..."
    
    # 启用 SYN Cookies
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    
    # 调整 SYN 队列大小
    echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
    echo 3 > /proc/sys/net/ipv4/tcp_synack_retries
    echo 5 > /proc/sys/net/ipv4/tcp_syn_retries
    
    # iptables SYN 限制
    iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
    iptables -A INPUT -p tcp --syn -j LOG --log-prefix "SYN_FLOOD: "
    iptables -A INPUT -p tcp --syn -j DROP
    
    # 针对特定端口的 SYN 防护
    iptables -A INPUT -p tcp --dport 80 --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
    
    echo "SYN Flood protection configured"
}

# 连接限制
connection_limiting() {
    echo "Configuring connection limiting..."
    
    # 每个 IP 的并发连接限制
    iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT
    iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT
    
    # 每个子网的连接限制
    iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 24 -j REJECT
    
    # 新连接速率限制
    iptables -A INPUT -p tcp --dport 80 -m recent --name http_conn --set
    iptables -A INPUT -p tcp --dport 80 -m recent --name http_conn --rcheck --seconds 60 --hitcount 30 -j DROP
    
    echo "Connection limiting configured"
}

# UDP Flood 防护
udp_flood_protection() {
    echo "Configuring UDP Flood protection..."
    
    # UDP 包速率限制
    iptables -A INPUT -p udp -m limit --limit 5/s --limit-burst 10 -j ACCEPT
    iptables -A INPUT -p udp -j LOG --log-prefix "UDP_FLOOD: "
    iptables -A INPUT -p udp -j DROP
    
    # DNS 查询限制
    iptables -A INPUT -p udp --dport 53 -m recent --name dns_query --set
    iptables -A INPUT -p udp --dport 53 -m recent --name dns_query --rcheck --seconds 60 --hitcount 20 -j DROP
    
    echo "UDP Flood protection configured"
}

setup_syn_flood_protection
connection_limiting
udp_flood_protection

2. 高级 DDoS 防护

#!/bin/bash
# advanced_ddos_protection.sh

# 地理位置过滤
geo_filtering() {
    echo "Configuring geographical filtering..."
    
    # 需要安装 xtables-addons 和 GeoIP 数据库
    # 阻止特定国家的访问(示例)
    # iptables -A INPUT -m geoip --src-cc CN,RU,KP -j DROP
    
    # 只允许特定国家访问管理端口
    # iptables -A INPUT -p tcp --dport 22 -m geoip ! --src-cc US,CA,GB -j DROP
    
    echo "Note: GeoIP filtering requires xtables-addons"
}

# 动态黑名单
dynamic_blacklist() {
    echo "Configuring dynamic blacklist..."
    
    # 创建黑名单链
    iptables -N BLACKLIST
    iptables -A INPUT -j BLACKLIST
    
    # 自动加入黑名单的条件
    # 1. 端口扫描检测
    iptables -A INPUT -p tcp --tcp-flags ALL NONE -m recent --name portscan --set -j DROP
    iptables -A INPUT -p tcp --tcp-flags ALL ALL -m recent --name portscan --set -j DROP
    
    # 2. 暴力破解检测
    iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --update --seconds 60 --hitcount 4 -j DROP
    iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --set
    
    # 3. HTTP 攻击检测
    iptables -A INPUT -p tcp --dport 80 -m string --string "../" --algo bm -m recent --name http_attack --set -j DROP
    iptables -A INPUT -p tcp --dport 80 -m string --string "<script" --algo bm -m recent --name http_attack --set -j DROP
    
    echo "Dynamic blacklist configured"
}

# 流量整形
traffic_shaping() {
    echo "Configuring traffic shaping..."
    
    # 使用 tc 进行流量控制
    interface="eth0"
    
    # 删除现有的 qdisc
    tc qdisc del dev $interface root 2>/dev/null
    
    # 创建根 qdisc
    tc qdisc add dev $interface root handle 1: htb default 30
    
    # 创建主类
    tc class add dev $interface parent 1: classid 1:1 htb rate 100mbit
    
    # 创建子类
    tc class add dev $interface parent 1:1 classid 1:10 htb rate 50mbit ceil 80mbit  # 高优先级
    tc class add dev $interface parent 1:1 classid 1:20 htb rate 30mbit ceil 50mbit  # 中优先级
    tc class add dev $interface parent 1:1 classid 1:30 htb rate 20mbit ceil 30mbit  # 低优先级
    
    # 添加过滤器
    tc filter add dev $interface protocol ip parent 1:0 prio 1 u32 match ip dport 22 0xffff flowid 1:10
    tc filter add dev $interface protocol ip parent 1:0 prio 2 u32 match ip dport 80 0xffff flowid 1:20
    tc filter add dev $interface protocol ip parent 1:0 prio 3 u32 match ip dport 443 0xffff flowid 1:20
    
    # 配合 iptables 标记
    iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 1
    iptables -t mangle -A OUTPUT -p tcp --sport 80 -j MARK --set-mark 2
    iptables -t mangle -A OUTPUT -p tcp --sport 443 -j MARK --set-mark 2
    
    tc filter add dev $interface protocol ip parent 1:0 prio 4 handle 1 fw flowid 1:10
    tc filter add dev $interface protocol ip parent 1:0 prio 5 handle 2 fw flowid 1:20
    
    echo "Traffic shaping configured"
}

geo_filtering
dynamic_blacklist
traffic_shaping

10.2.2 端口扫描防护

1. 端口扫描检测

#!/bin/bash
# port_scan_protection.sh

# 端口扫描检测和防护
port_scan_detection() {
    echo "Configuring port scan detection..."
    
    # 检测 TCP 标志位异常
    iptables -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 3/min --limit-burst 5 -j LOG --log-prefix "NULL_SCAN: "
    iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
    
    iptables -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 3/min --limit-burst 5 -j LOG --log-prefix "XMAS_SCAN: "
    iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
    
    iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
    iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
    iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
    iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    
    # FIN 扫描检测
    iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -m limit --limit 3/min --limit-burst 5 -j LOG --log-prefix "FIN_SCAN: "
    iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
    
    echo "Port scan detection configured"
}

# 连接频率检测
connection_frequency_detection() {
    echo "Configuring connection frequency detection..."
    
    # 检测快速连接尝试
    iptables -A INPUT -p tcp -m recent --name portscan --rcheck --seconds 86400 --hitcount 20 -j DROP
    iptables -A INPUT -p tcp -m recent --name portscan --set
    
    # 检测多端口连接
    iptables -A INPUT -p tcp --dport 1:1023 -m recent --name lowports --update --seconds 60 --hitcount 10 -j DROP
    iptables -A INPUT -p tcp --dport 1:1023 -m recent --name lowports --set
    
    # 检测高端口扫描
    iptables -A INPUT -p tcp --dport 1024:65535 -m recent --name highports --update --seconds 60 --hitcount 20 -j DROP
    iptables -A INPUT -p tcp --dport 1024:65535 -m recent --name highports --set
    
    echo "Connection frequency detection configured"
}

# 隐蔽端口保护
stealth_port_protection() {
    echo "Configuring stealth port protection..."
    
    # 对未开放端口不响应(隐蔽模式)
    # 注意:这会让端口扫描器认为端口是过滤的而不是关闭的
    
    # 常见服务端口的隐蔽保护
    iptables -A INPUT -p tcp --dport 21 -j DROP    # FTP
    iptables -A INPUT -p tcp --dport 23 -j DROP    # Telnet
    iptables -A INPUT -p tcp --dport 25 -j DROP    # SMTP
    iptables -A INPUT -p tcp --dport 110 -j DROP   # POP3
    iptables -A INPUT -p tcp --dport 143 -j DROP   # IMAP
    iptables -A INPUT -p tcp --dport 993 -j DROP   # IMAPS
    iptables -A INPUT -p tcp --dport 995 -j DROP   # POP3S
    
    # 数据库端口保护
    iptables -A INPUT -p tcp --dport 1433 -j DROP  # SQL Server
    iptables -A INPUT -p tcp --dport 1521 -j DROP  # Oracle
    iptables -A INPUT -p tcp --dport 3306 -j DROP  # MySQL
    iptables -A INPUT -p tcp --dport 5432 -j DROP  # PostgreSQL
    
    # 远程管理端口保护
    iptables -A INPUT -p tcp --dport 3389 -j DROP  # RDP
    iptables -A INPUT -p tcp --dport 5900 -j DROP  # VNC
    
    echo "Stealth port protection configured"
}

port_scan_detection
connection_frequency_detection
stealth_port_protection

10.2.3 暴力破解防护

1. SSH 暴力破解防护

#!/bin/bash
# ssh_brute_force_protection.sh

# SSH 暴力破解防护
ssh_protection() {
    echo "Configuring SSH brute force protection..."
    
    # 基本的失败尝试限制
    iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --set
    iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --rcheck --seconds 60 --hitcount 4 -j DROP
    
    # 更严格的保护(24小时封禁)
    iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_blacklist --rcheck --seconds 86400 -j DROP
    iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --rcheck --seconds 60 --hitcount 4 -m recent --name ssh_blacklist --set -j DROP
    
    # 只允许特定网段访问 SSH
    iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -j DROP
    
    echo "SSH brute force protection configured"
}

# Web 服务暴力破解防护
web_protection() {
    echo "Configuring web brute force protection..."
    
    # 登录页面保护
    iptables -A INPUT -p tcp --dport 80 -m string --string "POST /login" --algo bm -m recent --name web_login --set
    iptables -A INPUT -p tcp --dport 80 -m string --string "POST /admin" --algo bm -m recent --name web_login --set
    iptables -A INPUT -p tcp --dport 80 -m recent --name web_login --rcheck --seconds 300 --hitcount 5 -j DROP
    
    # 管理界面保护
    iptables -A INPUT -p tcp --dport 80 -m string --string "/admin/" --algo bm -m recent --name admin_access --set
    iptables -A INPUT -p tcp --dport 80 -m recent --name admin_access --rcheck --seconds 60 --hitcount 10 -j DROP
    
    # WordPress 特定保护
    iptables -A INPUT -p tcp --dport 80 -m string --string "wp-login.php" --algo bm -m recent --name wp_login --set
    iptables -A INPUT -p tcp --dport 80 -m recent --name wp_login --rcheck --seconds 300 --hitcount 3 -j DROP
    
    echo "Web brute force protection configured"
}

# FTP 暴力破解防护
ftp_protection() {
    echo "Configuring FTP brute force protection..."
    
    # FTP 连接限制
    iptables -A INPUT -p tcp --dport 21 -m recent --name ftp_conn --set
    iptables -A INPUT -p tcp --dport 21 -m recent --name ftp_conn --rcheck --seconds 60 --hitcount 3 -j DROP
    
    # FTP 数据连接保护
    iptables -A INPUT -p tcp --dport 20 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p tcp --dport 1024:65535 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    
    echo "FTP brute force protection configured"
}

# 邮件服务保护
mail_protection() {
    echo "Configuring mail service protection..."
    
    # SMTP 认证失败保护
    iptables -A INPUT -p tcp --dport 25 -m recent --name smtp_auth --set
    iptables -A INPUT -p tcp --dport 25 -m recent --name smtp_auth --rcheck --seconds 300 --hitcount 5 -j DROP
    
    # POP3/IMAP 保护
    iptables -A INPUT -p tcp --dport 110 -m recent --name pop3_auth --set
    iptables -A INPUT -p tcp --dport 110 -m recent --name pop3_auth --rcheck --seconds 300 --hitcount 5 -j DROP
    
    iptables -A INPUT -p tcp --dport 143 -m recent --name imap_auth --set
    iptables -A INPUT -p tcp --dport 143 -m recent --name imap_auth --rcheck --seconds 300 --hitcount 5 -j DROP
    
    echo "Mail service protection configured"
}

ssh_protection
web_protection
ftp_protection
mail_protection

10.3 入侵检测与响应

10.3.1 实时入侵检测

1. 异常流量检测

#!/bin/bash
# intrusion_detection.sh

# 异常流量检测
anomalous_traffic_detection() {
    echo "Configuring anomalous traffic detection..."
    
    # 大包攻击检测
    iptables -A INPUT -p tcp -m length --length 1000:65535 -m limit --limit 5/min -j LOG --log-prefix "LARGE_PACKET: "
    iptables -A INPUT -p tcp -m length --length 1000:65535 -m recent --name large_packet --set
    iptables -A INPUT -p tcp -m recent --name large_packet --rcheck --seconds 60 --hitcount 10 -j DROP
    
    # 异常协议检测
    iptables -A INPUT -p 47 -j LOG --log-prefix "GRE_TRAFFIC: "  # GRE 协议
    iptables -A INPUT -p 50 -j LOG --log-prefix "ESP_TRAFFIC: "  # ESP 协议
    iptables -A INPUT -p 51 -j LOG --log-prefix "AH_TRAFFIC: "   # AH 协议
    
    # 异常端口访问检测
    iptables -A INPUT -p tcp --dport 1:1023 -m recent --name privileged_ports --set
    iptables -A INPUT -p tcp -m recent --name privileged_ports --rcheck --seconds 60 --hitcount 20 -j LOG --log-prefix "PORT_SCAN: "
    
    echo "Anomalous traffic detection configured"
}

# 恶意行为检测
malicious_behavior_detection() {
    echo "Configuring malicious behavior detection..."
    
    # SQL 注入检测
    iptables -A INPUT -p tcp --dport 80 -m string --string "UNION SELECT" --algo bm -j LOG --log-prefix "SQL_INJECTION: "
    iptables -A INPUT -p tcp --dport 80 -m string --string "DROP TABLE" --algo bm -j LOG --log-prefix "SQL_INJECTION: "
    iptables -A INPUT -p tcp --dport 80 -m string --string "INSERT INTO" --algo bm -j LOG --log-prefix "SQL_INJECTION: "
    
    # XSS 攻击检测
    iptables -A INPUT -p tcp --dport 80 -m string --string "<script>" --algo bm -j LOG --log-prefix "XSS_ATTACK: "
    iptables -A INPUT -p tcp --dport 80 -m string --string "javascript:" --algo bm -j LOG --log-prefix "XSS_ATTACK: "
    
    # 目录遍历攻击检测
    iptables -A INPUT -p tcp --dport 80 -m string --string "../" --algo bm -j LOG --log-prefix "DIR_TRAVERSAL: "
    iptables -A INPUT -p tcp --dport 80 -m string --string "..\\" --algo bm -j LOG --log-prefix "DIR_TRAVERSAL: "
    
    # 命令注入检测
    iptables -A INPUT -p tcp --dport 80 -m string --string ";cat /etc/passwd" --algo bm -j LOG --log-prefix "CMD_INJECTION: "
    iptables -A INPUT -p tcp --dport 80 -m string --string "|nc " --algo bm -j LOG --log-prefix "CMD_INJECTION: "
    
    echo "Malicious behavior detection configured"
}

# 网络侦察检测
reconnaissance_detection() {
    echo "Configuring reconnaissance detection..."
    
    # OS 指纹识别检测
    iptables -A INPUT -p tcp --tcp-flags ALL SYN -m recent --name os_fingerprint --set
    iptables -A INPUT -p tcp -m recent --name os_fingerprint --rcheck --seconds 10 --hitcount 5 -j LOG --log-prefix "OS_FINGERPRINT: "
    
    # 服务枚举检测
    iptables -A INPUT -p tcp --dport 1:1023 -m recent --name service_enum --set
    iptables -A INPUT -p tcp -m recent --name service_enum --rcheck --seconds 30 --hitcount 10 -j LOG --log-prefix "SERVICE_ENUM: "
    
    # Banner 抓取检测
    iptables -A INPUT -p tcp --tcp-flags PSH,ACK PSH,ACK -m length --length 0:100 -j LOG --log-prefix "BANNER_GRAB: "
    
    echo "Reconnaissance detection configured"
}

anomalous_traffic_detection
malicious_behavior_detection
reconnaissance_detection

2. 自动响应系统

#!/bin/bash
# automated_response.sh

# 自动封禁系统
auto_ban_system() {
    echo "Configuring automated ban system..."
    
    # 创建动态封禁链
    iptables -N AUTO_BAN
    iptables -A INPUT -j AUTO_BAN
    
    # 检查现有封禁
    iptables -A AUTO_BAN -m recent --name banned --rcheck --seconds 3600 -j DROP
    
    # 攻击检测和自动封禁
    iptables -A AUTO_BAN -m recent --name attack_count --rcheck --seconds 300 --hitcount 5 -m recent --name banned --set -j DROP
    
    echo "Automated ban system configured"
}

# 威胁等级响应
threat_level_response() {
    echo "Configuring threat level response..."
    
    # 低威胁:记录日志
    iptables -A INPUT -p tcp --dport 80 -m string --string "robots.txt" --algo bm -j LOG --log-prefix "LOW_THREAT: "
    
    # 中威胁:限制连接
    iptables -A INPUT -p tcp --dport 22 -m recent --name medium_threat --set
    iptables -A INPUT -p tcp --dport 22 -m recent --name medium_threat --rcheck --seconds 60 --hitcount 3 -j REJECT
    
    # 高威胁:立即封禁
    iptables -A INPUT -p tcp --dport 80 -m string --string "../../../etc/passwd" --algo bm -m recent --name banned --set -j DROP
    iptables -A INPUT -p tcp --dport 80 -m string --string "<script>alert" --algo bm -m recent --name banned --set -j DROP
    
    echo "Threat level response configured"
}

# 通知系统
notification_system() {
    echo "Configuring notification system..."
    
    # 创建通知脚本
    cat > /usr/local/bin/security_alert.sh << 'EOF'
#!/bin/bash

# 安全事件通知脚本
send_alert() {
    local event_type="$1"
    local source_ip="$2"
    local details="$3"
    
    # 邮件通知
    echo "Security Alert: $event_type from $source_ip - $details" | \
    mail -s "Security Alert" admin@example.com
    
    # 日志记录
    logger -t SECURITY_ALERT "$event_type from $source_ip: $details"
    
    # Slack 通知(如果配置了)
    if [ -n "$SLACK_WEBHOOK" ]; then
        curl -X POST -H 'Content-type: application/json' \
        --data "{\"text\":\"Security Alert: $event_type from $source_ip\"}" \
        "$SLACK_WEBHOOK"
    fi
}

# 从日志中提取攻击信息
while read line; do
    if echo "$line" | grep -q "SQL_INJECTION"; then
        source_ip=$(echo "$line" | grep -oE "SRC=[0-9.]+" | cut -d'=' -f2)
        send_alert "SQL Injection" "$source_ip" "Detected SQL injection attempt"
    elif echo "$line" | grep -q "XSS_ATTACK"; then
        source_ip=$(echo "$line" | grep -oE "SRC=[0-9.]+" | cut -d'=' -f2)
        send_alert "XSS Attack" "$source_ip" "Detected XSS attack attempt"
    elif echo "$line" | grep -q "PORT_SCAN"; then
        source_ip=$(echo "$line" | grep -oE "SRC=[0-9.]+" | cut -d'=' -f2)
        send_alert "Port Scan" "$source_ip" "Detected port scanning activity"
    fi
done
EOF
    
    chmod +x /usr/local/bin/security_alert.sh
    
    # 配置日志监控
    echo "tail -f /var/log/messages | /usr/local/bin/security_alert.sh &" >> /etc/rc.local
    
    echo "Notification system configured"
}

auto_ban_system
threat_level_response
notification_system

10.3.2 日志分析与取证

1. 安全日志分析

#!/bin/bash
# security_log_analysis.sh

# 日志分析脚本
security_log_analysis() {
    echo "Starting security log analysis..."
    
    log_file="/var/log/messages"
    report_file="/tmp/security_report_$(date +%Y%m%d_%H%M%S).txt"
    
    {
        echo "Security Log Analysis Report"
        echo "Generated: $(date)"
        echo "========================================"
        
        echo "\n1. Attack Summary:"
        echo "SQL Injection attempts: $(grep 'SQL_INJECTION' $log_file | wc -l)"
        echo "XSS attack attempts: $(grep 'XSS_ATTACK' $log_file | wc -l)"
        echo "Port scan attempts: $(grep 'PORT_SCAN' $log_file | wc -l)"
        echo "Brute force attempts: $(grep 'ssh_attack' $log_file | wc -l)"
        echo "DDoS attempts: $(grep 'SYN_FLOOD\|UDP_FLOOD' $log_file | wc -l)"
        
        echo "\n2. Top Attack Sources:"
        grep -E 'SQL_INJECTION|XSS_ATTACK|PORT_SCAN' $log_file | \
        grep -oE 'SRC=[0-9.]+' | cut -d'=' -f2 | sort | uniq -c | sort -nr | head -10
        
        echo "\n3. Attack Timeline (last 24 hours):"
        grep -E 'SQL_INJECTION|XSS_ATTACK|PORT_SCAN' $log_file | \
        grep "$(date '+%b %d')" | awk '{print $1, $2, $3}' | sort | uniq -c
        
        echo "\n4. Targeted Services:"
        grep 'DPT=' $log_file | grep -oE 'DPT=[0-9]+' | cut -d'=' -f2 | sort | uniq -c | sort -nr | head -10
        
        echo "\n5. Blocked Connections:"
        grep 'DROP\|REJECT' $log_file | wc -l
        
        echo "\n6. Geographic Distribution (if GeoIP is available):"
        # 这需要 GeoIP 工具
        # grep -oE 'SRC=[0-9.]+' $log_file | cut -d'=' -f2 | sort -u | \
        # while read ip; do geoiplookup $ip; done | cut -d':' -f2 | sort | uniq -c
        
    } > $report_file
    
    echo "Security analysis report saved to: $report_file"
}

# 实时威胁监控
real_time_threat_monitoring() {
    echo "Starting real-time threat monitoring..."
    
    # 监控脚本
    cat > /usr/local/bin/threat_monitor.sh << 'EOF'
#!/bin/bash

# 实时威胁监控
monitor_threats() {
    local threshold_sql=5
    local threshold_scan=10
    local threshold_brute=3
    
    while true; do
        # 检查最近5分钟的攻击
        current_time=$(date '+%b %d %H:%M')
        
        # SQL 注入检测
        sql_count=$(grep "$current_time" /var/log/messages | grep 'SQL_INJECTION' | wc -l)
        if [ $sql_count -gt $threshold_sql ]; then
            echo "ALERT: High SQL injection activity detected ($sql_count attempts)"
            # 自动封禁攻击源
            grep "$current_time" /var/log/messages | grep 'SQL_INJECTION' | \
            grep -oE 'SRC=[0-9.]+' | cut -d'=' -f2 | sort -u | \
            while read ip; do
                iptables -A INPUT -s $ip -j DROP
                echo "Banned IP: $ip"
            done
        fi
        
        # 端口扫描检测
        scan_count=$(grep "$current_time" /var/log/messages | grep 'PORT_SCAN' | wc -l)
        if [ $scan_count -gt $threshold_scan ]; then
            echo "ALERT: High port scanning activity detected ($scan_count attempts)"
        fi
        
        # 暴力破解检测
        brute_count=$(grep "$current_time" /var/log/messages | grep 'ssh_attack' | wc -l)
        if [ $brute_count -gt $threshold_brute ]; then
            echo "ALERT: SSH brute force attack detected ($brute_count attempts)"
        fi
        
        sleep 300  # 每5分钟检查一次
    done
}

monitor_threats
EOF
    
    chmod +x /usr/local/bin/threat_monitor.sh
    
    # 启动监控(后台运行)
    nohup /usr/local/bin/threat_monitor.sh > /var/log/threat_monitor.log 2>&1 &
    
    echo "Real-time threat monitoring started"
}

# 取证数据收集
forensic_data_collection() {
    echo "Collecting forensic data..."
    
    forensic_dir="/tmp/forensic_$(date +%Y%m%d_%H%M%S)"
    mkdir -p $forensic_dir
    
    # 收集系统信息
    uname -a > $forensic_dir/system_info.txt
    date > $forensic_dir/collection_time.txt
    uptime > $forensic_dir/uptime.txt
    
    # 收集网络连接信息
    netstat -tuln > $forensic_dir/listening_ports.txt
    netstat -tun > $forensic_dir/active_connections.txt
    ss -tuln > $forensic_dir/socket_stats.txt
    
    # 收集防火墙规则
    iptables-save > $forensic_dir/iptables_rules.txt
    iptables -L -n -v > $forensic_dir/iptables_stats.txt
    
    # 收集连接跟踪信息
    cat /proc/net/nf_conntrack > $forensic_dir/conntrack.txt
    
    # 收集日志文件
    cp /var/log/messages $forensic_dir/
    cp /var/log/secure $forensic_dir/ 2>/dev/null
    cp /var/log/auth.log $forensic_dir/ 2>/dev/null
    
    # 收集进程信息
    ps aux > $forensic_dir/processes.txt
    lsof -i > $forensic_dir/open_files.txt
    
    # 创建压缩包
    tar -czf $forensic_dir.tar.gz -C /tmp $(basename $forensic_dir)
    
    echo "Forensic data collected in: $forensic_dir.tar.gz"
}

security_log_analysis
real_time_threat_monitoring
forensic_data_collection

10.4 合规性配置

10.4.1 安全标准合规

1. PCI DSS 合规配置

#!/bin/bash
# pci_dss_compliance.sh

# PCI DSS 合规配置
pci_dss_compliance() {
    echo "Configuring PCI DSS compliance..."
    
    # 要求 1: 安装和维护防火墙配置
    # 默认拒绝策略
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    
    # 要求 2: 不使用供应商提供的默认值
    # 更改默认 SSH 端口(示例)
    ssh_port=2222
    iptables -A INPUT -p tcp --dport $ssh_port -s 192.168.1.0/24 -j ACCEPT
    
    # 要求 3: 保护存储的持卡人数据
    # 限制对数据库服务器的访问
    db_server="192.168.10.100"
    web_servers="192.168.10.10,192.168.10.11"
    
    iptables -A FORWARD -s $web_servers -d $db_server -p tcp --dport 3306 -j ACCEPT
    iptables -A FORWARD -d $db_server -p tcp --dport 3306 -j DROP
    
    # 要求 4: 在开放的公共网络上传输持卡人数据时进行加密
    # 强制使用 HTTPS
    iptables -A INPUT -p tcp --dport 80 -j REDIRECT --to-port 443
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    
    # 要求 7: 按业务需要限制对持卡人数据的访问
    # 基于角色的访问控制
    admin_network="192.168.1.0/24"
    user_network="192.168.2.0/24"
    
    # 管理员可以访问所有服务
    iptables -A FORWARD -s $admin_network -j ACCEPT
    
    # 普通用户只能访问 Web 服务
    iptables -A FORWARD -s $user_network -d $web_servers -p tcp --dport 80 -j ACCEPT
    iptables -A FORWARD -s $user_network -d $web_servers -p tcp --dport 443 -j ACCEPT
    iptables -A FORWARD -s $user_network -j DROP
    
    # 要求 10: 跟踪和监控对网络资源和持卡人数据的所有访问
    # 记录所有访问日志
    iptables -A INPUT -j LOG --log-prefix "INPUT: "
    iptables -A FORWARD -j LOG --log-prefix "FORWARD: "
    iptables -A OUTPUT -j LOG --log-prefix "OUTPUT: "
    
    echo "PCI DSS compliance configuration completed"
}

# HIPAA 合规配置
hipaa_compliance() {
    echo "Configuring HIPAA compliance..."
    
    # 访问控制
    # 只允许授权人员访问医疗数据
    medical_data_server="192.168.20.100"
    authorized_users="192.168.20.10,192.168.20.11"
    
    iptables -A FORWARD -s $authorized_users -d $medical_data_server -p tcp --dport 443 -j ACCEPT
    iptables -A FORWARD -d $medical_data_server -j DROP
    
    # 审计控制
    # 记录所有对医疗数据的访问
    iptables -A FORWARD -d $medical_data_server -j LOG --log-prefix "HIPAA_ACCESS: "
    
    # 完整性控制
    # 防止未授权的数据修改
    iptables -A FORWARD -d $medical_data_server -p tcp --dport 80 -j DROP  # 禁用 HTTP
    
    # 传输安全
    # 强制加密传输
    iptables -A FORWARD -d $medical_data_server -p tcp ! --dport 443 -j DROP
    
    echo "HIPAA compliance configuration completed"
}

# SOX 合规配置
sox_compliance() {
    echo "Configuring SOX compliance..."
    
    # 财务数据保护
    financial_server="192.168.30.100"
    finance_team="192.168.30.0/24"
    
    # 限制对财务系统的访问
    iptables -A FORWARD -s $finance_team -d $financial_server -p tcp --dport 443 -j ACCEPT
    iptables -A FORWARD -d $financial_server -j DROP
    
    # 审计跟踪
    iptables -A FORWARD -d $financial_server -j LOG --log-prefix "SOX_AUDIT: "
    
    # 职责分离
    # IT 人员不能直接访问财务数据
    it_network="192.168.100.0/24"
    iptables -A FORWARD -s $it_network -d $financial_server -j DROP
    
    echo "SOX compliance configuration completed"
}

pci_dss_compliance
hipaa_compliance
sox_compliance

10.4.2 审计和报告

1. 合规性检查脚本

#!/bin/bash
# compliance_check.sh

# 合规性检查
compliance_check() {
    echo "Starting compliance check..."
    
    report_file="/tmp/compliance_report_$(date +%Y%m%d_%H%M%S).txt"
    
    {
        echo "Compliance Check Report"
        echo "Generated: $(date)"
        echo "========================================"
        
        echo "\n1. Firewall Configuration Check:"
        
        # 检查默认策略
        input_policy=$(iptables -L INPUT | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
        forward_policy=$(iptables -L FORWARD | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
        output_policy=$(iptables -L OUTPUT | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
        
        echo "INPUT policy: $input_policy"
        echo "FORWARD policy: $forward_policy"
        echo "OUTPUT policy: $output_policy"
        
        if [ "$input_policy" = "DROP" ] && [ "$forward_policy" = "DROP" ]; then
            echo "✓ Default deny policy is properly configured"
        else
            echo "✗ Default deny policy is NOT properly configured"
        fi
        
        echo "\n2. Service Access Control:"
        
        # 检查 SSH 访问限制
        ssh_rules=$(iptables -L INPUT -n | grep ':22 ')
        if [ -n "$ssh_rules" ]; then
            echo "✓ SSH access rules are configured"
            echo "SSH rules: $ssh_rules"
        else
            echo "✗ No SSH access rules found"
        fi
        
        # 检查 Web 服务配置
        http_rules=$(iptables -L INPUT -n | grep ':80 ')
        https_rules=$(iptables -L INPUT -n | grep ':443 ')
        
        if [ -n "$https_rules" ]; then
            echo "✓ HTTPS access is configured"
        else
            echo "✗ HTTPS access is not configured"
        fi
        
        echo "\n3. Logging Configuration:"
        
        # 检查日志规则
        log_rules=$(iptables -L -n | grep LOG | wc -l)
        echo "Number of LOG rules: $log_rules"
        
        if [ $log_rules -gt 0 ]; then
            echo "✓ Logging is configured"
        else
            echo "✗ No logging rules found"
        fi
        
        echo "\n4. Attack Protection:"
        
        # 检查 DDoS 保护
        limit_rules=$(iptables -L -n | grep limit | wc -l)
        echo "Number of rate limiting rules: $limit_rules"
        
        # 检查连接限制
        connlimit_rules=$(iptables -L -n | grep connlimit | wc -l)
        echo "Number of connection limiting rules: $connlimit_rules"
        
        # 检查 recent 模块使用
        recent_rules=$(iptables -L -n | grep recent | wc -l)
        echo "Number of recent tracking rules: $recent_rules"
        
        echo "\n5. Network Segmentation:"
        
        # 检查 FORWARD 链规则
        forward_rules=$(iptables -L FORWARD -n | grep -v '^Chain\|^target' | wc -l)
        echo "Number of FORWARD rules: $forward_rules"
        
        if [ $forward_rules -gt 0 ]; then
            echo "✓ Network segmentation rules are configured"
        else
            echo "✗ No network segmentation rules found"
        fi
        
        echo "\n6. Security Score:"
        
        score=0
        
        # 评分标准
        [ "$input_policy" = "DROP" ] && score=$((score + 20))
        [ "$forward_policy" = "DROP" ] && score=$((score + 20))
        [ -n "$ssh_rules" ] && score=$((score + 15))
        [ -n "$https_rules" ] && score=$((score + 15))
        [ $log_rules -gt 0 ] && score=$((score + 10))
        [ $limit_rules -gt 0 ] && score=$((score + 10))
        [ $recent_rules -gt 0 ] && score=$((score + 10))
        
        echo "Security Score: $score/100"
        
        if [ $score -ge 80 ]; then
            echo "Status: Compliant"
        elif [ $score -ge 60 ]; then
            echo "Status: Partially Compliant"
        else
            echo "Status: Non-Compliant"
        fi
        
    } > $report_file
    
    echo "Compliance check report saved to: $report_file"
}

# 自动化合规性监控
automated_compliance_monitoring() {
    echo "Setting up automated compliance monitoring..."
    
    # 创建监控脚本
    cat > /usr/local/bin/compliance_monitor.sh << 'EOF'
#!/bin/bash

# 合规性监控脚本
monitor_compliance() {
    local alert_file="/tmp/compliance_alerts.log"
    
    # 检查防火墙状态
    if ! systemctl is-active --quiet iptables; then
        echo "$(date): CRITICAL - iptables service is not running" >> $alert_file
    fi
    
    # 检查默认策略
    input_policy=$(iptables -L INPUT | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
    if [ "$input_policy" != "DROP" ]; then
        echo "$(date): WARNING - INPUT policy is not DROP" >> $alert_file
    fi
    
    # 检查规则数量变化
    current_rules=$(iptables -L | grep -c '^Chain\|^target')
    expected_rules=50  # 根据实际情况设置
    
    if [ $current_rules -lt $expected_rules ]; then
        echo "$(date): WARNING - Rule count is below expected ($current_rules < $expected_rules)" >> $alert_file
    fi
    
    # 检查关键服务保护
    ssh_protection=$(iptables -L INPUT -n | grep ':22 ' | wc -l)
    if [ $ssh_protection -eq 0 ]; then
        echo "$(date): CRITICAL - No SSH protection rules found" >> $alert_file
    fi
    
    # 检查日志配置
    log_rules=$(iptables -L -n | grep LOG | wc -l)
    if [ $log_rules -eq 0 ]; then
        echo "$(date): WARNING - No logging rules configured" >> $alert_file
    fi
    
    # 发送告警(如果有)
    if [ -f $alert_file ] && [ -s $alert_file ]; then
        mail -s "Compliance Alert" admin@example.com < $alert_file
        > $alert_file  # 清空文件
    fi
}

# 每小时检查一次
while true; do
    monitor_compliance
    sleep 3600
done
EOF
    
    chmod +x /usr/local/bin/compliance_monitor.sh
    
    # 添加到系统启动
    echo "nohup /usr/local/bin/compliance_monitor.sh > /var/log/compliance_monitor.log 2>&1 &" >> /etc/rc.local
    
    echo "Automated compliance monitoring configured"
}

compliance_check
automated_compliance_monitoring

10.5 安全配置模板

10.5.1 企业级安全模板

1. Web 服务器安全模板

#!/bin/bash
# web_server_security_template.sh

# Web 服务器安全配置模板
web_server_security() {
    echo "Applying web server security template..."
    
    # 清空现有规则
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X
    
    # 设置默认策略
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    
    # 基础规则
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    # SSH 访问(限制源地址和连接频率)
    iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -m recent --name ssh_conn --set
    iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -m recent --name ssh_conn --rcheck --seconds 60 --hitcount 4 -j DROP
    iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
    
    # HTTP/HTTPS 服务
    # 防止 DDoS 攻击
    iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
    
    # 连接数限制
    iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT
    iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 20 -j REJECT
    
    # 应用层攻击防护
    iptables -A INPUT -p tcp --dport 80 -m string --string "../" --algo bm -j DROP
    iptables -A INPUT -p tcp --dport 80 -m string --string "<script" --algo bm -j DROP
    iptables -A INPUT -p tcp --dport 80 -m string --string "UNION SELECT" --algo bm -j DROP
    
    # 地理位置限制(需要 GeoIP)
    # iptables -A INPUT -p tcp --dport 80 -m geoip --src-cc CN,RU -j DROP
    
    # 日志记录
    iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "INPUT_DROP: "
    
    echo "Web server security template applied"
}

# 数据库服务器安全模板
database_server_security() {
    echo "Applying database server security template..."
    
    # 清空现有规则
    iptables -F
    iptables -X
    
    # 设置默认策略
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    
    # 基础规则
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    # SSH 访问(仅管理网段)
    iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
    
    # 数据库访问(仅 Web 服务器)
    web_servers="192.168.10.10,192.168.10.11,192.168.10.12"
    iptables -A INPUT -p tcp --dport 3306 -s $web_servers -m connlimit --connlimit-above 10 -j REJECT
    iptables -A INPUT -p tcp --dport 3306 -s $web_servers -j ACCEPT
    
    # 出站连接(仅必要服务)
    iptables -A OUTPUT -p udp --dport 53 -j ACCEPT  # DNS
    iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT  # HTTP updates
    iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT # HTTPS updates
    iptables -A OUTPUT -p udp --dport 123 -j ACCEPT # NTP
    
    # 备份服务器连接
    backup_server="192.168.20.100"
    iptables -A OUTPUT -p tcp -d $backup_server --dport 22 -j ACCEPT
    
    # 监控和日志
    iptables -A INPUT -j LOG --log-prefix "DB_INPUT_DROP: "
    iptables -A OUTPUT -j LOG --log-prefix "DB_OUTPUT_DROP: "
    
    echo "Database server security template applied"
}

# 邮件服务器安全模板
mail_server_security() {
    echo "Applying mail server security template..."
    
    # 清空现有规则
    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 conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    # SSH 访问
    iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
    
    # SMTP 服务
    iptables -A INPUT -p tcp --dport 25 -m limit --limit 10/minute -j ACCEPT
    iptables -A INPUT -p tcp --dport 587 -m limit --limit 10/minute -j ACCEPT  # SMTP TLS
    iptables -A INPUT -p tcp --dport 465 -m limit --limit 10/minute -j ACCEPT  # SMTP SSL
    
    # POP3/IMAP 服务
    iptables -A INPUT -p tcp --dport 110 -j ACCEPT  # POP3
    iptables -A INPUT -p tcp --dport 995 -j ACCEPT  # POP3S
    iptables -A INPUT -p tcp --dport 143 -j ACCEPT  # IMAP
    iptables -A INPUT -p tcp --dport 993 -j ACCEPT  # IMAPS
    
    # 反垃圾邮件保护
    iptables -A INPUT -p tcp --dport 25 -m recent --name smtp_conn --set
    iptables -A INPUT -p tcp --dport 25 -m recent --name smtp_conn --rcheck --seconds 60 --hitcount 10 -j DROP
    
    # 认证失败保护
    iptables -A INPUT -p tcp --dport 110 -m recent --name pop3_auth --set
    iptables -A INPUT -p tcp --dport 110 -m recent --name pop3_auth --rcheck --seconds 300 --hitcount 5 -j DROP
    
    echo "Mail server security template applied"
}

web_server_security
# database_server_security
# mail_server_security

10.5.2 网络安全模板

1. 企业网关安全模板

#!/bin/bash
# enterprise_gateway_security.sh

# 企业网关安全配置
enterprise_gateway_security() {
    echo "Configuring enterprise gateway security..."
    
    # 网络接口定义
    external_interface="eth0"    # 外网接口
    internal_interface="eth1"    # 内网接口
    dmz_interface="eth2"        # DMZ 接口
    
    # 网络段定义
    internal_network="192.168.1.0/24"
    dmz_network="192.168.10.0/24"
    management_network="192.168.100.0/24"
    
    # 清空规则
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X
    iptables -t mangle -F
    iptables -t mangle -X
    
    # 设置默认策略
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    
    # 基础规则
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    # 管理访问
    iptables -A INPUT -i $internal_interface -s $management_network -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT -i $internal_interface -s $management_network -p tcp --dport 443 -j ACCEPT
    
    # NAT 配置
    iptables -t nat -A POSTROUTING -o $external_interface -j MASQUERADE
    
    # 内网到外网的访问控制
    iptables -A FORWARD -i $internal_interface -o $external_interface -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -i $external_interface -o $internal_interface -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    # DMZ 访问控制
    # DMZ 可以访问外网
    iptables -A FORWARD -i $dmz_interface -o $external_interface -j ACCEPT
    iptables -A FORWARD -i $external_interface -o $dmz_interface -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    # 外网到 DMZ 的特定服务
    iptables -A FORWARD -i $external_interface -o $dmz_interface -p tcp --dport 80 -j ACCEPT
    iptables -A FORWARD -i $external_interface -o $dmz_interface -p tcp --dport 443 -j ACCEPT
    
    # DMZ 到内网的限制访问
    iptables -A FORWARD -i $dmz_interface -o $internal_interface -p tcp --dport 3306 -j ACCEPT  # 数据库
    iptables -A FORWARD -i $dmz_interface -o $internal_interface -p tcp --dport 6379 -j ACCEPT  # Redis
    iptables -A FORWARD -i $dmz_interface -o $internal_interface -j DROP
    
    # 内网到 DMZ 的管理访问
    iptables -A FORWARD -i $internal_interface -o $dmz_interface -s $management_network -p tcp --dport 22 -j ACCEPT
    
    # 攻击防护
    # SYN Flood 防护
    iptables -A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
    iptables -A FORWARD -p tcp --syn -j DROP
    
    # 端口扫描防护
    iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j DROP
    iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j DROP
    
    # ICMP 限制
    iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    iptables -A FORWARD -p icmp --icmp-type echo-request -j DROP
    
    # 日志记录
    iptables -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "FORWARD_DROP: "
    
    echo "Enterprise gateway security configured"
}

# VPN 服务器安全模板
vpn_server_security() {
    echo "Configuring VPN server security..."
    
    vpn_interface="tun0"
    vpn_network="10.8.0.0/24"
    
    # VPN 客户端访问
    iptables -A INPUT -i $vpn_interface -j ACCEPT
    iptables -A OUTPUT -o $vpn_interface -j ACCEPT
    
    # VPN 流量转发
    iptables -A FORWARD -i $vpn_interface -j ACCEPT
    iptables -A FORWARD -o $vpn_interface -j ACCEPT
    
    # NAT for VPN traffic
    iptables -t nat -A POSTROUTING -s $vpn_network -o eth0 -j MASQUERADE
    
    # OpenVPN 端口
    iptables -A INPUT -p udp --dport 1194 -j ACCEPT
    
    # VPN 客户端限制
    iptables -A INPUT -p udp --dport 1194 -m connlimit --connlimit-above 50 -j REJECT
    
    echo "VPN server security configured"
}

enterprise_gateway_security
# vpn_server_security

10.6 本章小结

安全配置要点回顾

本章详细介绍了 iptables 的安全配置和防护策略,主要包括以下几个方面:

1. 安全策略设计原则

  • 最小权限原则:只开放必要的服务和端口
  • 默认拒绝策略:采用白名单方式,默认拒绝所有访问
  • 深度防御策略:多层防护,分层安全控制
  • 网络分段:隔离不同安全级别的网络区域

2. 常见攻击防护

  • DDoS 攻击防护:SYN Flood、UDP Flood、连接限制
  • 端口扫描防护:异常 TCP 标志位检测、连接频率限制
  • 暴力破解防护:失败尝试限制、自动封禁机制
  • 应用层攻击防护:SQL 注入、XSS、目录遍历等

3. 入侵检测与响应

  • 实时检测:异常流量、恶意行为、网络侦察
  • 自动响应:动态封禁、威胁等级响应、通知系统
  • 日志分析:安全事件统计、攻击源分析、取证数据收集

4. 合规性配置

  • 安全标准:PCI DSS、HIPAA、SOX 等合规要求
  • 审计控制:访问记录、完整性保护、职责分离
  • 自动化监控:合规性检查、告警机制

5. 安全配置模板

  • 服务器模板:Web 服务器、数据库服务器、邮件服务器
  • 网络模板:企业网关、VPN 服务器、DMZ 配置

最佳实践建议

  1. 安全策略制定

    • 基于业务需求制定安全策略
    • 定期评估和更新安全配置
    • 建立安全事件响应流程
  2. 防护措施部署

    • 采用多层防护策略
    • 配置适当的攻击检测阈值
    • 实施自动化响应机制
  3. 监控和审计

    • 建立完善的日志记录机制
    • 定期进行安全审计
    • 监控合规性状态
  4. 持续改进

    • 跟踪最新的安全威胁
    • 更新防护规则和策略
    • 进行安全培训和演练

安全配置检查清单

  • [ ] 配置默认拒绝策略
  • [ ] 实施最小权限原则
  • [ ] 配置 DDoS 攻击防护
  • [ ] 部署暴力破解防护
  • [ ] 启用入侵检测机制
  • [ ] 配置安全日志记录
  • [ ] 实施网络分段控制
  • [ ] 建立自动响应系统
  • [ ] 配置合规性监控
  • [ ] 定期进行安全评估

下一章预告

下一章我们将学习 iptables 的故障排除和调试技巧,包括: - 常见问题诊断 - 调试工具使用 - 性能问题排查 - 规则冲突解决 - 网络连通性测试

通过学习故障排除技巧,您将能够快速定位和解决 iptables 相关问题。


练习

理论练习

  1. 安全策略设计题

    • 为一个电商网站设计完整的安全防护策略
    • 包括网络分段、访问控制、攻击防护等
  2. 合规性配置题

    • 根据 PCI DSS 要求配置支付系统的防火墙规则
    • 确保满足相关合规性要求
  3. 威胁分析题

    • 分析常见的网络攻击手段
    • 设计相应的防护措施

实践练习

  1. 安全配置实施

    • 使用本章提供的模板配置 Web 服务器安全
    • 测试各种攻击防护效果
  2. 入侵检测配置

    • 配置实时入侵检测系统
    • 测试自动响应机制
  3. 合规性检查

    • 运行合规性检查脚本
    • 根据检查结果优化配置

思考题

  1. 如何平衡安全性和可用性?过度的安全措施可能带来什么问题?

  2. 在云环境中部署 iptables 安全策略有什么特殊考虑?

  3. 如何设计一个既安全又高效的企业网络架构?

  4. 面对新型攻击手段,如何快速更新防护策略?

  5. 如何建立有效的安全事件响应流程?