实用脚本能批量IPSec吗?

wen 实用脚本 65

本文目录导读:

实用脚本能批量IPSec吗?

  1. 方案一:Linux (strongSwan) 批量生成连接配置
  2. 方案二:批量对接不同厂商设备(配置文件生成器)
  3. 方案三:批量重启/重连 IPSec 隧道(运维脚本)
  4. 方案四:Windows PowerShell 批量管理 L2TP/IPSec
  5. 建议的选择路径

能批量管理 IPSec 配置,但需要根据你的具体场景(是路由器/防火墙Linux 服务器,还是 Windows?)选择不同的脚本方式。

以下针对最常见的 Linux (strongSwan)Cisco/华为 网络设备 提供实用脚本方案。

Linux (strongSwan) 批量生成连接配置

如果需要在 Linux 服务器上批量创建多个 IPSec 连接(例如连接到多个分支机构),可以使用 Shell 脚本生成 /etc/ipsec.conf 的配置段。

场景: 中心节点需要与 N 个分支节点建立 IPSec 隧道(使用 PSK 预共享密钥)。

实用脚本示例:

#!/bin/bash
# 文件名: batch_ipsec.sh
# 功能: 根据 CSV 文件批量生成 strongSwan 配置
# 定义 CSV 文件格式: 分支名称,对端公网 IP,本端子网,对端子网,预共享密钥
CSV_FILE="site_list.csv"
OUTPUT_CONF="/etc/ipsec.conf.d/batch_sites.conf"
# 清空或创建输出文件
echo "# 自动生成的批量 IPSec 连接配置" > $OUTPUT_CONF
while IFS=',' read -r site_name remote_ip local_subnet remote_subnet psk; do
    # 跳过注释行和空行
    [[ "$site_name" =~ ^#.*$ ]] && continue
    [ -z "$site_name" ] && continue
    # 生成每个站点的配置段
    cat >> $OUTPUT_CONF << EOF
conn $site_name
    left=%defaultroute
    leftsubnet=$local_subnet
    leftid=%any
    right=$remote_ip
    rightsubnet=$remote_subnet
    authby=secret
    type=tunnel
    auto=start
    keyexchange=ikev1
    ike=aes256-sha256-modp2048
    esp=aes256-sha256
EOF
    # 将密钥附加到 ipsec.secrets
    echo "$remote_ip : PSK \"$psk\"" >> /etc/ipsec.secrets
done < $CSV_FILE
echo "配置生成完毕,请运行:"
echo "ipsec rereadsecrets"
echo "ipsec reload"

CSV 示例 (site_list.csv):

# 名称,对端IP,本地网段,远端网段,共享密钥
Beijing,203.0.113.10,10.1.0.0/16,192.168.1.0/24,MySharedKey123
Shanghai,203.0.113.20,10.1.0.0/16,192.168.2.0/24,AnotherKey456
Guangzhou,203.0.113.30,10.1.0.0/16,192.168.3.0/24,Secret789

批量对接不同厂商设备(配置文件生成器)

如果需要对 Cisco 路由器或华为防火墙生成配置,推荐使用 Python + Jinja2 模板

Python 脚本示例:

#!/usr/bin/env python3
# 文件名: multi_vendor_ipsec_gen.py
import csv
from jinja2 import Environment, FileSystemLoader
# 定义供应商模板(支持 Cisco / Huawei / Fortinet)
templates = {
    'cisco': """
crypto ikev2 proposal {{ conn.name }}
 encryption aes-cbc-256
 integrity sha256
 group 14
crypto ikev2 policy {{ conn.name }}
 proposal {{ conn.name }}
crypto ikev2 keyring {{ conn.name }}
 peer {{ conn.peer_ip }}
  address {{ conn.peer_ip }}
  pre-shared-key {{ conn.psk }}
crypto ipsec transform-set {{ conn.name }}-TS esp-aes 256 esp-sha256-hmac
 mode tunnel
crypto map {{ conn.name }}-MAP 10 ipsec-isakmp
 set peer {{ conn.peer_ip }}
 set transform-set {{ conn.name }}-TS
 set pfs group14
 match address 100
""",
    'huawei': """
ipsec proposal {{ conn.name }}
 esp authentication-algorithm sha2-256
 esp encryption-algorithm aes-256
ike proposal {{ conn.name }}
 encryption-algorithm aes-256
 dh group14
 authentication-algorithm sha2-256
ike peer {{ conn.name }}
 undo version 2
 pre-shared-key simple {{ conn.psk }}
 ike-proposal {{ conn.name }}
 remote-address {{ conn.peer_ip }}
ipsec policy-template {{ conn.name }}-template 1
 security acl 3000
 ike-peer {{ conn.name }}
 proposal {{ conn.name }}
"""
}
def generate_config(csv_file, vendor='cisco'):
    env = Environment()
    template = env.from_string(templates.get(vendor, templates['cisco']))
    with open(csv_file, 'r') as f:
        reader = csv.DictReader(f)
        for row in reader:
            config = template.render(conn=row)
            print(f"! ===== 站点: {row['name']} =====")
            print(config)
if __name__ == "__main__":
    # CSV格式: name,peer_ip,psk
    generate_config("peers.csv", vendor='cisco')

批量重启/重连 IPSec 隧道(运维脚本)

如果你已经配置好了所有的 IPSec,但需要批量重连(例如对端重启或密钥更新),可以使用以下脚本:

#!/bin/bash
# 批量断开并重连 strongSwan 连接
# 方法1: 通过连接名称前缀重连
for conn in $(ipsec listconn | grep -E '^[0-9]' | awk '{print $1}'); do
    echo "正在重连: $conn"
    ipsec down $conn 2>/dev/null
    ipsec up $conn
done
# 方法2: 通过状态筛选(只重连 down 状态的隧道)
for conn in $(ipsec status | grep 'down' | awk '{print $2}'); do
    ipsec up $conn
done

Windows PowerShell 批量管理 L2TP/IPSec

如果你管理的是 Windows VPN 连接(使用 L2TP/IPSec),可以使用 PowerShell:

# 批量添加多个 VPN 连接(从CSV导入)
$connections = Import-Csv "vpn_list.csv"
foreach ($conn in $connections) {
    Add-VpnConnection -Name $conn.Name `
        -ServerAddress $conn.ServerIP `
        -TunnelType L2tp `
        -L2tpPsk $conn.PSK `
        -AuthenticationMethod Pap `
        -SplitTunneling $false `
        -Force
    Write-Host "已创建连接: $($conn.Name)"
}

建议的选择路径

你的场景 推荐的脚本类型
Linux 服务器 (strongSwan) 用 Shell 脚本生成 .conf 文件
Cisco/Huawei 设备 用 Python + Jinja2 模板生成 CLI 配置
批量重启/重连 Shell 脚本循环执行 ipsec up/down
Windows VPN 客户端 PowerShell Add-VpnConnection
Palo Alto / Fortinet 使用 API 调用 (Python + requests)

如果你能告诉我:

  1. 你使用的是哪种设备/软件?
  2. 你是要批量建立新的隧道,还是批量运维已有的隧道?

我可以给出更精确的、可直接运行的脚本。

抱歉,评论功能暂时关闭!