15.1 企业级VPN部署案例

15.1.1 大型企业分支机构互联

场景描述: 某跨国企业拥有总部和20个分支机构,需要建立安全的内网互联方案。

需求分析: - 总部与各分支机构安全互联 - 支持1000+并发用户 - 高可用性要求(99.9%+) - 集中化管理和监控 - 符合行业合规要求

#!/bin/bash
# enterprise_vpn_deployment.sh - 企业级VPN部署脚本

echo "===== 企业级OpenVPN部署 ====="

# 配置参数
HEADQUARTERS_IP="203.0.113.10"
BRANCH_COUNT=20
MAX_CLIENTS=1000
VPN_NETWORK="10.0.0.0/16"
HEADQUARTERS_SUBNET="10.0.1.0/24"

# 1. 创建企业级目录结构
setup_enterprise_structure() {
    echo "创建企业级目录结构..."
    
    mkdir -p /etc/openvpn/enterprise/{
        headquarters,
        branches,
        certificates,
        configs,
        scripts,
        logs,
        monitoring,
        backup
    }
    
    # 创建分支机构目录
    for i in $(seq 1 $BRANCH_COUNT); do
        mkdir -p "/etc/openvpn/enterprise/branches/branch-$(printf "%02d" $i)"
    done
    
    echo "目录结构创建完成"
}

# 2. 生成企业级PKI
setup_enterprise_pki() {
    echo "设置企业级PKI..."
    
    cd /etc/openvpn/enterprise/certificates
    
    # 初始化PKI
    /usr/share/easy-rsa/easyrsa init-pki
    
    # 创建CA(使用企业信息)
    echo "Enterprise-CA" | /usr/share/easy-rsa/easyrsa build-ca nopass
    
    # 生成服务器证书
    /usr/share/easy-rsa/easyrsa build-server-full headquarters-server nopass
    
    # 生成分支机构证书
    for i in $(seq 1 $BRANCH_COUNT); do
        branch_name="branch-$(printf "%02d" $i)"
        /usr/share/easy-rsa/easyrsa build-client-full "$branch_name" nopass
    done
    
    # 生成DH参数
    /usr/share/easy-rsa/easyrsa gen-dh
    
    # 生成TLS-Auth密钥
    openvpn --genkey --secret ta.key
    
    echo "PKI设置完成"
}

# 3. 配置总部服务器
setup_headquarters_server() {
    echo "配置总部服务器..."
    
    cat > /etc/openvpn/enterprise/headquarters/server.conf << EOF
# 企业总部OpenVPN服务器配置
port 1194
proto udp
dev tun

# 证书和密钥
ca /etc/openvpn/enterprise/certificates/pki/ca.crt
cert /etc/openvpn/enterprise/certificates/pki/issued/headquarters-server.crt
key /etc/openvpn/enterprise/certificates/pki/private/headquarters-server.key
dh /etc/openvpn/enterprise/certificates/pki/dh.pem
tls-auth /etc/openvpn/enterprise/certificates/ta.key 0

# 网络配置
server $HEADQUARTERS_SUBNET 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt

# 路由配置
push "route 192.168.0.0 255.255.0.0"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

# 安全配置
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384

# 性能优化
max-clients $MAX_CLIENTS
keepalive 10 120
comp-lzo adaptive
fast-io

# 日志配置
status /var/log/openvpn/headquarters-status.log
log-append /var/log/openvpn/headquarters.log
verb 3
mute 20

# 管理接口
management 127.0.0.1 7505

# 脚本配置
script-security 2
client-connect /etc/openvpn/enterprise/scripts/client-connect.sh
client-disconnect /etc/openvpn/enterprise/scripts/client-disconnect.sh

# 用户权限
user nobody
group nogroup
persist-key
persist-tun
EOF

    echo "总部服务器配置完成"
}

# 4. 生成分支机构配置
generate_branch_configs() {
    echo "生成分支机构配置..."
    
    for i in $(seq 1 $BRANCH_COUNT); do
        branch_name="branch-$(printf "%02d" $i)"
        branch_ip="10.0.$((i+1)).0"
        
        cat > "/etc/openvpn/enterprise/branches/$branch_name/$branch_name.ovpn" << EOF
# 分支机构 $branch_name 配置
client
dev tun
proto udp

# 服务器信息
remote $HEADQUARTERS_IP 1194
resolv-retry infinite
nobind

# 证书配置
<ca>
$(cat /etc/openvpn/enterprise/certificates/pki/ca.crt)
</ca>

<cert>
$(cat /etc/openvpn/enterprise/certificates/pki/issued/$branch_name.crt)
</cert>

<key>
$(cat /etc/openvpn/enterprise/certificates/pki/private/$branch_name.key)
</key>

<tls-auth>
$(cat /etc/openvpn/enterprise/certificates/ta.key)
</tls-auth>
key-direction 1

# 安全配置
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

# 连接配置
keepalive 10 120
comp-lzo adaptive
verb 3
mute 20

# 路由配置
route $branch_ip 255.255.255.0
EOF
        
        echo "分支机构 $branch_name 配置已生成"
    done
}

# 5. 创建管理脚本
create_management_scripts() {
    echo "创建管理脚本..."
    
    # 客户端连接脚本
    cat > /etc/openvpn/enterprise/scripts/client-connect.sh << 'EOF'
#!/bin/bash
# client-connect.sh - 客户端连接处理

CLIENT_CN="$X509_0_CN"
CLIENT_IP="$ifconfig_pool_remote_ip"
CONNECT_TIME=$(date '+%Y-%m-%d %H:%M:%S')

# 记录连接日志
echo "$CONNECT_TIME: $CLIENT_CN ($CLIENT_IP) 已连接" >> /var/log/openvpn/connections.log

# 发送通知(可选)
# curl -X POST "https://monitoring.company.com/api/vpn/connect" \
#      -d "{\"client\": \"$CLIENT_CN\", \"ip\": \"$CLIENT_IP\", \"time\": \"$CONNECT_TIME\"}"

exit 0
EOF

    # 客户端断开脚本
    cat > /etc/openvpn/enterprise/scripts/client-disconnect.sh << 'EOF'
#!/bin/bash
# client-disconnect.sh - 客户端断开处理

CLIENT_CN="$X509_0_CN"
CLIENT_IP="$ifconfig_pool_remote_ip"
BYTES_RECEIVED="$bytes_received"
BYTES_SENT="$bytes_sent"
DISCONNECT_TIME=$(date '+%Y-%m-%d %H:%M:%S')

# 记录断开日志
echo "$DISCONNECT_TIME: $CLIENT_CN ($CLIENT_IP) 已断开 - 接收: $BYTES_RECEIVED 字节, 发送: $BYTES_SENT 字节" >> /var/log/openvpn/connections.log

exit 0
EOF

    chmod +x /etc/openvpn/enterprise/scripts/*.sh
    
    echo "管理脚本创建完成"
}

# 6. 设置监控系统
setup_monitoring() {
    echo "设置监控系统..."
    
    cat > /etc/openvpn/enterprise/monitoring/monitor.sh << 'EOF'
#!/bin/bash
# monitor.sh - VPN监控脚本

MONITOR_DIR="/etc/openvpn/enterprise/monitoring"
STATUS_FILE="/var/log/openvpn/headquarters-status.log"
ALERT_EMAIL="admin@company.com"

# 检查服务状态
check_service_status() {
    if ! systemctl is-active --quiet openvpn@headquarters; then
        echo "警告: OpenVPN服务未运行" | mail -s "VPN服务警告" $ALERT_EMAIL
        return 1
    fi
    return 0
}

# 检查连接数
check_connection_count() {
    if [ -f "$STATUS_FILE" ]; then
        conn_count=$(grep "^CLIENT_LIST" "$STATUS_FILE" | wc -l)
        echo "当前连接数: $conn_count"
        
        if [ $conn_count -gt 800 ]; then
            echo "警告: 连接数过高 ($conn_count)" | mail -s "VPN连接数警告" $ALERT_EMAIL
        fi
    fi
}

# 检查系统资源
check_system_resources() {
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    mem_usage=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')
    
    echo "CPU使用率: ${cpu_usage}%"
    echo "内存使用率: ${mem_usage}%"
    
    if (( $(echo "$cpu_usage > 80" | bc -l) )); then
        echo "警告: CPU使用率过高 (${cpu_usage}%)" | mail -s "VPN服务器CPU警告" $ALERT_EMAIL
    fi
    
    if (( $(echo "$mem_usage > 80" | bc -l) )); then
        echo "警告: 内存使用率过高 (${mem_usage}%)" | mail -s "VPN服务器内存警告" $ALERT_EMAIL
    fi
}

# 生成状态报告
generate_status_report() {
    report_file="$MONITOR_DIR/status_$(date '+%Y%m%d_%H%M%S').txt"
    
    {
        echo "OpenVPN企业级部署状态报告"
        echo "生成时间: $(date)"
        echo "========================="
        echo ""
        
        echo "服务状态:"
        systemctl status openvpn@headquarters --no-pager
        echo ""
        
        echo "连接统计:"
        check_connection_count
        echo ""
        
        echo "系统资源:"
        check_system_resources
        echo ""
        
        echo "最近连接日志:"
        tail -20 /var/log/openvpn/connections.log
        
    } > "$report_file"
    
    echo "状态报告已生成: $report_file"
}

# 执行监控检查
check_service_status
check_connection_count
check_system_resources
generate_status_report
EOF

    chmod +x /etc/openvpn/enterprise/monitoring/monitor.sh
    
    # 设置定时监控
    echo "*/5 * * * * /etc/openvpn/enterprise/monitoring/monitor.sh" | crontab -
    
    echo "监控系统设置完成"
}

# 7. 创建备份脚本
setup_backup_system() {
    echo "设置备份系统..."
    
    cat > /etc/openvpn/enterprise/backup/backup.sh << 'EOF'
#!/bin/bash
# backup.sh - VPN配置备份脚本

BACKUP_DIR="/etc/openvpn/enterprise/backup"
DATE=$(date '+%Y%m%d_%H%M%S')
BACKUP_FILE="$BACKUP_DIR/openvpn_backup_$DATE.tar.gz"

echo "开始备份OpenVPN配置..."

# 创建备份
tar -czf "$BACKUP_FILE" \
    /etc/openvpn/enterprise/headquarters/ \
    /etc/openvpn/enterprise/certificates/ \
    /etc/openvpn/enterprise/scripts/ \
    /etc/openvpn/enterprise/configs/ \
    /var/log/openvpn/

echo "备份完成: $BACKUP_FILE"

# 清理旧备份(保留30天)
find "$BACKUP_DIR" -name "openvpn_backup_*.tar.gz" -mtime +30 -delete

echo "旧备份清理完成"
EOF

    chmod +x /etc/openvpn/enterprise/backup/backup.sh
    
    # 设置每日备份
    echo "0 2 * * * /etc/openvpn/enterprise/backup/backup.sh" | crontab -
    
    echo "备份系统设置完成"
}

# 8. 配置防火墙
setup_firewall() {
    echo "配置防火墙规则..."
    
    # 允许OpenVPN端口
    iptables -A INPUT -p udp --dport 1194 -j ACCEPT
    
    # 允许TUN接口流量
    iptables -A INPUT -i tun+ -j ACCEPT
    iptables -A FORWARD -i tun+ -j ACCEPT
    iptables -A FORWARD -o tun+ -j ACCEPT
    
    # NAT配置
    iptables -t nat -A POSTROUTING -s $VPN_NETWORK -o eth0 -j MASQUERADE
    
    # 保存规则
    iptables-save > /etc/iptables/rules.v4
    
    echo "防火墙配置完成"
}

# 9. 启动服务
start_services() {
    echo "启动OpenVPN服务..."
    
    # 复制配置文件
    cp /etc/openvpn/enterprise/headquarters/server.conf /etc/openvpn/headquarters.conf
    
    # 启动服务
    systemctl enable openvpn@headquarters
    systemctl start openvpn@headquarters
    
    # 检查状态
    systemctl status openvpn@headquarters
    
    echo "服务启动完成"
}

# 10. 生成部署报告
generate_deployment_report() {
    echo "生成部署报告..."
    
    REPORT_FILE="/etc/openvpn/enterprise/deployment_report_$(date '+%Y%m%d_%H%M%S').txt"
    
    cat > "$REPORT_FILE" << EOF
企业级OpenVPN部署报告
$(date '+%Y-%m-%d %H:%M:%S')

=== 部署概述 ===
总部IP: $HEADQUARTERS_IP
分支机构数量: $BRANCH_COUNT
最大客户端数: $MAX_CLIENTS
VPN网络: $VPN_NETWORK
总部子网: $HEADQUARTERS_SUBNET

=== 组件状态 ===
✓ PKI证书系统
✓ 总部服务器配置
✓ 分支机构配置
✓ 管理脚本
✓ 监控系统
✓ 备份系统
✓ 防火墙配置
✓ 服务启动

=== 配置文件位置 ===
总部服务器: /etc/openvpn/enterprise/headquarters/server.conf
分支机构配置: /etc/openvpn/enterprise/branches/
证书文件: /etc/openvpn/enterprise/certificates/
管理脚本: /etc/openvpn/enterprise/scripts/
监控脚本: /etc/openvpn/enterprise/monitoring/
备份脚本: /etc/openvpn/enterprise/backup/

=== 管理命令 ===
查看服务状态: systemctl status openvpn@headquarters
查看连接状态: cat /var/log/openvpn/headquarters-status.log
查看连接日志: tail -f /var/log/openvpn/connections.log
执行监控检查: /etc/openvpn/enterprise/monitoring/monitor.sh
执行备份: /etc/openvpn/enterprise/backup/backup.sh

=== 安全建议 ===
1. 定期更新证书
2. 监控连接日志
3. 定期备份配置
4. 更新系统补丁
5. 审查访问权限

=== 下一步操作 ===
1. 分发分支机构配置文件
2. 测试各分支机构连接
3. 配置监控告警
4. 培训管理员
5. 制定应急预案
EOF

    echo "部署报告已生成: $REPORT_FILE"
}

# 执行部署
echo "开始企业级OpenVPN部署..."

setup_enterprise_structure
setup_enterprise_pki
setup_headquarters_server
generate_branch_configs
create_management_scripts
setup_monitoring
setup_backup_system
setup_firewall
start_services
generate_deployment_report

echo "企业级OpenVPN部署完成!"

15.2 远程办公VPN解决方案

15.2.1 COVID-19疫情期间的快速部署

场景描述: 某中型企业因疫情需要快速部署远程办公VPN,支持500名员工在家办公。

技术要求: - 快速部署(48小时内) - 支持多平台客户端 - 简化用户配置 - 安全访问内网资源 - 带宽优化

#!/bin/bash
# remote_work_vpn.sh - 远程办公VPN快速部署

echo "===== 远程办公VPN快速部署 ====="

# 配置参数
SERVER_IP="203.0.113.20"
EMPLOYEE_COUNT=500
VPN_NETWORK="10.10.0.0/16"
COMPANY_NETWORK="192.168.0.0/16"
COMPANY_DOMAIN="company.local"

# 1. 快速PKI设置
quick_pki_setup() {
    echo "快速PKI设置..."
    
    mkdir -p /etc/openvpn/remote-work/{pki,configs,scripts,logs}
    cd /etc/openvpn/remote-work/pki
    
    # 使用预设参数快速生成CA
    cat > vars << EOF
set_var EASYRSA_REQ_COUNTRY    "CN"
set_var EASYRSA_REQ_PROVINCE   "Beijing"
set_var EASYRSA_REQ_CITY       "Beijing"
set_var EASYRSA_REQ_ORG        "Company Remote Work"
set_var EASYRSA_REQ_EMAIL      "admin@company.com"
set_var EASYRSA_REQ_OU         "IT Department"
set_var EASYRSA_KEY_SIZE       2048
set_var EASYRSA_ALGO           rsa
set_var EASYRSA_CA_EXPIRE      3650
set_var EASYRSA_CERT_EXPIRE    365
EOF

    source vars
    /usr/share/easy-rsa/easyrsa init-pki
    echo "RemoteWorkCA" | /usr/share/easy-rsa/easyrsa build-ca nopass
    /usr/share/easy-rsa/easyrsa build-server-full remote-work-server nopass
    /usr/share/easy-rsa/easyrsa gen-dh
    openvpn --genkey --secret ta.key
    
    echo "PKI设置完成"
}

# 2. 服务器配置优化
setup_optimized_server() {
    echo "配置优化的服务器..."
    
    cat > /etc/openvpn/remote-work/server.conf << EOF
# 远程办公OpenVPN服务器配置
port 1194
proto udp
dev tun

# 证书配置
ca /etc/openvpn/remote-work/pki/pki/ca.crt
cert /etc/openvpn/remote-work/pki/pki/issued/remote-work-server.crt
key /etc/openvpn/remote-work/pki/pki/private/remote-work-server.key
dh /etc/openvpn/remote-work/pki/pki/dh.pem
tls-auth /etc/openvpn/remote-work/pki/ta.key 0

# 网络配置
server 10.10.0.0 255.255.0.0
ifconfig-pool-persist /var/log/openvpn/remote-work-ipp.txt

# 推送路由和DNS
push "route $COMPANY_NETWORK 255.255.0.0"
push "dhcp-option DNS 192.168.1.10"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DOMAIN $COMPANY_DOMAIN"

# 安全配置
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

# 性能优化(远程办公特化)
max-clients $EMPLOYEE_COUNT
keepalive 10 120
comp-lzo adaptive
fast-io
tcp-nodelay

# 带宽优化
sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"

# 连接优化
connect-retry-max 3
connect-retry 5
resolv-retry infinite

# 日志配置
status /var/log/openvpn/remote-work-status.log 10
log-append /var/log/openvpn/remote-work.log
verb 3
mute 20

# 管理接口
management 127.0.0.1 7506

# 用户脚本
script-security 2
client-connect /etc/openvpn/remote-work/scripts/client-connect.sh
client-disconnect /etc/openvpn/remote-work/scripts/client-disconnect.sh

# 安全设置
user nobody
group nogroup
persist-key
persist-tun

# 重复连接处理
duplicate-cn
EOF

    echo "服务器配置完成"
}

# 3. 批量生成员工证书
generate_employee_certificates() {
    echo "批量生成员工证书..."
    
    cd /etc/openvpn/remote-work/pki
    
    # 从员工列表文件生成证书
    if [ -f "/etc/openvpn/remote-work/employee_list.txt" ]; then
        while IFS= read -r employee; do
            if [ -n "$employee" ]; then
                echo "生成证书: $employee"
                /usr/share/easy-rsa/easyrsa build-client-full "$employee" nopass
            fi
        done < "/etc/openvpn/remote-work/employee_list.txt"
    else
        # 示例:生成测试用户证书
        for i in $(seq 1 10); do
            username="employee$(printf "%03d" $i)"
            echo "生成测试证书: $username"
            /usr/share/easy-rsa/easyrsa build-client-full "$username" nopass
        done
    fi
    
    echo "员工证书生成完成"
}

# 4. 自动化配置生成
auto_generate_client_configs() {
    echo "自动生成客户端配置..."
    
    mkdir -p /etc/openvpn/remote-work/configs/clients
    
    # 创建配置生成脚本
    cat > /etc/openvpn/remote-work/scripts/generate_client_config.sh << 'EOF'
#!/bin/bash
# generate_client_config.sh - 自动生成客户端配置

CLIENT_NAME="$1"
SERVER_IP="$2"
BASE_DIR="/etc/openvpn/remote-work"
CONFIG_DIR="$BASE_DIR/configs/clients"

if [ -z "$CLIENT_NAME" ] || [ -z "$SERVER_IP" ]; then
    echo "用法: $0 <客户端名称> <服务器IP>"
    exit 1
fi

# 检查证书是否存在
if [ ! -f "$BASE_DIR/pki/pki/issued/$CLIENT_NAME.crt" ]; then
    echo "错误: 客户端证书不存在: $CLIENT_NAME"
    exit 1
fi

# 生成客户端配置文件
cat > "$CONFIG_DIR/$CLIENT_NAME.ovpn" << OVPN
# 远程办公VPN配置 - $CLIENT_NAME
client
dev tun
proto udp

# 服务器配置
remote $SERVER_IP 1194
resolv-retry infinite
nobind

# 安全配置
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
key-direction 1

# 连接优化
keepalive 10 120
comp-lzo adaptive
verb 3
mute 20

# 性能优化
sndbuf 393216
rcvbuf 393216
fast-io
tcp-nodelay

# 证书内容
<ca>
$(cat $BASE_DIR/pki/pki/ca.crt)
</ca>

<cert>
$(cat $BASE_DIR/pki/pki/issued/$CLIENT_NAME.crt)
</cert>

<key>
$(cat $BASE_DIR/pki/pki/private/$CLIENT_NAME.key)
</key>

<tls-auth>
$(cat $BASE_DIR/pki/ta.key)
</tls-auth>
OVPN

echo "客户端配置已生成: $CONFIG_DIR/$CLIENT_NAME.ovpn"
EOF

    chmod +x /etc/openvpn/remote-work/scripts/generate_client_config.sh
    
    # 为所有员工生成配置
    if [ -f "/etc/openvpn/remote-work/employee_list.txt" ]; then
        while IFS= read -r employee; do
            if [ -n "$employee" ]; then
                /etc/openvpn/remote-work/scripts/generate_client_config.sh "$employee" "$SERVER_IP"
            fi
        done < "/etc/openvpn/remote-work/employee_list.txt"
    else
        # 生成测试配置
        for i in $(seq 1 10); do
            username="employee$(printf "%03d" $i)"
            /etc/openvpn/remote-work/scripts/generate_client_config.sh "$username" "$SERVER_IP"
        done
    fi
    
    echo "客户端配置生成完成"
}

# 5. 创建用户管理系统
setup_user_management() {
    echo "设置用户管理系统..."
    
    cat > /etc/openvpn/remote-work/scripts/user_manager.sh << 'EOF'
#!/bin/bash
# user_manager.sh - 用户管理脚本

BASE_DIR="/etc/openvpn/remote-work"
PKI_DIR="$BASE_DIR/pki"
CONFIG_DIR="$BASE_DIR/configs/clients"
SERVER_IP="203.0.113.20"  # 根据实际情况修改

# 添加用户
add_user() {
    local username="$1"
    
    if [ -z "$username" ]; then
        echo "用法: $0 add <用户名>"
        return 1
    fi
    
    echo "添加用户: $username"
    
    cd "$PKI_DIR"
    
    # 生成证书
    /usr/share/easy-rsa/easyrsa build-client-full "$username" nopass
    
    # 生成配置文件
    "$BASE_DIR/scripts/generate_client_config.sh" "$username" "$SERVER_IP"
    
    echo "用户 $username 添加完成"
    echo "配置文件: $CONFIG_DIR/$username.ovpn"
}

# 删除用户
revoke_user() {
    local username="$1"
    
    if [ -z "$username" ]; then
        echo "用法: $0 revoke <用户名>"
        return 1
    fi
    
    echo "撤销用户: $username"
    
    cd "$PKI_DIR"
    
    # 撤销证书
    /usr/share/easy-rsa/easyrsa revoke "$username"
    /usr/share/easy-rsa/easyrsa gen-crl
    
    # 删除配置文件
    rm -f "$CONFIG_DIR/$username.ovpn"
    
    # 更新CRL
    cp "$PKI_DIR/pki/crl.pem" "/etc/openvpn/remote-work/crl.pem"
    
    echo "用户 $username 已撤销"
}

# 列出用户
list_users() {
    echo "当前用户列表:"
    ls "$CONFIG_DIR"/*.ovpn 2>/dev/null | sed 's/.*\///;s/\.ovpn$//' | sort
}

# 显示用户状态
show_status() {
    echo "VPN服务状态:"
    systemctl status openvpn@remote-work --no-pager
    
    echo ""
    echo "当前连接:"
    if [ -f "/var/log/openvpn/remote-work-status.log" ]; then
        grep "^CLIENT_LIST" "/var/log/openvpn/remote-work-status.log" | \
        awk -F',' '{print $2 " (" $3 ")"}' | sort
    fi
}

# 主函数
case "$1" in
    add)
        add_user "$2"
        ;;
    revoke)
        revoke_user "$2"
        ;;
    list)
        list_users
        ;;
    status)
        show_status
        ;;
    *)
        echo "用法: $0 {add|revoke|list|status} [用户名]"
        echo "示例:"
        echo "  $0 add john.doe"
        echo "  $0 revoke john.doe"
        echo "  $0 list"
        echo "  $0 status"
        exit 1
        ;;
esac
EOF

    chmod +x /etc/openvpn/remote-work/scripts/user_manager.sh
    
    echo "用户管理系统设置完成"
}

# 6. 创建监控和报告系统
setup_monitoring_reports() {
    echo "设置监控和报告系统..."
    
    cat > /etc/openvpn/remote-work/scripts/daily_report.sh << 'EOF'
#!/bin/bash
# daily_report.sh - 每日使用报告

REPORT_DATE=$(date '+%Y-%m-%d')
REPORT_FILE="/etc/openvpn/remote-work/logs/daily_report_$REPORT_DATE.txt"
STATUS_FILE="/var/log/openvpn/remote-work-status.log"
LOG_FILE="/var/log/openvpn/remote-work.log"

# 生成每日报告
generate_daily_report() {
    {
        echo "远程办公VPN每日报告"
        echo "日期: $REPORT_DATE"
        echo "========================="
        echo ""
        
        # 服务状态
        echo "服务状态:"
        if systemctl is-active --quiet openvpn@remote-work; then
            echo "✓ OpenVPN服务正常运行"
        else
            echo "✗ OpenVPN服务异常"
        fi
        echo ""
        
        # 连接统计
        echo "连接统计:"
        if [ -f "$STATUS_FILE" ]; then
            total_connections=$(grep "^CLIENT_LIST" "$STATUS_FILE" | wc -l)
            echo "当前连接数: $total_connections"
            
            echo "连接详情:"
            grep "^CLIENT_LIST" "$STATUS_FILE" | \
            awk -F',' '{printf "  %-20s %s\n", $2, $3}'
        else
            echo "无连接状态文件"
        fi
        echo ""
        
        # 今日连接活动
        echo "今日连接活动:"
        if [ -f "$LOG_FILE" ]; then
            today_connections=$(grep "$(date '+%Y-%m-%d')" "$LOG_FILE" | grep "Peer Connection Initiated" | wc -l)
            echo "新建连接: $today_connections"
            
            echo "连接用户:"
            grep "$(date '+%Y-%m-%d')" "$LOG_FILE" | \
            grep "Peer Connection Initiated" | \
            awk '{print $NF}' | sort | uniq -c | sort -nr
        fi
        echo ""
        
        # 系统资源
        echo "系统资源使用:"
        echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}')"
        echo "内存: $(free -h | grep Mem | awk '{print $3 "/" $2}')"
        echo "磁盘: $(df -h / | tail -1 | awk '{print $3 "/" $2 " (" $5 ")"}')"
        echo ""
        
        # 网络流量
        echo "网络流量统计:"
        if [ -f "$STATUS_FILE" ]; then
            total_bytes_in=$(grep "^CLIENT_LIST" "$STATUS_FILE" | awk -F',' '{sum+=$6} END {print sum}')
            total_bytes_out=$(grep "^CLIENT_LIST" "$STATUS_FILE" | awk -F',' '{sum+=$7} END {print sum}')
            
            echo "总接收: $(numfmt --to=iec ${total_bytes_in:-0})"
            echo "总发送: $(numfmt --to=iec ${total_bytes_out:-0})"
        fi
        
    } > "$REPORT_FILE"
    
    echo "每日报告已生成: $REPORT_FILE"
}

# 发送报告邮件(可选)
send_report_email() {
    local email="admin@company.com"
    
    if command -v mail >/dev/null 2>&1; then
        mail -s "远程办公VPN每日报告 - $REPORT_DATE" "$email" < "$REPORT_FILE"
        echo "报告已发送至: $email"
    fi
}

generate_daily_report
# send_report_email  # 取消注释以启用邮件发送
EOF

    chmod +x /etc/openvpn/remote-work/scripts/daily_report.sh
    
    # 设置每日报告定时任务
    echo "0 8 * * * /etc/openvpn/remote-work/scripts/daily_report.sh" | crontab -
    
    echo "监控和报告系统设置完成"
}

# 7. 创建客户端安装包
create_client_packages() {
    echo "创建客户端安装包..."
    
    mkdir -p /etc/openvpn/remote-work/packages/{windows,macos,linux,android,ios}
    
    # Windows安装包脚本
    cat > /etc/openvpn/remote-work/packages/windows/install.bat << 'EOF'
@echo off
echo 安装远程办公VPN客户端...

REM 检查管理员权限
net session >nul 2>&1
if %errorLevel% == 0 (
    echo 检测到管理员权限,继续安装...
) else (
    echo 错误: 需要管理员权限运行此脚本
    pause
    exit /b 1
)

REM 下载OpenVPN客户端
echo 下载OpenVPN客户端...
powershell -Command "Invoke-WebRequest -Uri 'https://swupdate.openvpn.org/community/releases/OpenVPN-2.5.8-I601-amd64.msi' -OutFile 'OpenVPN-Install.msi'"

REM 安装OpenVPN
echo 安装OpenVPN...
msiexec /i OpenVPN-Install.msi /quiet /norestart

REM 复制配置文件
echo 安装VPN配置...
copy "%~dp0*.ovpn" "C:\Program Files\OpenVPN\config\"

echo 安装完成!
echo 请在系统托盘中找到OpenVPN图标,右键选择配置文件连接。
pause
EOF

    # Linux安装脚本
    cat > /etc/openvpn/remote-work/packages/linux/install.sh << 'EOF'
#!/bin/bash
echo "安装远程办公VPN客户端..."

# 检查root权限
if [ "$EUID" -ne 0 ]; then
    echo "错误: 需要root权限运行此脚本"
    exit 1
fi

# 检测发行版
if [ -f /etc/debian_version ]; then
    # Debian/Ubuntu
    apt update
    apt install -y openvpn
elif [ -f /etc/redhat-release ]; then
    # RHEL/CentOS/Fedora
    if command -v dnf >/dev/null 2>&1; then
        dnf install -y openvpn
    else
        yum install -y openvpn
    fi
else
    echo "不支持的Linux发行版"
    exit 1
fi

# 复制配置文件
cp *.ovpn /etc/openvpn/client/

echo "安装完成!"
echo "使用命令连接VPN: sudo openvpn --config /etc/openvpn/client/your-config.ovpn"
EOF

    chmod +x /etc/openvpn/remote-work/packages/linux/install.sh
    
    # 创建说明文档
    cat > /etc/openvpn/remote-work/packages/README.txt << 'EOF'
远程办公VPN客户端安装指南

=== Windows ===
1. 下载并解压客户端包
2. 以管理员身份运行 install.bat
3. 在系统托盘找到OpenVPN图标
4. 右键选择配置文件连接

=== macOS ===
1. 下载并安装 Tunnelblick
2. 双击 .ovpn 配置文件
3. 在Tunnelblick中连接

=== Linux ===
1. 运行 sudo ./install.sh
2. 使用命令连接: sudo openvpn --config your-config.ovpn

=== Android ===
1. 安装 OpenVPN Connect 应用
2. 导入 .ovpn 配置文件
3. 点击连接

=== iOS ===
1. 安装 OpenVPN Connect 应用
2. 通过邮件或云存储导入配置文件
3. 点击连接

=== 技术支持 ===
如有问题,请联系IT部门:
邮箱: it-support@company.com
电话: 400-123-4567
EOF

    echo "客户端安装包创建完成"
}

# 8. 启动服务并测试
start_and_test() {
    echo "启动服务并进行测试..."
    
    # 复制配置文件
    cp /etc/openvpn/remote-work/server.conf /etc/openvpn/remote-work.conf
    
    # 启动服务
    systemctl enable openvpn@remote-work
    systemctl start openvpn@remote-work
    
    # 等待服务启动
    sleep 5
    
    # 检查服务状态
    if systemctl is-active --quiet openvpn@remote-work; then
        echo "✓ OpenVPN服务启动成功"
    else
        echo "✗ OpenVPN服务启动失败"
        systemctl status openvpn@remote-work
        return 1
    fi
    
    # 检查端口监听
    if netstat -ulnp | grep -q ":1194"; then
        echo "✓ 端口1194监听正常"
    else
        echo "✗ 端口1194未监听"
        return 1
    fi
    
    echo "服务启动和测试完成"
}

# 9. 生成部署总结
generate_summary() {
    echo "生成部署总结..."
    
    SUMMARY_FILE="/etc/openvpn/remote-work/deployment_summary_$(date '+%Y%m%d_%H%M%S').txt"
    
    cat > "$SUMMARY_FILE" << EOF
远程办公VPN快速部署总结
$(date '+%Y-%m-%d %H:%M:%S')

=== 部署信息 ===
服务器IP: $SERVER_IP
支持员工数: $EMPLOYEE_COUNT
VPN网络: $VPN_NETWORK
公司网络: $COMPANY_NETWORK
公司域名: $COMPANY_DOMAIN

=== 部署组件 ===
✓ PKI证书系统
✓ 优化服务器配置
✓ 员工证书批量生成
✓ 客户端配置自动化
✓ 用户管理系统
✓ 监控报告系统
✓ 客户端安装包
✓ 服务启动测试

=== 管理工具 ===
用户管理: /etc/openvpn/remote-work/scripts/user_manager.sh
每日报告: /etc/openvpn/remote-work/scripts/daily_report.sh
配置生成: /etc/openvpn/remote-work/scripts/generate_client_config.sh

=== 常用命令 ===
添加用户: ./user_manager.sh add username
撤销用户: ./user_manager.sh revoke username
查看状态: ./user_manager.sh status
生成报告: ./daily_report.sh

=== 文件位置 ===
服务器配置: /etc/openvpn/remote-work.conf
客户端配置: /etc/openvpn/remote-work/configs/clients/
安装包: /etc/openvpn/remote-work/packages/
日志文件: /var/log/openvpn/remote-work.log
状态文件: /var/log/openvpn/remote-work-status.log

=== 下一步操作 ===
1. 准备员工列表文件
2. 批量生成员工证书和配置
3. 分发客户端安装包
4. 培训员工使用VPN
5. 监控系统运行状态

=== 安全提醒 ===
1. 定期更新系统和OpenVPN
2. 监控异常连接活动
3. 定期备份配置和证书
4. 及时撤销离职员工证书
5. 审查访问日志

=== 性能优化建议 ===
1. 根据实际使用情况调整max-clients
2. 监控服务器资源使用
3. 考虑负载均衡(如需要)
4. 优化网络带宽分配
5. 定期清理日志文件
EOF

    echo "部署总结已生成: $SUMMARY_FILE"
}

# 执行快速部署
echo "开始远程办公VPN快速部署..."

quick_pki_setup
setup_optimized_server
generate_employee_certificates
auto_generate_client_configs
setup_user_management
setup_monitoring_reports
create_client_packages
start_and_test
generate_summary

echo "远程办公VPN快速部署完成!"
echo "部署时间: $(date)"
echo "请查看部署总结文件了解详细信息。"

15.3 云服务提供商VPN集成

15.3.1 AWS VPC集成案例

场景描述: 某企业需要将本地网络与AWS VPC安全连接,实现混合云架构。

#!/bin/bash
# aws_vpc_integration.sh - AWS VPC集成部署

echo "===== AWS VPC OpenVPN集成部署 ====="

# AWS配置参数
AWS_REGION="us-west-2"
VPC_CIDR="10.0.0.0/16"
PUBLIC_SUBNET_CIDR="10.0.1.0/24"
PRIVATE_SUBNET_CIDR="10.0.2.0/24"
ON_PREMISE_CIDR="192.168.0.0/16"
VPN_INSTANCE_TYPE="t3.medium"
KEY_PAIR_NAME="openvpn-key"

# 1. 创建AWS基础设施
setup_aws_infrastructure() {
    echo "创建AWS基础设施..."
    
    # 创建CloudFormation模板
    cat > aws-openvpn-infrastructure.yaml << 'EOF'
AWSTemplateFormatVersion: '2010-09-09'
Description: 'OpenVPN Server Infrastructure on AWS'

Parameters:
  VpcCidr:
    Type: String
    Default: '10.0.0.0/16'
    Description: CIDR block for VPC
  
  PublicSubnetCidr:
    Type: String
    Default: '10.0.1.0/24'
    Description: CIDR block for public subnet
  
  PrivateSubnetCidr:
    Type: String
    Default: '10.0.2.0/24'
    Description: CIDR block for private subnet
  
  InstanceType:
    Type: String
    Default: 't3.medium'
    Description: EC2 instance type for OpenVPN server
  
  KeyPairName:
    Type: String
    Description: EC2 Key Pair name

Resources:
  # VPC
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCidr
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: OpenVPN-VPC
  
  # Internet Gateway
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: OpenVPN-IGW
  
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  
  # Public Subnet
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PublicSubnetCidr
      AvailabilityZone: !Select [0, !GetAZs '']
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: OpenVPN-Public-Subnet
  
  # Private Subnet
  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PrivateSubnetCidr
      AvailabilityZone: !Select [1, !GetAZs '']
      Tags:
        - Key: Name
          Value: OpenVPN-Private-Subnet
  
  # Route Tables
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: OpenVPN-Public-RT
  
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: '0.0.0.0/0'
      GatewayId: !Ref InternetGateway
  
  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable
  
  # Security Groups
  OpenVPNSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for OpenVPN server
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: udp
          FromPort: 1194
          ToPort: 1194
          CidrIp: '0.0.0.0/0'
          Description: OpenVPN UDP
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: '0.0.0.0/0'
          Description: SSH
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: '0.0.0.0/0'
          Description: HTTPS
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: '0.0.0.0/0'
      Tags:
        - Key: Name
          Value: OpenVPN-SG
  
  # IAM Role for OpenVPN instance
  OpenVPNRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
      Policies:
        - PolicyName: OpenVPNPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - ec2:DescribeInstances
                  - ec2:DescribeRouteTables
                  - ec2:CreateRoute
                  - ec2:DeleteRoute
                  - ec2:ReplaceRoute
                Resource: '*'
  
  OpenVPNInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref OpenVPNRole
  
  # OpenVPN EC2 Instance
  OpenVPNInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0c02fb55956c7d316  # Amazon Linux 2 AMI (update as needed)
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyPairName
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !Ref OpenVPNSecurityGroup
      IamInstanceProfile: !Ref OpenVPNInstanceProfile
      SourceDestCheck: false
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          yum update -y
          yum install -y openvpn easy-rsa
          
          # Enable IP forwarding
          echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
          sysctl -p
          
          # Install CloudWatch agent
          wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
          rpm -U ./amazon-cloudwatch-agent.rpm
          
          # Signal completion
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource OpenVPNInstance --region ${AWS::Region}
      Tags:
        - Key: Name
          Value: OpenVPN-Server
    CreationPolicy:
      ResourceSignal:
        Timeout: PT10M

Outputs:
  VPCId:
    Description: VPC ID
    Value: !Ref VPC
    Export:
      Name: !Sub '${AWS::StackName}-VPC-ID'
  
  OpenVPNInstanceId:
    Description: OpenVPN Instance ID
    Value: !Ref OpenVPNInstance
    Export:
      Name: !Sub '${AWS::StackName}-Instance-ID'
  
  OpenVPNPublicIP:
    Description: OpenVPN Server Public IP
    Value: !GetAtt OpenVPNInstance.PublicIp
    Export:
      Name: !Sub '${AWS::StackName}-Public-IP'
  
  OpenVPNPrivateIP:
    Description: OpenVPN Server Private IP
    Value: !GetAtt OpenVPNInstance.PrivateIp
    Export:
      Name: !Sub '${AWS::StackName}-Private-IP'
EOF

    # 部署CloudFormation堆栈
    echo "部署CloudFormation堆栈..."
    aws cloudformation create-stack \
        --stack-name openvpn-infrastructure \
        --template-body file://aws-openvpn-infrastructure.yaml \
        --parameters ParameterKey=VpcCidr,ParameterValue=$VPC_CIDR \
                     ParameterKey=PublicSubnetCidr,ParameterValue=$PUBLIC_SUBNET_CIDR \
                     ParameterKey=PrivateSubnetCidr,ParameterValue=$PRIVATE_SUBNET_CIDR \
                     ParameterKey=InstanceType,ParameterValue=$VPN_INSTANCE_TYPE \
                     ParameterKey=KeyPairName,ParameterValue=$KEY_PAIR_NAME \
        --capabilities CAPABILITY_IAM \
        --region $AWS_REGION
    
    echo "等待堆栈创建完成..."
    aws cloudformation wait stack-create-complete \
        --stack-name openvpn-infrastructure \
        --region $AWS_REGION
    
    echo "AWS基础设施创建完成"
}

# 2. 获取AWS资源信息
get_aws_resources() {
    echo "获取AWS资源信息..."
    
    # 获取实例信息
    INSTANCE_ID=$(aws cloudformation describe-stacks \
        --stack-name openvpn-infrastructure \
        --region $AWS_REGION \
        --query 'Stacks[0].Outputs[?OutputKey==`OpenVPNInstanceId`].OutputValue' \
        --output text)
    
    PUBLIC_IP=$(aws cloudformation describe-stacks \
        --stack-name openvpn-infrastructure \
        --region $AWS_REGION \
        --query 'Stacks[0].Outputs[?OutputKey==`OpenVPNPublicIP`].OutputValue' \
        --output text)
    
    PRIVATE_IP=$(aws cloudformation describe-stacks \
        --stack-name openvpn-infrastructure \
        --region $AWS_REGION \
        --query 'Stacks[0].Outputs[?OutputKey==`OpenVPNPrivateIP`].OutputValue' \
        --output text)
    
    VPC_ID=$(aws cloudformation describe-stacks \
        --stack-name openvpn-infrastructure \
        --region $AWS_REGION \
        --query 'Stacks[0].Outputs[?OutputKey==`VPCId`].OutputValue' \
        --output text)
    
    echo "实例ID: $INSTANCE_ID"
    echo "公网IP: $PUBLIC_IP"
    echo "私网IP: $PRIVATE_IP"
    echo "VPC ID: $VPC_ID"
}

# 3. 配置OpenVPN服务器
configure_openvpn_server() {
    echo "配置OpenVPN服务器..."
    
    # 创建配置脚本
    cat > configure_server.sh << 'EOF'
#!/bin/bash
# 在AWS EC2实例上配置OpenVPN

echo "配置OpenVPN服务器..."

# 创建目录结构
mkdir -p /etc/openvpn/aws/{server,client,pki,scripts,logs}

# 设置PKI
cd /etc/openvpn/aws/pki
cp -r /usr/share/easy-rsa/* .

# 初始化PKI
./easyrsa init-pki
echo "AWS-OpenVPN-CA" | ./easyrsa build-ca nopass
./easyrsa build-server-full aws-openvpn-server nopass
./easyrsa gen-dh
openvpn --genkey --secret ta.key

# 创建服务器配置
cat > /etc/openvpn/aws/server/server.conf << SERVERCONF
# AWS OpenVPN服务器配置
port 1194
proto udp
dev tun

# 证书配置
ca /etc/openvpn/aws/pki/pki/ca.crt
cert /etc/openvpn/aws/pki/pki/issued/aws-openvpn-server.crt
key /etc/openvpn/aws/pki/pki/private/aws-openvpn-server.key
dh /etc/openvpn/aws/pki/pki/dh.pem
tls-auth /etc/openvpn/aws/pki/ta.key 0

# 网络配置
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt

# 推送AWS VPC路由
push "route 10.0.0.0 255.255.0.0"
push "dhcp-option DNS 10.0.0.2"

# 安全配置
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

# 性能配置
max-clients 100
keepalive 10 120
comp-lzo adaptive
fast-io

# 日志配置
status /var/log/openvpn/aws-status.log
log-append /var/log/openvpn/aws.log
verb 3
mute 20

# 管理接口
management 127.0.0.1 7507

# 脚本配置
script-security 2
client-connect /etc/openvpn/aws/scripts/client-connect.sh
client-disconnect /etc/openvpn/aws/scripts/client-disconnect.sh

# 用户权限
user nobody
group nobody
persist-key
persist-tun
SERVERCONF

# 创建客户端连接脚本
cat > /etc/openvpn/aws/scripts/client-connect.sh << 'CLIENTCONNECT'
#!/bin/bash
# AWS OpenVPN客户端连接处理

CLIENT_CN="$X509_0_CN"
CLIENT_IP="$ifconfig_pool_remote_ip"
CONNECT_TIME=$(date '+%Y-%m-%d %H:%M:%S')

# 记录连接到CloudWatch
aws logs put-log-events \
    --log-group-name "/aws/openvpn/connections" \
    --log-stream-name "$(hostname)" \
    --log-events timestamp=$(date +%s000),message="$CONNECT_TIME: $CLIENT_CN ($CLIENT_IP) connected" \
    --region us-west-2 2>/dev/null || true

# 本地日志
echo "$CONNECT_TIME: $CLIENT_CN ($CLIENT_IP) connected" >> /var/log/openvpn/connections.log

exit 0
CLIENTCONNECT

# 创建客户端断开脚本
cat > /etc/openvpn/aws/scripts/client-disconnect.sh << 'CLIENTDISCONNECT'
#!/bin/bash
# AWS OpenVPN客户端断开处理

CLIENT_CN="$X509_0_CN"
CLIENT_IP="$ifconfig_pool_remote_ip"
BYTES_RECEIVED="$bytes_received"
BYTES_SENT="$bytes_sent"
DISCONNECT_TIME=$(date '+%Y-%m-%d %H:%M:%S')

# 记录断开到CloudWatch
aws logs put-log-events \
    --log-group-name "/aws/openvpn/connections" \
    --log-stream-name "$(hostname)" \
    --log-events timestamp=$(date +%s000),message="$DISCONNECT_TIME: $CLIENT_CN ($CLIENT_IP) disconnected - RX: $BYTES_RECEIVED, TX: $BYTES_SENT" \
    --region us-west-2 2>/dev/null || true

# 本地日志
echo "$DISCONNECT_TIME: $CLIENT_CN ($CLIENT_IP) disconnected - RX: $BYTES_RECEIVED, TX: $BYTES_SENT" >> /var/log/openvpn/connections.log

exit 0
CLIENTDISCONNECT

chmod +x /etc/openvpn/aws/scripts/*.sh

# 复制配置文件
cp /etc/openvpn/aws/server/server.conf /etc/openvpn/server.conf

# 启动服务
systemctl enable openvpn@server
systemctl start openvpn@server

echo "OpenVPN服务器配置完成"
EOF

    # 上传并执行配置脚本
    scp -i ~/.ssh/$KEY_PAIR_NAME.pem configure_server.sh ec2-user@$PUBLIC_IP:/tmp/
    ssh -i ~/.ssh/$KEY_PAIR_NAME.pem ec2-user@$PUBLIC_IP "sudo bash /tmp/configure_server.sh"
    
    echo "OpenVPN服务器配置完成"
}

# 4. 配置AWS路由
setup_aws_routing() {
    echo "配置AWS路由..."
    
    # 获取路由表ID
    ROUTE_TABLE_ID=$(aws ec2 describe-route-tables \
        --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=OpenVPN-Public-RT" \
        --region $AWS_REGION \
        --query 'RouteTables[0].RouteTableId' \
        --output text)
    
    # 添加本地网络路由
    aws ec2 create-route \
        --route-table-id $ROUTE_TABLE_ID \
        --destination-cidr-block $ON_PREMISE_CIDR \
        --instance-id $INSTANCE_ID \
        --region $AWS_REGION
    
    echo "AWS路由配置完成"
}

# 5. 创建CloudWatch监控
setup_cloudwatch_monitoring() {
    echo "设置CloudWatch监控..."
    
    # 创建日志组
    aws logs create-log-group \
        --log-group-name "/aws/openvpn/connections" \
        --region $AWS_REGION 2>/dev/null || true
    
    aws logs create-log-group \
        --log-group-name "/aws/openvpn/server" \
        --region $AWS_REGION 2>/dev/null || true
    
    # 创建CloudWatch仪表板
    cat > cloudwatch-dashboard.json << 'EOF'
{
    "widgets": [
        {
            "type": "metric",
            "x": 0,
            "y": 0,
            "width": 12,
            "height": 6,
            "properties": {
                "metrics": [
                    [ "AWS/EC2", "CPUUtilization", "InstanceId", "INSTANCE_ID" ],
                    [ ".", "NetworkIn", ".", "." ],
                    [ ".", "NetworkOut", ".", "." ]
                ],
                "period": 300,
                "stat": "Average",
                "region": "us-west-2",
                "title": "OpenVPN服务器性能"
            }
        },
        {
            "type": "log",
            "x": 0,
            "y": 6,
            "width": 24,
            "height": 6,
            "properties": {
                "query": "SOURCE '/aws/openvpn/connections' | fields @timestamp, @message\n| sort @timestamp desc\n| limit 20",
                "region": "us-west-2",
                "title": "VPN连接日志"
            }
        }
    ]
}
EOF
    
    # 替换实例ID
    sed -i "s/INSTANCE_ID/$INSTANCE_ID/g" cloudwatch-dashboard.json
    
    # 创建仪表板
    aws cloudwatch put-dashboard \
        --dashboard-name "OpenVPN-Monitoring" \
        --dashboard-body file://cloudwatch-dashboard.json \
        --region $AWS_REGION
    
    echo "CloudWatch监控设置完成"
}

# 6. 生成客户端配置
generate_client_configs() {
    echo "生成客户端配置..."
    
    # 下载证书文件
    mkdir -p ./aws-client-configs
    
    scp -i ~/.ssh/$KEY_PAIR_NAME.pem ec2-user@$PUBLIC_IP:/etc/openvpn/aws/pki/pki/ca.crt ./aws-client-configs/
    scp -i ~/.ssh/$KEY_PAIR_NAME.pem ec2-user@$PUBLIC_IP:/etc/openvpn/aws/pki/ta.key ./aws-client-configs/
    
    # 在服务器上生成客户端证书
    ssh -i ~/.ssh/$KEY_PAIR_NAME.pem ec2-user@$PUBLIC_IP "sudo /etc/openvpn/aws/pki/easyrsa build-client-full client1 nopass"
    
    # 下载客户端证书
    scp -i ~/.ssh/$KEY_PAIR_NAME.pem ec2-user@$PUBLIC_IP:/etc/openvpn/aws/pki/pki/issued/client1.crt ./aws-client-configs/
    scp -i ~/.ssh/$KEY_PAIR_NAME.pem ec2-user@$PUBLIC_IP:/etc/openvpn/aws/pki/pki/private/client1.key ./aws-client-configs/
    
    # 生成客户端配置文件
    cat > ./aws-client-configs/client1.ovpn << EOF
# AWS VPC OpenVPN客户端配置
client
dev tun
proto udp

# 服务器配置
remote $PUBLIC_IP 1194
resolv-retry infinite
nobind

# 安全配置
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
key-direction 1

# 连接配置
keepalive 10 120
comp-lzo adaptive
verb 3
mute 20

# 证书内容
<ca>
$(cat ./aws-client-configs/ca.crt)
</ca>

<cert>
$(cat ./aws-client-configs/client1.crt)
</cert>

<key>
$(cat ./aws-client-configs/client1.key)
</key>

<tls-auth>
$(cat ./aws-client-configs/ta.key)
</tls-auth>
EOF
    
    echo "客户端配置已生成: ./aws-client-configs/client1.ovpn"
}

# 执行AWS VPC集成部署
echo "开始AWS VPC OpenVPN集成部署..."

setup_aws_infrastructure
get_aws_resources
configure_openvpn_server
setup_aws_routing
setup_cloudwatch_monitoring
generate_client_configs

echo "AWS VPC OpenVPN集成部署完成!"
echo "服务器公网IP: $PUBLIC_IP"
echo "客户端配置文件: ./aws-client-configs/client1.ovpn"
echo "CloudWatch仪表板: https://console.aws.amazon.com/cloudwatch/home?region=$AWS_REGION#dashboards:name=OpenVPN-Monitoring"

15.4 性能优化案例分析

15.4.1 高并发场景优化

场景描述: 某游戏公司需要为全球玩家提供低延迟VPN服务,支持10000+并发连接。

#!/bin/bash
# high_performance_openvpn.sh - 高性能OpenVPN优化

echo "===== 高性能OpenVPN优化部署 ====="

# 性能参数
MAX_CLIENTS=10000
SERVER_THREADS=8
VPN_NETWORK="10.0.0.0/8"
MTU_SIZE=1500
BUFFER_SIZE=1048576

# 1. 系统级优化
system_optimization() {
    echo "执行系统级优化..."
    
    # 内核参数优化
    cat >> /etc/sysctl.conf << 'EOF'
# OpenVPN高性能优化

# 网络缓冲区优化
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 5000

# TCP优化
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_slow_start_after_idle = 0

# UDP优化
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192

# 连接跟踪优化
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_tcp_timeout_established = 7200

# 文件描述符限制
fs.file-max = 1000000

# 进程限制
kernel.pid_max = 4194304
EOF

    # 应用内核参数
    sysctl -p
    
    # 设置系统限制
    cat >> /etc/security/limits.conf << 'EOF'
# OpenVPN性能优化
* soft nofile 1000000
* hard nofile 1000000
* soft nproc 1000000
* hard nproc 1000000
EOF

    # 设置systemd限制
    mkdir -p /etc/systemd/system/openvpn@.service.d
    cat > /etc/systemd/system/openvpn@.service.d/override.conf << 'EOF'
[Service]
LimitNOFILE=1000000
LimitNPROC=1000000
EOF

    systemctl daemon-reload
    
    echo "系统级优化完成"
}

# 2. OpenVPN服务器优化配置
optimized_server_config() {
    echo "创建优化的服务器配置..."
    
    mkdir -p /etc/openvpn/high-performance/{server,client,pki,scripts,logs}
    
    cat > /etc/openvpn/high-performance/server/server.conf << EOF
# 高性能OpenVPN服务器配置
port 1194
proto udp
dev tun

# 证书配置(需要预先生成)
ca /etc/openvpn/high-performance/pki/ca.crt
cert /etc/openvpn/high-performance/pki/server.crt
key /etc/openvpn/high-performance/pki/server.key
dh /etc/openvpn/high-performance/pki/dh.pem
tls-auth /etc/openvpn/high-performance/pki/ta.key 0

# 网络配置
server $VPN_NETWORK 255.0.0.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
topology subnet

# 性能优化配置
max-clients $MAX_CLIENTS
max-routes-per-client 1000

# 多线程支持
management 127.0.0.1 7508
management-client-auth
management-client-pf

# 网络优化
mtu-disc yes
mssfix $MTU_SIZE
tun-mtu $MTU_SIZE
fragment $MTU_SIZE

# 缓冲区优化
sndbuf $BUFFER_SIZE
rcvbuf $BUFFER_SIZE
push "sndbuf $BUFFER_SIZE"
push "rcvbuf $BUFFER_SIZE"

# 连接优化
keepalive 10 60
ping-timer-rem
fast-io
tcp-nodelay

# 压缩优化(根据CPU情况选择)
# comp-lzo adaptive
# compress lz4-v2
# push "compress lz4-v2"

# 安全配置
cipher AES-128-GCM  # 使用AES-128以提高性能
auth SHA256
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256

# 日志优化
status /var/log/openvpn/high-performance-status.log 30
log-append /var/log/openvpn/high-performance.log
verb 2  # 降低日志级别以提高性能
mute 20

# 脚本优化
script-security 2
client-connect /etc/openvpn/high-performance/scripts/client-connect-fast.sh
client-disconnect /etc/openvpn/high-performance/scripts/client-disconnect-fast.sh

# 用户权限
user nobody
group nobody
persist-key
persist-tun

# 重复连接处理
duplicate-cn

# 客户端配置推送
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
EOF

    echo "优化服务器配置创建完成"
}

# 3. 创建高性能脚本
create_performance_scripts() {
    echo "创建高性能脚本..."
    
    # 快速客户端连接脚本
    cat > /etc/openvpn/high-performance/scripts/client-connect-fast.sh << 'EOF'
#!/bin/bash
# 高性能客户端连接处理

# 最小化处理以提高性能
CLIENT_CN="$X509_0_CN"
CLIENT_IP="$ifconfig_pool_remote_ip"

# 异步记录日志
{
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $CLIENT_CN ($CLIENT_IP) connected" >> /var/log/openvpn/connections-fast.log
} &

exit 0
EOF

    # 快速客户端断开脚本
    cat > /etc/openvpn/high-performance/scripts/client-disconnect-fast.sh << 'EOF'
#!/bin/bash
# 高性能客户端断开处理

# 最小化处理以提高性能
CLIENT_CN="$X509_0_CN"
CLIENT_IP="$ifconfig_pool_remote_ip"
BYTES_RECEIVED="$bytes_received"
BYTES_SENT="$bytes_sent"

# 异步记录日志
{
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $CLIENT_CN ($CLIENT_IP) disconnected - RX: $BYTES_RECEIVED, TX: $BYTES_SENT" >> /var/log/openvpn/connections-fast.log
} &

exit 0
EOF

    chmod +x /etc/openvpn/high-performance/scripts/*.sh
    
    echo "高性能脚本创建完成"
}

# 4. 网络接口优化
network_interface_optimization() {
    echo "优化网络接口..."
    
    # 获取主网络接口
    MAIN_INTERFACE=$(ip route | grep default | awk '{print $5}' | head -1)
    
    # 网络接口优化脚本
    cat > /etc/openvpn/high-performance/scripts/optimize-network.sh << EOF
#!/bin/bash
# 网络接口优化

# 优化主网络接口
ethtool -G $MAIN_INTERFACE rx 4096 tx 4096 2>/dev/null || true
ethtool -K $MAIN_INTERFACE gso on gro on tso on 2>/dev/null || true

# 优化TUN接口(在OpenVPN启动后执行)
sleep 5
TUN_INTERFACE=\$(ip link show | grep tun | head -1 | awk '{print \$2}' | cut -d: -f1)
if [ -n "\$TUN_INTERFACE" ]; then
    ip link set \$TUN_INTERFACE mtu $MTU_SIZE
    ip link set \$TUN_INTERFACE txqueuelen 1000
fi

echo "网络接口优化完成"
EOF

    chmod +x /etc/openvpn/high-performance/scripts/optimize-network.sh
    
    echo "网络接口优化脚本创建完成"
}

# 5. 监控和性能测试
performance_monitoring() {
    echo "设置性能监控..."
    
    cat > /etc/openvpn/high-performance/scripts/performance-monitor.sh << 'EOF'
#!/bin/bash
# 性能监控脚本

MONITOR_LOG="/var/log/openvpn/performance-monitor.log"
STATUS_FILE="/var/log/openvpn/high-performance-status.log"

# 获取当前连接数
get_connection_count() {
    if [ -f "$STATUS_FILE" ]; then
        grep "^CLIENT_LIST" "$STATUS_FILE" | wc -l
    else
        echo "0"
    fi
}

# 获取系统资源使用
get_system_resources() {
    local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    local mem_usage=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')
    local load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | cut -d',' -f1)
    
    echo "CPU: ${cpu_usage}%, Memory: ${mem_usage}%, Load: ${load_avg}"
}

# 获取网络统计
get_network_stats() {
    local interface=$(ip route | grep default | awk '{print $5}' | head -1)
    local rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes)
    local tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes)
    
    echo "RX: $(numfmt --to=iec $rx_bytes), TX: $(numfmt --to=iec $tx_bytes)"
}

# 生成性能报告
generate_performance_report() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    local connections=$(get_connection_count)
    local resources=$(get_system_resources)
    local network=$(get_network_stats)
    
    echo "$timestamp | Connections: $connections | $resources | $network" >> "$MONITOR_LOG"
}

# 检查性能阈值
check_performance_thresholds() {
    local connections=$(get_connection_count)
    local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    
    # 连接数警告
    if [ $connections -gt 8000 ]; then
        echo "警告: 连接数过高 ($connections)" | logger -t openvpn-monitor
    fi
    
    # CPU使用率警告
    if (( $(echo "$cpu_usage > 80" | bc -l) )); then
        echo "警告: CPU使用率过高 (${cpu_usage}%)" | logger -t openvpn-monitor
    fi
}

# 执行监控
generate_performance_report
check_performance_thresholds
EOF

    chmod +x /etc/openvpn/high-performance/scripts/performance-monitor.sh
    
    # 设置定时监控
    echo "*/1 * * * * /etc/openvpn/high-performance/scripts/performance-monitor.sh" | crontab -
    
    echo "性能监控设置完成"
}

# 6. 负载均衡配置
load_balancing_setup() {
    echo "设置负载均衡..."
    
    cat > /etc/openvpn/high-performance/scripts/load-balancer.sh << 'EOF'
#!/bin/bash
# OpenVPN负载均衡脚本

# 服务器列表
SERVERS=(
    "server1.company.com:1194"
    "server2.company.com:1194"
    "server3.company.com:1194"
)

# 生成负载均衡客户端配置
generate_lb_config() {
    local client_name="$1"
    
    cat > "/etc/openvpn/high-performance/client/${client_name}-lb.ovpn" << LBCONFIG
# 负载均衡OpenVPN客户端配置
client
dev tun
proto udp

# 多服务器配置(自动负载均衡)
LBCONFIG

    # 添加所有服务器
    for server in "${SERVERS[@]}"; do
        echo "remote $server" >> "/etc/openvpn/high-performance/client/${client_name}-lb.ovpn"
    done
    
    cat >> "/etc/openvpn/high-performance/client/${client_name}-lb.ovpn" << 'LBCONFIG'
remote-random
resolv-retry infinite
nobind

# 安全配置
cipher AES-128-GCM
auth SHA256
tls-version-min 1.2
key-direction 1

# 性能配置
keepalive 10 60
fast-io
tcp-nodelay
sndbuf 1048576
rcvbuf 1048576

# 日志配置
verb 2
mute 20

# 证书配置(需要添加实际证书内容)
# <ca>...</ca>
# <cert>...</cert>
# <key>...</key>
# <tls-auth>...</tls-auth>
LBCONFIG

    echo "负载均衡配置已生成: ${client_name}-lb.ovpn"
}

# 健康检查
health_check() {
    for server in "${SERVERS[@]}"; do
        local host=$(echo $server | cut -d: -f1)
        local port=$(echo $server | cut -d: -f2)
        
        if timeout 5 bash -c "</dev/tcp/$host/$port"; then
            echo "✓ $server 健康"
        else
            echo "✗ $server 不可用"
        fi
    done
}

# 执行操作
case "$1" in
    generate)
        generate_lb_config "$2"
        ;;
    health)
        health_check
        ;;
    *)
        echo "用法: $0 {generate|health} [客户端名称]"
        exit 1
        ;;
esac
EOF

    chmod +x /etc/openvpn/high-performance/scripts/load-balancer.sh
    
    echo "负载均衡配置完成"
}

# 执行高性能优化部署
echo "开始高性能OpenVPN优化部署..."

system_optimization
optimized_server_config
create_performance_scripts
network_interface_optimization
performance_monitoring
load_balancing_setup

echo "高性能OpenVPN优化部署完成!"
echo "最大客户端数: $MAX_CLIENTS"
echo "缓冲区大小: $BUFFER_SIZE 字节"
echo "MTU大小: $MTU_SIZE 字节"
echo "性能监控: 每分钟执行一次"

15.5 安全加固案例分析

15.5.1 金融级安全部署

场景描述: 某银行需要部署符合金融监管要求的VPN系统,要求最高级别的安全性。

#!/bin/bash
# financial_grade_security.sh - 金融级安全OpenVPN部署

echo "===== 金融级安全OpenVPN部署 ====="

# 安全参数
KEY_SIZE=4096
CA_EXPIRE=1825  # 5年
CERT_EXPIRE=365  # 1年
CRL_DAYS=30
AUDIT_LOG_RETENTION=2555  # 7年

# 1. 增强PKI安全
enhanced_pki_security() {
    echo "设置增强PKI安全..."
    
    mkdir -p /etc/openvpn/financial/{pki,audit,backup,scripts}
    cd /etc/openvpn/financial/pki
    
    # 使用硬件安全模块(HSM)配置(模拟)
    cat > vars << EOF
set_var EASYRSA_REQ_COUNTRY    "CN"
set_var EASYRSA_REQ_PROVINCE   "Beijing"
set_var EASYRSA_REQ_CITY       "Beijing"
set_var EASYRSA_REQ_ORG        "Financial Institution"
set_var EASYRSA_REQ_EMAIL      "security@bank.com"
set_var EASYRSA_REQ_OU         "Information Security"
set_var EASYRSA_KEY_SIZE       $KEY_SIZE
set_var EASYRSA_ALGO           rsa
set_var EASYRSA_CA_EXPIRE      $CA_EXPIRE
set_var EASYRSA_CERT_EXPIRE    $CERT_EXPIRE
set_var EASYRSA_CRL_DAYS       $CRL_DAYS
set_var EASYRSA_DIGEST         sha512
EOF

    source vars
    /usr/share/easy-rsa/easyrsa init-pki
    
    # 生成强密码保护的CA
    echo "FinancialSecureCA2024" | /usr/share/easy-rsa/easyrsa build-ca
    
    # 生成服务器证书
    /usr/share/easy-rsa/easyrsa build-server-full financial-vpn-server
    
    # 生成强DH参数
    /usr/share/easy-rsa/easyrsa gen-dh
    
    # 生成TLS-Crypt密钥(更安全)
    openvpn --genkey --secret tls-crypt.key
    
    # 生成初始CRL
    /usr/share/easy-rsa/easyrsa gen-crl
    
    echo "增强PKI安全设置完成"
}

# 2. 创建安全强化配置
security_hardened_config() {
    echo "创建安全强化配置..."
    
    cat > /etc/openvpn/financial/server.conf << 'EOF'
# 金融级安全OpenVPN服务器配置
port 1194
proto udp
dev tun

# 证书配置
ca /etc/openvpn/financial/pki/pki/ca.crt
cert /etc/openvpn/financial/pki/pki/issued/financial-vpn-server.crt
key /etc/openvpn/financial/pki/pki/private/financial-vpn-server.key
dh /etc/openvpn/financial/pki/pki/dh.pem

# 使用tls-crypt替代tls-auth(更安全)
tls-crypt /etc/openvpn/financial/pki/tls-crypt.key

# CRL配置
crl-verify /etc/openvpn/financial/pki/pki/crl.pem

# 网络配置
server 10.200.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/financial-ipp.txt
topology subnet

# 最高安全级别加密
cipher AES-256-GCM
auth SHA512
tls-version-min 1.3
tls-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

# 完美前向保密
tls-crypt-v2 /etc/openvpn/financial/pki/tls-crypt-v2.key
ecdh-curve secp384r1

# 连接安全
max-clients 100
keepalive 10 120
ping-timer-rem
remote-cert-tls client
verify-client-cert require

# 审计和日志
status /var/log/openvpn/financial-status.log 10
log-append /var/log/openvpn/financial.log
verb 4
mute 5

# 管理接口(仅本地)
management 127.0.0.1 7509 /etc/openvpn/financial/management.pwd
management-client-auth

# 安全脚本
script-security 2
client-connect /etc/openvpn/financial/scripts/client-connect-audit.sh
client-disconnect /etc/openvpn/financial/scripts/client-disconnect-audit.sh
tls-verify /etc/openvpn/financial/scripts/tls-verify.sh

# 用户权限
user openvpn
group openvpn
persist-key
persist-tun

# 禁用重复连接
# duplicate-cn  # 金融级安全不允许重复连接

# 客户端配置推送
push "dhcp-option DNS 10.200.0.1"
push "dhcp-option DOMAIN bank.internal"
push "route 192.168.0.0 255.255.0.0"

# 安全选项
remote-cert-eku "TLS Web Client Authentication"
ns-cert-type client
EOF

    echo "安全强化配置创建完成"
}

# 3. 创建审计脚本
create_audit_scripts() {
    echo "创建审计脚本..."
    
    # 客户端连接审计
    cat > /etc/openvpn/financial/scripts/client-connect-audit.sh << 'EOF'
#!/bin/bash
# 金融级客户端连接审计

CLIENT_CN="$X509_0_CN"
CLIENT_IP="$ifconfig_pool_remote_ip"
REMOTE_IP="$trusted_ip"
REMOTE_PORT="$trusted_port"
CONNECT_TIME=$(date '+%Y-%m-%d %H:%M:%S')
SESSION_ID=$(uuidgen)

# 详细审计日志
AUDIT_LOG="/var/log/openvpn/financial-audit.log"

# 记录连接事件
echo "$CONNECT_TIME|CONNECT|$SESSION_ID|$CLIENT_CN|$CLIENT_IP|$REMOTE_IP:$REMOTE_PORT|$(date +%s)" >> "$AUDIT_LOG"

# 发送安全事件到SIEM
curl -X POST "https://siem.bank.com/api/events" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $SIEM_TOKEN" \
     -d "{
         \"event_type\": \"vpn_connect\",
         \"timestamp\": \"$CONNECT_TIME\",
         \"session_id\": \"$SESSION_ID\",
         \"client_cn\": \"$CLIENT_CN\",
         \"client_ip\": \"$CLIENT_IP\",
         \"remote_ip\": \"$REMOTE_IP\",
         \"remote_port\": \"$REMOTE_PORT\"
     }" 2>/dev/null || true

# 实时监控告警
if [[ "$REMOTE_IP" =~ ^(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.) ]]; then
    echo "警告: 内网IP连接 - $CLIENT_CN from $REMOTE_IP" | logger -p auth.warning -t openvpn-security
fi

# 地理位置检查(需要GeoIP数据库)
COUNTRY=$(geoiplookup "$REMOTE_IP" 2>/dev/null | cut -d: -f2 | cut -d, -f1 | xargs)
if [ "$COUNTRY" != "China" ] && [ -n "$COUNTRY" ]; then
    echo "警告: 海外连接 - $CLIENT_CN from $COUNTRY ($REMOTE_IP)" | logger -p auth.warning -t openvpn-security
fi

exit 0
EOF

    # 客户端断开审计
    cat > /etc/openvpn/financial/scripts/client-disconnect-audit.sh << 'EOF'
#!/bin/bash
# 金融级客户端断开审计

CLIENT_CN="$X509_0_CN"
CLIENT_IP="$ifconfig_pool_remote_ip"
BYTES_RECEIVED="$bytes_received"
BYTES_SENT="$bytes_sent"
DISCONNECT_TIME=$(date '+%Y-%m-%d %H:%M:%S')
SESSION_DURATION="$time_duration"

# 审计日志
AUDIT_LOG="/var/log/openvpn/financial-audit.log"

# 记录断开事件
echo "$DISCONNECT_TIME|DISCONNECT|$CLIENT_CN|$CLIENT_IP|$BYTES_RECEIVED|$BYTES_SENT|$SESSION_DURATION|$(date +%s)" >> "$AUDIT_LOG"

# 发送断开事件到SIEM
curl -X POST "https://siem.bank.com/api/events" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $SIEM_TOKEN" \
     -d "{
         \"event_type\": \"vpn_disconnect\",
         \"timestamp\": \"$DISCONNECT_TIME\",
         \"client_cn\": \"$CLIENT_CN\",
         \"client_ip\": \"$CLIENT_IP\",
         \"bytes_received\": $BYTES_RECEIVED,
         \"bytes_sent\": $BYTES_SENT,
         \"session_duration\": $SESSION_DURATION
     }" 2>/dev/null || true

exit 0
EOF

    # TLS验证脚本
    cat > /etc/openvpn/financial/scripts/tls-verify.sh << 'EOF'
#!/bin/bash
# TLS证书验证脚本

CERT_DEPTH="$1"
CERT_SUBJECT="$2"

# 记录证书验证
echo "$(date '+%Y-%m-%d %H:%M:%S')|TLS_VERIFY|Depth:$CERT_DEPTH|Subject:$CERT_SUBJECT" >> /var/log/openvpn/financial-audit.log

# 检查证书黑名单
BLACKLIST_FILE="/etc/openvpn/financial/cert-blacklist.txt"
if [ -f "$BLACKLIST_FILE" ]; then
    if grep -q "$CERT_SUBJECT" "$BLACKLIST_FILE"; then
        echo "证书在黑名单中: $CERT_SUBJECT" | logger -p auth.error -t openvpn-security
        exit 1
    fi
fi

# 检查证书有效期
CERT_FILE="$3"
if [ -n "$CERT_FILE" ] && [ -f "$CERT_FILE" ]; then
    EXPIRY_DATE=$(openssl x509 -in "$CERT_FILE" -noout -enddate | cut -d= -f2)
    EXPIRY_TIMESTAMP=$(date -d "$EXPIRY_DATE" +%s)
    CURRENT_TIMESTAMP=$(date +%s)
    DAYS_TO_EXPIRY=$(( (EXPIRY_TIMESTAMP - CURRENT_TIMESTAMP) / 86400 ))
    
    if [ $DAYS_TO_EXPIRY -lt 30 ]; then
        echo "证书即将过期: $CERT_SUBJECT (${DAYS_TO_EXPIRY}天)" | logger -p auth.warning -t openvpn-security
    fi
fi

exit 0
EOF

    chmod +x /etc/openvpn/financial/scripts/*.sh
    
    echo "审计脚本创建完成"
}

# 4. 设置日志轮转和保留
setup_log_management() {
    echo "设置日志管理..."
    
    # 创建logrotate配置
    cat > /etc/logrotate.d/openvpn-financial << EOF
/var/log/openvpn/financial*.log {
    daily
    rotate $AUDIT_LOG_RETENTION
    compress
    delaycompress
    missingok
    notifempty
    create 640 openvpn openvpn
    postrotate
        systemctl reload openvpn@financial
    endscript
}
EOF

    # 创建审计日志备份脚本
    cat > /etc/openvpn/financial/scripts/backup-audit-logs.sh << 'EOF'
#!/bin/bash
# 审计日志备份脚本

BACKUP_DIR="/backup/openvpn-audit"
DATE=$(date '+%Y%m%d')
LOG_DIR="/var/log/openvpn"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 备份审计日志
tar -czf "$BACKUP_DIR/financial-audit-$DATE.tar.gz" \
    "$LOG_DIR/financial-audit.log"* \
    "$LOG_DIR/financial.log"* \
    "$LOG_DIR/financial-status.log"*

# 加密备份文件
gpg --cipher-algo AES256 --compress-algo 1 --s2k-mode 3 \
    --s2k-digest-algo SHA512 --s2k-count 65536 --symmetric \
    --output "$BACKUP_DIR/financial-audit-$DATE.tar.gz.gpg" \
    "$BACKUP_DIR/financial-audit-$DATE.tar.gz"

# 删除未加密备份
rm -f "$BACKUP_DIR/financial-audit-$DATE.tar.gz"

# 上传到安全存储(示例)
# aws s3 cp "$BACKUP_DIR/financial-audit-$DATE.tar.gz.gpg" \
#     s3://bank-audit-logs/openvpn/ --sse AES256

echo "审计日志备份完成: financial-audit-$DATE.tar.gz.gpg"
EOF

    chmod +x /etc/openvpn/financial/scripts/backup-audit-logs.sh
    
    # 设置每日备份
    echo "0 2 * * * /etc/openvpn/financial/scripts/backup-audit-logs.sh" | crontab -
    
    echo "日志管理设置完成"
}

# 5. 创建合规报告
create_compliance_reporting() {
    echo "创建合规报告系统..."
    
    cat > /etc/openvpn/financial/scripts/compliance-report.sh << 'EOF'
#!/bin/bash
# 合规报告生成脚本

REPORT_DATE=$(date '+%Y-%m-%d')
REPORT_FILE="/etc/openvpn/financial/reports/compliance-report-$REPORT_DATE.txt"
AUDIT_LOG="/var/log/openvpn/financial-audit.log"

mkdir -p /etc/openvpn/financial/reports

# 生成合规报告
{
    echo "金融级VPN合规报告"
    echo "生成日期: $REPORT_DATE"
    echo "报告期间: $(date -d '1 month ago' '+%Y-%m-%d') 至 $REPORT_DATE"
    echo "======================================"
    echo ""
    
    echo "1. 连接统计"
    echo "总连接次数: $(grep '|CONNECT|' "$AUDIT_LOG" | wc -l)"
    echo "唯一用户数: $(grep '|CONNECT|' "$AUDIT_LOG" | cut -d'|' -f4 | sort -u | wc -l)"
    echo "平均会话时长: $(grep '|DISCONNECT|' "$AUDIT_LOG" | cut -d'|' -f7 | awk '{sum+=$1; count++} END {if(count>0) printf "%.2f分钟", sum/count/60; else print "N/A"}')"
    echo ""
    
    echo "2. 安全事件"
    echo "海外连接警告: $(grep 'openvpn-security.*海外连接' /var/log/syslog | wc -l)"
    echo "内网连接警告: $(grep 'openvpn-security.*内网IP连接' /var/log/syslog | wc -l)"
    echo "证书过期警告: $(grep 'openvpn-security.*证书即将过期' /var/log/syslog | wc -l)"
    echo ""
    
    echo "3. 用户活动TOP10"
    grep '|CONNECT|' "$AUDIT_LOG" | cut -d'|' -f4 | sort | uniq -c | sort -nr | head -10
    echo ""
    
    echo "4. 连接来源分析"
    grep '|CONNECT|' "$AUDIT_LOG" | cut -d'|' -f6 | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
    echo ""
    
    echo "5. 数据传输统计"
    echo "总接收数据: $(grep '|DISCONNECT|' "$AUDIT_LOG" | cut -d'|' -f5 | awk '{sum+=$1} END {printf "%.2f GB", sum/1024/1024/1024}')"
    echo "总发送数据: $(grep '|DISCONNECT|' "$AUDIT_LOG" | cut -d'|' -f6 | awk '{sum+=$1} END {printf "%.2f GB", sum/1024/1024/1024}')"
    echo ""
    
    echo "6. 合规检查"
    echo "✓ 所有连接已记录审计日志"
    echo "✓ 使用最高级别加密算法"
    echo "✓ 启用完美前向保密"
    echo "✓ 证书有效期监控"
    echo "✓ 审计日志加密备份"
    echo "✓ 访问控制和身份验证"
    
} > "$REPORT_FILE"

echo "合规报告已生成: $REPORT_FILE"

# 发送报告邮件
# mail -s "VPN合规报告 - $REPORT_DATE" compliance@bank.com < "$REPORT_FILE"
EOF

    chmod +x /etc/openvpn/financial/scripts/compliance-report.sh
    
    # 设置月度报告
    echo "0 9 1 * * /etc/openvpn/financial/scripts/compliance-report.sh" | crontab -
    
    echo "合规报告系统创建完成"
}

# 执行金融级安全部署
echo "开始金融级安全OpenVPN部署..."

enhanced_pki_security
security_hardened_config
create_audit_scripts
setup_log_management
create_compliance_reporting

echo "金融级安全OpenVPN部署完成!"
echo "密钥长度: $KEY_SIZE 位"
echo "CA有效期: $CA_EXPIRE 天"
echo "证书有效期: $CERT_EXPIRE 天"
echo "审计日志保留: $AUDIT_LOG_RETENTION 天"
echo "加密算法: AES-256-GCM + SHA512"
echo "TLS版本: 1.3+"

15.6 本章总结

15.6.1 项目实战要点

通过本章的实战案例分析,我们学习了OpenVPN在不同场景下的部署和优化策略:

1. 企业级部署特点: - 大规模用户支持(1000+并发) - 高可用性设计 - 集中化管理 - 完善的监控体系 - 自动化运维

2. 远程办公解决方案: - 快速部署能力 - 多平台支持 - 简化用户体验 - 性能优化 - 用户管理自动化

3. 云服务集成: - 基础设施即代码 - 云原生监控 - 弹性扩展 - 成本优化 - 安全合规

4. 性能优化策略: - 系统级调优 - 网络优化 - 负载均衡 - 监控告警 - 容量规划

5. 安全加固措施: - 增强加密算法 - 完善审计体系 - 合规性保障 - 威胁检测 - 事件响应

15.6.2 最佳实践总结

部署前准备: - 需求分析和容量规划 - 网络架构设计 - 安全策略制定 - 运维流程规划

实施过程: - 分阶段部署 - 充分测试验证 - 文档化配置 - 培训相关人员

运维管理: - 持续监控 - 定期备份 - 安全更新 - 性能调优 - 故障处理

安全保障: - 多层防护 - 访问控制 - 审计跟踪 - 合规检查 - 应急响应

15.6.3 发展趋势

技术发展方向: - 云原生架构 - 零信任网络 - AI/ML增强 - 量子安全 - 边缘计算

应用场景扩展: - 混合云连接 - IoT设备接入 - 移动办公 - 跨境业务 - 合规要求

通过这些实战案例的学习,读者应该能够根据具体需求选择合适的部署方案,并在实际项目中应用OpenVPN技术解决网络连接和安全问题。