如何利用 IPsec VPN 技术,在 FortiGate防火墙 与 StrongSwan 开源IPsec工具之间建立稳定且安全的互联互通隧道。IPsec VPN作为一种成熟可靠的加密隧道技术,广泛应用于连接不同的分支机构或云环境,确保跨网络通信的安全。实现两端网络的加密通信。
拓扑概述
在开始配置之前,请确保您对IPsec VPN的基本概念有一定了解。本文的配置基于以下假设:
- FortiGate 端:公网IP为
10.10.20.1,内部网络为192.168.1.0/24。 - StrongSwan 端:公网IP为
10.10.10.1,内部网络为192.168.2.0/24。 - 预共享密钥 (PSK):
qixinlee.com。
我们的目标是建立一个IPsec隧道,使 192.168.1.0/24 和 192.168.2.0/24 两个子网能够相互通信。
StrongSwan配置步骤
StrongSwan是一款功能强大的开源IPsec实现,常用于Linux系统。以下是详细的配置步骤:
1. 系统准备与安装
首先更新系统并安装StrongSwan:
apt update
apt install strongswan -y
2. 启用IP转发
为了让StrongSwan服务器能够转发来自VPN隧道的数据包,您需要启用IPv4转发:
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sysctl -p
运行sysctl -p是为了立即应用配置,无需重启系统。
3. 配置防火墙(UFW)
如果您的StrongSwan服务器启用了UFW防火墙,需要允许IPsec相关的流量通过:
ufw allow 500/udp # IKE(Internet Key Exchange)端口
ufw allow 4500/udp # NAT-T(NAT Traversal)端口
ufw allow proto esp from any to any # 允许ESP协议
ufw allow proto ah from any to any # 允许AH协议(如果使用)
注意: 在调试阶段,您可以临时禁用UFW (ufw disable) 以排除防火墙引起的问题,但在生产环境中务必重新启用并配置正确的规则。
4. 配置预共享密钥
编辑 /etc/ipsec.secrets 文件,添加FortiGate的公网IP、StrongSwan的公网IP和预共享密钥:
vim /etc/ipsec.secrets
10.10.10.1 10.10.20.1 : PSK "qixinlee.com"
重要提示: 密钥应使用强密码,并妥善保管。
5. 配置IPsec连接
编辑 /etc/ipsec.conf 文件,定义IPsec连接的详细参数:
vim /etc/ipsec.conf
config setup
charondebug="ike 2, knl 2, cfg 2, net 2"
conn fortigate-cloud-vpn
auto=start # StrongSwan启动时自动建立连接
keyexchange=ikev2 # 使用IKEv2协议,更安全高效
ike=aes256-sha256-modp2048! # 阶段1加密算法:AES256, 完整性算法:SHA256, DH组:MODP2048 (Group 14)
esp=aes256-sha256! # 阶段2加密算法:AES256, 完整性算法:SHA256
ikelifetime=8h # 阶段1密钥生存周期
lifetime=1h # 阶段2密钥生存周期
dpddelay=30 # DPD检测间隔
dpdtimeout=120 # DPD超时时间
dpdaction=restart # DPD超时后重启隧道
authby=secret # 认证方式为预共享密钥
left=%defaultroute # StrongSwan的本地IP使用默认路由接口IP
leftid=10.10.10.1 # StrongSwan的本地ID,应与FortiGate配置的远端ID匹配
leftsubnet=192.168.2.0/24 # StrongSwan本地网络的子网
right=10.10.20.1 # FortiGate的对端公网IP
rightid=10.10.20.1 # FortiGate的对端ID,应与FortiGate配置的本地ID匹配
rightsubnet=192.168.1.0/24 # FortiGate远程网络的子网
6. 重启IPsec服务并检查状态
保存 ipsec.conf 文件后,重启StrongSwan服务并检查隧道状态:
ipsec down fortigate-cloud-vpn # 如果连接已存在,先关闭
ipsec restart # 重启StrongSwan服务
ipsec up fortigate-cloud-vpn # 尝试建立连接
ipsec status # 查看IPsec隧道状态
您应该能看到隧道建立成功的相关信息。
FortiGate配置步骤
FortiGate防火墙的配置通常通过图形界面完成,以下将列出关键配置项:
1. 网络配置(FortiGate VPN阶段1通用设置)
- IP版本: IPv4
- 远端网关: 静态IP地址,填写StrongSwan的公网IP
10.10.10.1 - 接口: 填写 FortiGate 出口到公网的网卡(例如
wan1) - NAT穿越: 启用
- 保持存活: 10 秒
- 对等体状态探测(DPD): 按需
- DPD重试计数: 4
- DPD重试间隔: 30 秒
2. 认证(FortiGate VPN阶段1认证设置)
- 方法: 预共享密钥
- 预共享密钥:
qixinlee.com - IKE版本: 2
3. VPN阶段1(Phase 1)配置
阶段1定义了ISAKMP(Internet Security Association and Key Management Protocol)的安全参数:
- 加密算法: AES256
- 认证算法: SHA256
- Diffie-Hellman组: 组 14 (与StrongSwan的
modp2048对应) - 密钥生存时间 (秒): 28800 (8小时,与StrongSwan的
ikelifetime对应) - 本地ID:
10.10.20.1(FortiGate的公网IP)。这个ID与StrongSwan的rightid对应。
4. VPN阶段2(Phase 2)配置
阶段2定义了IPsec隧道的安全参数:
- 本地地址: 子网
192.168.1.0/24 - 对端地址: 子网
192.168.2.0/24 - 加密算法: AES256
- 认证算法: SHA256
- Diffie-Hellman组: 组 14 (与StrongSwan的
modp2048对应) - 启用重放检测: 启用
- PFS (Perfect Forward Secrecy): 启用
- 本地端口: 全部
- 对端端口: 全部
- 协议: 全部
- 密钥周期 (秒/kb): 3600 秒 (1小时,与StrongSwan的
lifetime对应)
5. 隧道接口与策略路由
建立IPsec隧道后,您需要配置相应的策略路由和防火墙策略,以允许流量通过隧道:
- 创建IPsec隧道接口: 在FortiGate中,您需要创建一个虚拟IPsec隧道接口,例如
VPN_to_StrongSwan。 - 策略路由:
- FG_to_VPN (FortiGate到VPN):
- 源接口: 内部网络接口 (例如
lan)。 - 源地址:
192.168.1.0/24。 - 目的接口:
VPN_to_StrongSwan隧道接口。 - 目的地址:
192.168.2.0/24。 - 动作: 接受 (ACCEPT)。
- NAT: 不启用 NAT。
- 源接口: 内部网络接口 (例如
- VPN_to_FG (VPN到FortiGate):
- 源接口:
VPN_to_StrongSwan隧道接口。 - 源地址:
192.168.2.0/24。 - 目的接口: 内部网络接口 (例如
lan)。 - 目的地址:
192.168.1.0/24。 - 动作: 接受 (ACCEPT)。
- NAT: 不启用 NAT。
- 源接口:
- FG_to_VPN (FortiGate到VPN):
验证与故障排除
配置完成后,请务必进行验证:
- 检查IPsec状态: 在StrongSwan端运行
ipsec status,在FortiGate端查看VPN监控界面。 - Ping测试: 从StrongSwan内部网络的主机Ping FortiGate内部网络的主机,反之亦然。
- 抓包分析: 如果通信不畅,可以使用
tcpdump(StrongSwan) 或 FortiGate的诊断工具进行抓包分析,查看是否有加密和解密的数据包。 - 日志分析: 检查FortiGate和StrongSwan的系统日志,寻找任何错误或警告信息。StrongSwan的
charondebug参数可以帮助提供详细的IKE日志。
常见问题与排查思路:
- 预共享密钥不匹配: 确保两端的PSK完全一致。
- IKE/ESP参数不匹配: 加密算法、认证算法、DH组、密钥生存周期等参数必须严格一致。
- NAT穿越问题: 如果任何一端位于NAT设备后面,确保端口
500/udp和4500/udp已正确转发。 - 防火墙规则: 确保两端防火墙都允许IPsec流量(UDP 500, UDP 4500, ESP协议)。
- 子网定义错误: 确保
leftsubnet和rightsubnet定义正确,且与实际网络匹配。 - 路由问题: 检查路由表,确保流量被正确地送入IPsec隧道。
发表回复