IPSec VPN隧道的工作原理与协议栈
IPSec(Internet Protocol Security)是在网络层实现加密通信的协议族,由AH(认证头)、ESP(封装安全载荷)和IKE(密钥交换)三个核心协议构成。现代部署几乎都使用ESP协议,因为AH只提供认证不提供加密,而ESP同时支持加密和认证。
IKE协议分两个阶段协商安全参数。IKE Phase 1建立ISAKMP SA,用于保护后续的协商通信;IKE Phase 2建立IPSec SA,定义实际数据流的加密和认证策略。两个阶段的分离设计使得密钥更新不需要重新执行完整的身份认证流程。
StrongSwan是Linux平台最成熟的IPSec实现,支持IKEv1和IKEv2,内置完整的x509证书管理和EAP认证扩展。在站点间VPN场景中,IKEv2是首选协议,握手流程更简洁,NAT穿透能力更强。
StrongSwan安装与基础配置
在Ubuntu 22.04/24.04上安装StrongSwan:
apt update && apt install -y strongswan strongswan-pki libcharon-extra-plugins
StrongSwan的配置文件分为两部分:ipsec.conf定义连接参数,ipsec.secrets存放预共享密钥或证书私钥。swanctl是新版配置工具,用swanctl.conf替代传统的ipsec.conf,配置结构更清晰,但两者功能等价。
以两个站点为例:站点A的内网为10.0.1.0/24,公网IP为1.1.1.1;站点B的内网为10.0.2.0/24,公网IP为2.2.2.2。
站点A的ipsec.conf配置:
config setup
charondebug="ike 2, cfg 2, net 2"
uniqueids=no
conn site-a-to-b
keyexchange=ikev2
authby=psk
left=1.1.1.1
leftsubnet=10.0.1.0/24
right=2.2.2.2
rightsubnet=10.0.2.0/24
ike=aes256gcm16-sha384-ecp384
esp=aes256gcm16-sha384-ecp384
keyingtries=%forever
auto=start
dpdaction=restart
dpddelay=30s
站点B的配置将left和right互换,leftsubnet和rightsubnet对应调换。对称配置确保两端都能主动发起连接。
ipsec.secrets文件存放预共享密钥:
# 站点A的secrets
1.1.1.1 2.2.2.2 : PSK "YourStrongPskKey_Here_ReplaceMe2026"
密钥文件权限必须收紧:
chmod 600 /etc/ipsec.secrets
chown root:root /etc/ipsec.secrets
防火墙规则与NAT穿透配置
IPSec流量需要放行UDP 500(IKE)、UDP 4500(NAT-T)和ESP协议(协议号50)。iptables规则:
# 放行IPSec相关流量
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
# 放行解密后的内网流量
iptables -A FORWARD -s 10.0.1.0/24 -d 10.0.2.0/24 -j ACCEPT
iptables -A FORWARD -s 10.0.2.0/24 -d 10.0.1.0/24 -j ACCEPT
# NAT豁免:内网互访流量不做SNAT
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -d 10.0.2.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
NAT豁免规则必须放在MASQUERADE规则之前。如果缺少这条规则,内网流量会被SNAT改写源地址,导致回程流量无法匹配IPSec策略,隧道建立成功但数据不通。
证书认证方式部署
PSK方式适合少量站点,大规模部署应切换到x509证书认证。用StrongSwan自带的pki工具生成CA和终端证书:
# 生成CA证书
pki --gen --type rsa --size 4096 --outform pem > ca.key
pki --self --ca --type rsa --in ca.key \
--dn "C=CN, O=MyOrg, CN=VPN CA" \
--lifetime 3650 --outform pem > ca.crt
# 生成站点A证书
pki --gen --type rsa --size 2048 --outform pem > siteA.key
pki --req --type rsa --in siteA.key \
--dn "C=CN, O=MyOrg, CN=1.1.1.1" \
--outform pem > siteA.req
pki --issue --cacert ca.crt --cakey ca.key \
--type rsa --in siteA.req \
--san 1.1.1.1 --lifetime 1825 > siteA.crt
证书方式下ipsec.conf的authby改为rsa-sig,ipsec.secrets改为引用私钥文件:
# 证书认证secrets
: RSA siteA.key
隧道状态监控与故障排查
StrongSwan提供ipsec statusall和swanctl -l两个命令查看隧道状态。swanctl输出更结构化,推荐使用。
# 查看活跃隧道
ipsec statusall
# 查看SA详情
swanctl -l
# 实时日志
journalctl -u strongswan-starter -f
常见故障模式:隧道显示ESTABLISHED但ping不通对端内网,大概率是NAT规则未正确配置或策略路由冲突。用tcpdump抓ESP封装和解封装前后的包:
# 抓外网接口的ESP包
tcpdump -n -i eth0 esp or udp port 500 or udp port 4500
# 抓内网接口的明文流量
tcpdump -n -i eth1 net 10.0.2.0/24
如果外网接口有ESP包进出但内网接口没有明文流量,检查IPSec策略路由和xfrm状态:
ip xfrm state
ip xfrm policy
ip route get 10.0.2.1 from 10.0.1.1
StrongSwan的DPD(Dead Peer Detection)配置为30秒检测间隔,连续3次无响应后自动重启隧道。在弱网环境下dpddelay可调大至60秒,避免误触发重连。生产环境建议配合Prometheus的strongswan-exporter做指标采集,在Grafana中设置隧道断连告警。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ipsecvpn-sui-dao-pei-zhi-yu-strongswan-zhan/