本文目录导读:

- 方案一:Linux (strongSwan) 批量生成连接配置
- 方案二:批量对接不同厂商设备(配置文件生成器)
- 方案三:批量重启/重连 IPSec 隧道(运维脚本)
- 方案四:Windows PowerShell 批量管理 L2TP/IPSec
- 建议的选择路径
能批量管理 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) |
如果你能告诉我:
- 你使用的是哪种设备/软件?
- 你是要批量建立新的隧道,还是批量运维已有的隧道?
我可以给出更精确的、可直接运行的脚本。