更新日期:2018年4月23日
-我做了一个视频教程,《一键搭建自己的VPN服务器》,使用到的技术都是本系列教程中所讲的内容,
-另外推荐一个香港的VPS,延时在60-70ms,速度非常快,我自己一直在用,年付价格折合人名币64元/月,支持支付宝付款,有兴趣的同学可点击这里
本文在Centos7 上使用 Strongswan建设 SSL VPN,支持IPsec、ikev1、ikev2、l2tp 协议,客户端支持windows、osx、ios、安卓等操作系统,并且无需安装客户端。
- strongSwan 版本 5.2
- xl2tpd 版本 1.3.6
一. IPSec VPN
安装 strongSwan
1、添加 EPEL 源以及安装ifconfig命令与vim命令
yum install net-tools yum install vim yum install epel-release
2、安装strongswan
yum install strongswan systemctl enable strongswan systemctl start strongswan
生成证书
证书应用于所有 pubkey 认证方式中
生成 CA 证书
1. 生成一个私钥:
strongswan pki --gen --outform pem > ca.key.pem
2. 基于这个私钥自己签一个 CA 证书:
strongswan pki --self --in ca.key.pem --dn "C=CN, O=huayu, CN=strongSwan CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
这里 –self 表示自签证书,–in 是输入的私钥,–dn 是判别名,–ca 表示生成 CA,–lifetime 为有效期。这里需要解释下判别名:
- C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。
- O 表示组织名。
- CN 为通用名。
生成服务器端证书
1. 同样先生成一个私钥
strongswan pki --gen --outform pem > server.key.pem
2. 用我们刚才自签的 CA 证书给自己发一个服务器证书:
#从私钥生成公钥 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
–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。
生成客户端证书
1. 依然是生成私钥:
strongswan pki --gen --outform pem > client.key.pem
2. 然后用刚才自签的 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=huayu, CN=1.2.3.4" --outform pem > client.cert.pem
生成 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
vi /etc/strongswan/ipsec.conf
修改配置
config setup # strictcrlpolicy=yes # uniqueids = no 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 leftfirewall=yes 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 conn L2TP-PSK keyexchange=ikev1 authby=secret leftprotoport=17/1701 #l2tp端口 leftfirewall=no rightprotoport=17/%any type=transport auto=add
配置的解释
- left/right 是左右 id。它们用来识别服务器/客户端,可以是证书的判别名(DN),比如 “C=CN, O=strongSwan, CN=strongSwan CA”,也可以是 IP 地址,也可以是 EAP 的用户名,还可以是魔术字 %any,表示什么都行。只是在 5.0.0 之前,为本机这边定义 %any 的话,ikev1 连接即 keyexchange=ikev1 的连接是识别不了,所以要改成 %defaultroute 表示自己从 ifconfig 里取 IP。为了和 right 的 %any 区分开,我们使用这种方法。所以说到最后这两个选项似乎没有什么用。但它们是必须的。
- leftauth/rightauth 这是最重要的改动。新版主要是作废了之前的 authby 和 xauth=server/client 选项而都改用这种方法。因此使得 ikev1 也能够出现混血认证(左右两边认证的方法不同)了。参数主要有 pubkey 表示用证书,psk 表示用密码,eap 表示用扩展验证协议
- leftauth2/rightauth2 是为了应对旧版很常见的 authby=xauthpsk/xauthrsasig 的。现在 xauth 只能写在这里。而 psk 对应 leftauth/rightauth 里的 PSK 方法,rsasig 则对应 pubkey 方法。
- leftsubnet 最重要的,引入了魔术字 0.0.0.0/0。如果你在右侧为客户端分配虚拟 IP 地址的话,那表示你之后要做 iptables 转发,那么左边就必须是用魔术字。
- leftcert/rightcert 就是指定证书名字。
- rightsourceip 为客户端分配的虚拟 IP 段。
- auto 定义 strongswan 启动时该连接的行为。start 是启动; route 是添加路由表,有数据通过就启动; add 是添加连接类型但不启动; ignore 是当它不存在。默认是 ignore。看起来似乎是 route 比较好,但问题是我们服务器端不能预分配虚拟 IP,所以服务器端一般用的都是 add。而客户端文本配置可以选择 start。
修改 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 } } }
配置验证方式的用户名与密码
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验证时的用户名和密码
开启内核转发
nano /etc/sysctl.conf
写入以下配置
# VPN net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding=1
保存退出, 执行下面命令.
sysctl -p
配置防火墙
首先安装iptables
yum install iptables-services
systemctl enable iptables.service systemctl start iptables.service
设置开机启动脚本
chmod +x /etc/rc.d/rc.local
vi /etc/rc.local
iptables -F iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 21 -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 tcp -m state --state NEW -m tcp --dport 3306 -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 192.168.0.20
配置完防火墙后重启 strongswan 服务
strongswan stop #使用strongswan 自身的命令停止服务 systemctl start strongswan #使用 systemctl 命令启动服务
这里不使用 strongswan restart 命令的原因是, 使用这条命令后, 再用 systemctl status strongswan 命令得不到正确的运行状态.
至此, 服务端配置已完成.
下面配置客户端
IOS:
有两种选择
1. 使用证书
把之前的 .p12 证书用邮件发送到手机上. 导入到手机(此时需要之前设置的证书密码).
找到手机上 “设置->VPN->添加配置”, 选 IPSec
- 描述: 随便填
- 服务器: 填url或ip
- 帐户: 服务端设置中的 EAP 项用户名
- 密码: 服务端设置中的 EAP 项密码
- 使用证书: 打开
2. 使用预设密钥
找到手机上 “设置->VPN->添加配置”, 选 IPSec
- 描述: 随便填
- 服务器: 填url或ip
- 帐户: 服务端设置中的 EAP 项用户名
- 密码: 服务端设置中的 EAP 项密码
- 使用证书: 关闭
- 密钥: 服务端设置中的 PSK 项密钥
Windows 7+
导入证书:
- 开始菜单搜索“cmd”,打开后输入 mmc(Microsoft 管理控制台)。
- “文件”-“添加/删除管理单元”,添加“证书”单元
- 证书单元的弹出窗口中一定要选“计算机账户”,之后选“本地计算机”,确定。
- 在左边的“控制台根节点”下选择“证书”-“个人”,然后选右边的“更多操作”-“所有任务”-“导入”打开证书导入窗口。
- 选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。下一步“证书存储”选“个人”。
- 导入成功后,把导入的 CA 证书剪切到“受信任的根证书颁发机构”的证书文件夹里面。
- 打开剩下的那个私人证书,看一下有没有显示“您有一个与该证书对应的私钥”,以及“证书路径”下面是不是显示“该证书没有问题”。
- 然后关闭 mmc,提示“将控制台设置存入控制台1吗”,选“否”即可。
千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。
建立连接:
- “控制面板”-“网络和共享中心”-“设置新的连接或网络”-“连接到工作区”-“使用我的 Internet 连接”
- Internet 地址写服务器 IP 或 URL。
- 描述随便写。
- 用户名密码写之前配置的 EAP 的那个。
- 确定
- 以下是可选步骤
- 点击右下角网络图标,在新建的 VPN 连接上右键属性然后切换到“安全”选项卡,
- VPN 类型选 IKEv2.
- 数据加密是“需要加密”
- 身份认证这里需要说一下,如果想要使用 EAP-MSCHAPV2 的话就选择“使用可扩展的身份认证协议”-“Microsoft 安全密码”,想要使用私人证书认证的话就选择“使用计算机证书”。