简介
strongswan是一套完整的IPsec实现方案来提供服务端和客户端之间的加密和认证,本文提供一些简单配置示例
一、安装准备
yum install epel-release
yum install openssl-devel
yum install strongswan-libipsec
二、安装strongswan
yum install strongswan
service strongswan start
三、生成证书
证书应用于所有 pubkey 认证方式
1、生成 CA 证书
- 生成一个私钥
strongswan pki --gen --outform pem > ca.key.pem
- 基于这个私钥自己签一个 CA 证书
strongswan pki --self --in ca.key.pem --dn "C=CN, O=ITnmg, CN=strongSwan CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
这里 –self 表示自签证书,–in 是输入的私钥,–dn 是判别名,–ca 表示生成 CA,–lifetime 为有效期。这里需要解释下判别名:
- C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。
- O 表示组织名。
- CN 为通用名。
2、生成服务器证书
- 同样先生成一个私钥
strongswan pki --gen --outform pem > server.key.pem
- 用我们刚才自签的 CA 证书给自己发一个服务器证书
#从私钥生成公钥
strongswan pki --pub --in server.key.pem --outform pem > server.pub.pem
#用刚生成的公钥生成服务器证书
strongswan pki --issue --lifetime 3600 --cacert ca.cert.pem --cakey ca.key.pem --in server.pub.pem --dn "C=com, O=myvpn, CN=${yourip}" --san="${yourip}" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
–issue, –cacert 和 –cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书
–dn, –san,–flag 是一些客户端方面的特殊要求:
- iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址
- Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),–flag serverAuth
- 非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU),–flag ikdeIntermediate
- Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,–san
3、生成客户端证书
- 依然是生成私钥
strongswan pki --gen --outform pem > client.key.pem
- 然后用刚才自签的 CA 证书来签客户端证书
#从私钥生成公钥
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=ITnmg, CN=blog.itnmg.net" --outform pem > client.cert.pem
4、生成 PKCS12 证书
- 生成证书
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/
把 CA 证书(ca.cert.pem)、客户端证书(client.cert.pem)和 .p12 证书(client.cert.p12)用 FTP 复制出来给客户端用
四、配置VPN
1、打开并修改配置文件
vi /etc/strongswan/ipsec.conf
修改配置参考如下
config setup
uniqueids=never #允许多个客户端使用同一个证书
#所有项目共用的配置项
conn %default
keyexchange=ike #ikev1 或 ikev2 都用这个
left=%any #服务器端标识,%any表示任意
leftsubnet=0.0.0.0/0 #服务器端虚拟ip, 0.0.0.0/0表示通配.
right=%any #客户端标识,%any表示任意
conn IKE-BASE
leftca=ca.cert.pem #服务器端 CA 证书
leftcert=server.cert.pem #服务器端证书
rightsourceip=10.0.0.0/24 #分配给客户端的虚拟 ip 段
#供 ios 使用, 使用客户端证书
conn IPSec-IKEv1
also=IKE-BASE
keyexchange=ikev1
fragmentation=yes #开启对 iOS 拆包的重组支持
leftauth=pubkey
rightauth=pubkey
rightauth2=xauth
rightcert=client.cert.pem
auto=add
#供 ios 使用, 使用 PSK 预设密钥
conn IPSec-IKEv1-PSK
also=IKE-BASE
keyexchange=ikev1
fragmentation=yes
leftauth=psk
rightauth=psk
rightauth2=xauth
auto=add
#供 android, linux, os x 使用
conn IPSec-IKEv2
also=IKE-BASE
keyexchange=ikev2
leftauth=pubkey
rightauth=pubkey
rightcert=client.cert.pem
auto=add
#供 windows 7+ 使用, win7 以下版本需使用第三方 ipsec vpn 客户端连接
conn IPSec-IKEv2-EAP
also=IKE-BASE
keyexchange=ikev2
#ike=aes256-sha1-modp1024! #第一阶段加密方式
rekey=no #服务器对 Windows 发出 rekey 请求会断开连接
leftauth=pubkey
rightauth=eap-mschapv2
rightsendcert=never #服务器不要向客户端请求证书
eap_identity=%any
auto=add
2、修改 dns 配置
nano /etc/strongswan/strongswan.d/charon.conf
参考如下
charon {
duplicheck.enable = no #同时连接多个设备,把冗余检查关闭.
# 公用 dns
dns1 = 8.8.8.8
dns2 = 8.8.4.4
#以下是日志输出
filelog {
/var/log/charon.log {
# add a timestamp prefix
time_format = %b %e %T
# prepend connection name, simplifies grepping
ike_name = yes
# overwrite existing files
append = no
# increase default loglevel for all daemon subsystems
default = 1
# flush each line to disk
flush_line = yes
}
}
}
3、配置验证方式的用户名与密码
nano /etc/strongswan/ipsec.secrets
格式为:
域 用户名 : 方法 <本机证书/协议密码> <本机证书密码>
以 : 为分界,分别从左到右填充,除了各类密码缺失以 null 补位,其它都用 %any 补位(密码怎么可能是 %any)
例如:
: PSK "PSK password"
实际上等于
%any %any : PSK "PSK password"
下面添加用户
: RSA server.key.pem #使用证书验证时的服务器端私钥
: PSK "预设加密密钥" #使用预设密钥时, 8-63位ASCII字符
用户名 : EAP "密码" #这里是使用EAP验证时的用户名和密码
用户名 : XAUTH "密码" #这里是使用XAUTH验证时的用户名和密码
4、开启内核转发
nano /etc/sysctl.conf
写入以下配置
# VPN
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding=1
保存退出, 执行下面命令
sysctl -p
5、配置防火墙
iptables -F
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -m policy --dir in --pol ipsec -j ACCEPT
iptables -A FORWARD -d 10.0.0.0/24 -j ACCEPT
iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT
iptables -A FORWARD -i ppp+ -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 公网ip
6、配置完防火墙后重启 strongswan 服务
service strongswan restart
转载请注明来源