本文仅用于学习网络使用,科学上网,爱国爱党。
环境
centos 7
strognswan 5.7
证书id假设 1.2.3.4,可另外自定义。与文中的设置有关,务必注意
服务端安装配置
安装 strongswan
方便起见,yum 安装即可。
yum install epel-release
yum install openssl-devel
yum install strongswan
// 注意:服务器端不能安装 strongswan-libipsec 否则客户端连接不上
生成证书
创建 证书生成脚本
vim zhengshu.sh
输入以下内容:
注意脚本中的 1.2.3.4 ,strognswan 配置中须写 1.2.3.4
strongswan pki --gen --outform pem > ca.key.pem
strongswan pki --self --in ca.key.pem --dn "C=CN, O=ITnmg, CN=strongSwan CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
strongswan pki --gen --outform pem > server.key.pem
strongswan pki --pub --in server.key.pem --outform pem > server.pub.pem
strongswan pki --issue --lifetime 1200 --cacert ca.cert.pem --cakey ca.key.pem --in server.pub.pem --dn "C=CN, O=huayu, CN=1.2.3.4" --san="1.2.3.4" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
strongswan pki --gen --outform pem > client.key.pem
strongswan pki --pub --in client.key.pem --outform pem > client.pub.pem
strongswan pki --issue --lifetime 1200 --cacert ca.cert.pem --cakey ca.key.pem --in client.pub.pem --dn "C=CN, O=huayu, CN=1.2.3.4" --outform pem > client.cert.pem
openssl pkcs12 -export -inkey client.key.pem -in client.cert.pem -name "strongSwan Client Cert" -certfile ca.cert.pem -caname "strongSwan CA" -out client.cert.p12
cp -r ca.key.pem /etc/strongswan/ipsec.d/private/
cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r server.key.pem /etc/strongswan/ipsec.d/private/
cp -r client.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r client.key.pem /etc/strongswan/ipsec.d/private/
echo "ok"
授予脚本可执行权限,执行脚本:
chmod +x zhengshu.sh
./zhengshu.sh //遇到输入密码直接按回车即可
修改 strongswan 配置
vim /etc/strongswan/ipsec.conf
#------------------------
config setup
uniqueids=never #允许多个客户端使用同一个证书
conn ipke2
keyexchange=ikev2
ike=aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha256,aes256-sha1,3des-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
left=%defaultroute
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
leftid=1.2.3.4 # 注意这里匹配证书IP,即服务器 IP 地址
right=%any
rightsourceip=10.0.0.0/24
authby=secret
rightsendcert=never
eap_identity=%any
auto=add
修改共享密钥文件
vim /etc/strongswan/ipsec.secret
#----------- 注意前面IP匹配
1.2.3.4 : PSK "love"
设置防火墙
服务端需要开启防火墙,开放4500和500的端口,否则会出现客户端能连接当时无法访问网络的情况
firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="esp" accept'
firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="ah" accept'
firewall-cmd --zone=public --permanent --add-port=500/udp
firewall-cmd --zone=public --permanent --add-port=4500/udp
firewall-cmd --zone=public --permanent --add-service="ipsec"
firewall-cmd --zone=public --permanent --add-masquerade
firewall-cmd --reload
启动服务端 strongswan
systemctl start strongswan
客户端安装配置
安装 strongswan
## 安装依赖
yum install epel-release
yum install openssl-devel
yum install strongswan-libipsec
## 安装strongswan
yum install strongswan
设置服务端证书到客户端
将服务器端生成的 CA 证书 ca.cert.pem 复制到客户端的 /etc/pki/ca-trust/source/anchors,然后在客户端运行
/bin/update-ca-trust
修改共享密钥文件
vim /etc/strongswan/ipsec.secret
#----------- 注意前面IP匹配, 跟服务端一致
1.2.3.4 : PSK "love"
修改客户端配置文件
vim /etc/strongswan/ipsec.conf
#--------------------
config setup
uniqueids=never
conn centos
keyexchange=ikev2
ike=aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha256,aes256-sha1,3des-sha1!
left=%defaultroute
#leftsubnet=172.29.192.0/24
leftid=1.2.3.4 #注意 id
leftsourceip=%any
authby=secret
right=x.xx.xxx.xxx # 服务端IP地址
rightid=1.2.3.4 #注意 id
rightsubnet=0.0.0.0/0 #访问服务器的哪个网络
type=tunnel
auto=add
启动客户端服务和发起连接
systemctl start strongswan
strongswan up centos
连接状态检查
服务器端状态检查
查看strongswan 的 status
strongswan statusall
####------------------- 输出一下内容
Status of IKE charon daemon (strongSwan 5.7.2, Linux 3.10.0-1160.76.1.el7.x86_64, x86_64):
uptime: 3 hours, since Nov 24 14:49:48 2022
malloc: sbrk 1761280, mmap 0, used 607472, free 1153808
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 2
loaded plugins: charon pkcs11 tpm aesni aes des rc2 sha2 sha1 md4 md5 mgf1 random nonce x509 revocation constraints acert pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl gcrypt fips-prf gmp curve25519 chapoly xcbc cmac hmac ctr ccm gcm curl attr kernel-netlink resolve socket-default farp stroke vici updown eap-identity eap-sim eap-aka eap-aka-3gpp eap-aka-3gpp2 eap-md5 eap-gtc eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap xauth-generic xauth-eap xauth-pam xauth-noauth dhcp led duplicheck unity counters
Virtual IP pools (size/online/offline):
10.0.0.0/24: 254/1/0
Listening IP addresses:
172.31.2.175
Connections:
ipke2: 172.31.2.175...%any IKEv2, dpddelay=300s
ipke2: local: [1.2.3.4] uses pre-shared key authentication
ipke2: cert: "C=CN, O=huayu, CN=1.2.3.4"
ipke2: remote: uses pre-shared key authentication
ipke2: child: 0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
Security Associations (1 up, 0 connecting):
ipke2[2]: ESTABLISHED 65 minutes ago, 172.31.2.175[1.2.3.4]...116.62.159.70[1.2.3.4]
ipke2[2]: IKEv2 SPIs: e713bc41e05a4ac2_i cb9cfa2ae8f194fa_r*, rekeying disabled
ipke2[2]: IKE proposal: AES_CBC_256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
ipke2{4}: INSTALLED, TUNNEL, reqid 2, ESP in UDP SPIs: cc2e38be_i f1ff4cf5_o
ipke2{4}: AES_CBC_256/HMAC_SHA2_256_128, 3800069 bytes_i (36115 pkts, 1s ago), 130339967 bytes_o (100594 pkts, 4s ago), rekeying disabled
ipke2{4}: 0.0.0.0/0 === 10.0.0.1/32 ## 特别注意这里,是连接成功的标志
或者 观察日志文件
tail -f /var/log/messages ### 会实时刷新,可以看到连接的信息,遇到错误时这个很有用
客户端状态检查
同理查看 strongswan 的状态
strongswan status
#### -----------------------------
Security Associations (1 up, 0 connecting):
centos[1]: ESTABLISHED 70 minutes ago, xxx.xxx.xxx.xx[1.2.3.4]...xxx.xxx.xxx.XXX[1.2.3.4]
centos{2}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: f1ff4cf5_i cc2e38be_o
centos{2}: 10.0.0.1/32 === 0.0.0.0/0 ## 注意这里与服务器是通的
查看 ifconfig
ifconfig
####--------------------
···· 可以看到ip 为10.0.0.1 的虚拟网络,由服务器端分配
ipsec0: flags=4305 mtu 1400
inet 10.0.0.1 netmask 255.255.255.255 destination 10.0.0.1
inet6 fe80::2775:85ae:7405:74e0 prefixlen 64 scopeid 0x20
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500
····
其他配置
连接 后无法访问局域网
客户端执行 strongswan up centos 后,会出现 ssh 断开。之后无法访问,原因为 Linux 连接 ikev2 VPN Server 后, 会无法访问本地局域网内其他机器, 因为 ikev2 VPN 自动添加的路由表 (table id 和优先级都是 220.) 比系统默认路由表优先级高.
ip route show table 220
##-----------
1.2.3.4 via 客户端网关地址 dev eth1 proto static src 客户端ip地址
default dev ipsec0 proto static src 10.0.0.1
解决办法
先查看客户端物理接口地址的路由网段,
ip route # 注意查看输出
default via xxx.xxx.xxx.xxx dev eth0
1xx.xxx.0.0/16 dev eth0 scope link metric 1002
1xx.xx.xx.0/20 dev eth0 proto kernel scope link src xxx.xx.xxx.xxx
然后执行下列语句,注意更换实际地址。
# 如何客户端连接成功后其他所有网络无法连接,请重新执行以下语句
# 可以尝试执行 systemctl ressart network 刷新网络设置
ip rule add from xx.xx.0.0/16 table main prio 1
ip rule add from xx.xx.xx.0/20 table main prio 1
客户端共享VPN给其它用户
sysctl -w net.ipv4.ip_forward=1
# 10.0.0.1 是客户端从服务器分配到的虚拟VPN地址
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.0.0.1
# 如果发生无法建立连接,可以先尝试执行以下语句, 再执行strongswan up
# iptables -t nat -D POSTROUTING -o eth0 -j SNAT --to 10.0.0.1
则其它机器将 Gateway 设为 VPN 客户端的地址 即可自动通过 VPN 访问 Internet.
如果VPN作为中转,可以通过下面命令
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o ipsec0 -j MASQUERADE
### 注意事项:如果VPN断开后,需要先将这条nat删除,否则将出现无法连接诶,删除方法为
#iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o ipsec0 -j MASQUERADE
补充
strognswan 命令解析
strognswan reload # 重新加载配置
strongswan rereadsecrets # 重新加载 ipsec.secret
strongswan up # 启动name配置连接
strongswan down # 断开name配置连接