08月05, 2018

Linux搭建IPSec/IKEv2 VPN服务器及客户端连接教程

一、确定虚拟云服务虚拟技术类型

1、通过系统目录判断 执行命令:ls -al /proc 一般Openvz的话,则会有vz目录,Xen的话则会有xen目录。

2、通过网卡信息判断 执行命令:ifconfig 一般Openvz的话,则会有venet0或venet0:x网卡标识,Xen的话一般则是eth0。

3、通过VPS控制面板判断 流行的VPS面板包括SolusVM、vePortal等,会显示具体的虚拟技术。

4、通过virt-what命令判断 CentOS或RedHat系统的话,执行命令:yum install -y virt-what ubuntu(debian系):sudo apt-get install virt-what 

virt-what是一个判断当前环境所使用的虚拟技术的脚本,常见的虚拟技术基本上都能正常识别出来。 

安装好virt-what后,执行命令:sudo virt-what 根据返回的信息,即可判断出当前VPS所使用的虚拟技术。


二、编译安装Strongswan

1,安装必须的库

Ubuntu:

apt-get update
apt-get install libpam0g-dev libssl-dev make gcc


CentOS:

yum update
yum install pam-devel openssl-devel make gcc


2,下载strongswan并解压(*代表当前Strongswan版本号)

wget https://download.strongswan.org/strongswan-5.6.3.tar.gz
tar xzf strongswan-5.6.3.tar.gz
cd strongswan-5.6.3


3,编译Strongswan: 

Xen、KVM使用以下参数:

./configure  --enable-eap-identity --enable-eap-md5 \
--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap  \
--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap  \
--enable-xauth-pam  --enable-dhcp  --enable-openssl  --enable-addrblock --enable-unity  \
--enable-certexpire --enable-radattr --enable-tools --enable-openssl --disable-gmp


OpenVZ需额外增加一个 enable-kernel-libipsec:

./configure  --enable-eap-identity --enable-eap-md5 \
--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap  \
--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap  \
--enable-xauth-pam  --enable-dhcp  --enable-openssl  --enable-addrblock --enable-unity  \
--enable-certexpire --enable-radattr --enable-tools --enable-openssl --disable-gmp --enable-kernel-libipsec


4,编译并安装:

make
make install

编译完成后如果没有报错,且使用ipsec version指令能出现版本信息,则表示安装成功.


三、配置证书

1,生成CA证书的私钥

ipsec pki --gen --outform pem > ca.pem


2,使用私钥,签名CA证书

ipsec pki --self --in ca.pem --dn "C=CN, O=VPN, CN=VPN CA" --ca --outform pem >ca.cert.pem
–self 表示自签证书
–in 是输入的私钥
–dn 是判别名
C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名
O 组织名称
CN 友好显示的通用名
–ca 表示生成 CA 根证书
–lifetime 为有效期, 单位是天


提示:多个vps使用同个CA根证书: 

如果需要多个vps使用同一个CA根证书,则以上两步只执行一次,之后所有vps都使用上面生成的这两个ca.pem和ca.cert.pem文件进行后续的操作. 

然后把多台vps解析到同一个域名的不同二级域名下. 

这样客户端连接各个服务器时,只需要客户端安装一次根证书ca.cert.pem即可.


注意:可以通过申请域名SSL证书替代自签证书实现客户端免导入证书,主要用到的证书文件有3个:

cp chain.pem /root/ca.cert.pem # 包括根证书的链证书
cp cert.pem /root/server.cert.pem # 服务器证书
cp privkey.pem /root/server.pem # 服务器私钥

/usr/local/etc/ipsec.conf修改leftid,leftid需要和证书的域名保持一致,域名可以不指向本机IP,就是说一个有效证书可以用在多个VPN的服务器上;


3,生成服务器证书所需的私钥

ipsec pki --gen --outform pem > server.pem


4,用CA证书签发服务器证书

请先确认你的服务器的IP地址或域名,以后客户端连接时只能使用证书中的地址连接(多服务器使用相同根证书CA的,请先做好服务器的域名解析), 

然后将下面命令中的123.123.123.123替换为自己服务器的IP地址或域名,一共需要替换两处:

ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem \
--cakey ca.pem --dn "C=CN, O=VPN, CN=123.123.123.123" \
--san="123.123.123.123" --flag serverAuth --flag ikeIntermediate \
--outform pem > server.cert.pem

注意以上命令中的”C=”和”O=”的值要与第2步CA中的C,O的值保持一致.

–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。


5,生成客户端证书所需的私钥:

ipsec pki --gen --outform pem > client.pem


6,用CA签名客户端证书(C,O的值要与上面第2步CA的值一致,CN的值随意):

ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=CN, O=VPN, CN=VPN Client" --outform pem > client.cert.pem


7,生成pkcs12证书:

openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "VPN CA"  -out client.cert.p12

注意以上命令中的”-caname”后面的引号里的值必须要与第2步CA中的”CN=”的值保持一致. 

此时会提示输入两次密码, 这个密码是在导入证书到其他系统时需要验证的. 没有这个密码即使别人拿到了证书也没法使用.


8,安装证书:

cp -r ca.cert.pem /usr/local/etc/ipsec.d/cacerts/
cp -r server.cert.pem /usr/local/etc/ipsec.d/certs/
cp -r server.pem /usr/local/etc/ipsec.d/private/
cp -r client.cert.pem /usr/local/etc/ipsec.d/certs/
cp -r client.pem  /usr/local/etc/ipsec.d/private/


四、配置Strongswan

1,编辑/usr/local/etc/ipsec.conf文件:

vim /usr/local/etc/ipsec.conf

下面是一些常用的设置说明:

config setup
    #是否缓存证书吊销列表
    #cachecrls = yes    #是否严格执行证书吊销规则
    # strictcrlpolicy=yes
    #如果同一个用户在不同的设备上重复登录,yes 断开旧连接,创建新连接;no 保持旧连接,并发送通知; never 同 no, 但不发送通知.
    uniqueids=no
    #配置根证书, 如果不使用证书吊销列表, 可以不用这段. 命名为 %default 所有配置节都会继承它
    #ca %default
    #证书吊销列表url,可以是 LDAP, http, 或文件路径
    #crluri =  
#定义连接项, 命名为 %default 所有连接都会继承它
conn %default
    #是否启用压缩, yes 表示如果支持压缩会启用.
    compress = yes
    #当意外断开后尝试的操作, hold, 保持并重连直到超时.
    dpdaction = hold
    #意外断开后尝试重连时长
    dpddelay = 30s
    #意外断开后超时时长, 只对 IKEv1 起作用
    dpdtimeout = 60s
    #闲置时长,超过后断开连接.
    inactivity = 300s
    #数据传输协议加密算法列表
    esp = aes256-sha256,aes256-sha1,3des-sha1!
    #密钥交换协议加密算法列表
    ike = aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    #默认的密钥交换算法, ike 为自动, 优先使用 IKEv2
    keyexchange = ike
    #服务端公网ip, 可以是魔术字 %any,表示从本地ip地址表中取.
    left = %any
    #客户端ip, 同上
    right = %any
    #指定服务端与客户端的dns, 多个用","分隔
    leftdns = 8.8.8.8,8.8.4.4
    rightdns = 8.8.8.8,8.8.4.4
    #服务端用于ike认证时使用的端口, 默认为500,如果使用了nat 转发, 则使用4500
    #leftikeport =     #服务器端虚拟ip地址
    #leftsourceip = %config
    #客户端虚拟ip段
    rightsourceip = 10.0.0.0/24
    #服务器端子网, 魔术字 0.0.0.0/0. 如果为客户端分配虚拟 IP 地址的话,那表示之后要做 iptables 转发,那么服务器端就必须是用魔术字
    leftsubnet = 0.0.0.0/0
    #rightsubnet = [[]][,...]
 
conn IKEv2-BASE
    #服务器端根证书DN名称
    leftca = "C=CN, O=VPN, CN=StrongSwan CA"
    #服务器证书, 可以是 PEM 或 DER 格式
    leftcert = server.cert.pem
    #不指定客户端证书路径
    #rightcert =     #指定服务器证书的公钥
    leftsigkey = server.pub.pem
    #rightsigkey =  |     #是否发送服务器证书到客户端
    leftsendcert = always
    #客户端不发送证书
    rightsendcert = never
    #服务端认证方法,使用证书
    leftauth = pubkey
    #客户端认证使用 EAP 扩展认证 , 貌似 eap-mschapv2 比较通用
    rightauth = eap-mschapv2
    #服务端id, 可以任意指定, 默认为服务器证书的 subject, 还可以是魔术字 %any,表示什么都行.
    leftid = vpn.itnmg.net
    #客户端id, 任意
    rightid = %any
 
#ios, mac os, win7+, linux
conn IKEv2-EAP
    also=IKEv2-BASE
    #指定客户端eap id
    eap_identity = %any
    #不自动重置密钥
    rekey = no
    #开启IKE 消息分片
    fragmentation = yes
    #当服务启动时, 应该如何处理这个连接项. add 添加到连接表中.
    auto = add

修改为以下内容:

config setup
    uniqueids=no
 
conn %default
    compress = yes
    esp = aes256-sha256,aes256-sha1,3des-sha1!
    ike = aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha1-modp2048,3des-sha1-modp2048,aes256-sha256-modp1024,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    keyexchange = ike
    keyingtries = 1
    leftdns = 8.8.8.8,8.8.4.4
    rightdns = 8.8.8.8,8.8.4.4
 
conn ikev2-eap
    leftca = "C=CN, O=VPN, CN=VPN CA"
    leftcert = server.cert.pem
    leftsendcert = always
    rightsendcert = never
    leftid = "服务器域名或IP"
    left = %any
    right = %any
    leftauth = pubkey
    rightauth = eap-mschapv2
    leftfirewall = yes
    leftsubnet = 0.0.0.0/0
    rightsourceip = 10.1.0.0/24
    fragmentation = yes
    rekey = no
    eap_identity=%any
    auto = add

conn xauth_psk
    keyexchange=ikev1
    left=%defaultroute
    leftauth=psk
    leftsubnet=0.0.0.0/0
    right=%any
    rightauth=psk
    rightauth2=xauth
    rightsourceip=10.1.0.0/24
    auto=add


2,使用vim编辑/usr/local/etc/strongswan.conf文件:

charon {
        load_modular = yes
        duplicheck.enable = no
        compress = yes
        plugins {
                include strongswan.d/charon/*.conf
        }
        dns1 = 8.8.8.8
        dns2 = 8.8.4.4
        nbns1 = 8.8.8.8
        nbns2 = 8.8.4.4
}
include strongswan.d/*.conf


3,使用vim编辑/usr/local/etc/ipsec.secrets文件:

: RSA server.pem
: PSK "myPSKkey"
: XAUTH "myXAUTHPass"
[用户名] %any : EAP "[密码]"

将上面的myPSKkey单词更改为你需要的PSK认证方式的密钥; 

将上面的myXAUTHPass单词更改为你需要的XAUTH认证方式的密码,该认证方式的用户名是随意的; 

将上面的[用户名]改为自己想要的登录名,[密码]改为自己想要的密码([]符号去掉),可以添加多行,得到多个用户,这即是使用IKEv2的用户名+密码认证方式的登录凭据.


提示:wp8.1客户端连接的用户名问题 

由于wp8.1连接IKEv2的vpn时,默认会加上与手机名称相同的域,于是连接时会显示用户名或密码错误.这里有两种解决方法: 

方法1:将上面/usr/local/etc/ipsec.secrets文件的最后一行改为%any %any : EAP “[密码]” ,这样就可以使用任意用户名登录,带上域也不会出错. 

方法2:用FreeRADIUS过滤掉登录名的域,参考连接:让FreeRADIUS去掉登陆用户名中的Windows登录域


五、配置防火墙

1,编辑/etc/sysctl.conf 

net.ipv4.ip_forward=1

一行前面的#号去掉(否则Ikev2 vpn连接上后将无法访问外网),保存后执行sysctl -p(如果执行后有报错的,重新打开sysctl.conf将报错的部分#注释掉保存,直到执行sysctl -p不再报错为止)。


2,配置iptables:

OpenVZ执行:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.1.0.0/24  -j ACCEPT
iptables -A INPUT -i venet0 -p esp -j ACCEPT
iptables -A INPUT -i venet0 -p udp --dport 500 -j ACCEPT
iptables -A INPUT -i venet0 -p tcp --dport 500 -j ACCEPT
iptables -A INPUT -i venet0 -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -i venet0 -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -i venet0 -p tcp --dport 1723 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o venet0 -j MASQUERADE

PS: 如果VPS有 static IP ,可将上述防火墙规则的最后1条NAT规则替换为以下1条来提升处理效率:

iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o venet0 -j SNAT --to-source ELASTIC_IP

注意将上述1条规则的ELASTIC_IP替换为vps的静态ip地址.


Xen、KVM则执行:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.1.0.0/24  -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE

PS: 如果VPS有 static IP ,可将上述防火墙规则的最后1条NAT规则替换为以下1条来提升处理效率:

iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j SNAT --to-source ELASTIC_IP

注意将上述1条规则的ELASTIC_IP替换为vps的静态ip地址.


3,开机自动载入iptables:

Ubuntu:

iptables-save > /etc/iptables.rules
vim /etc/network/if-up.d/iptables
#!/bin/sh
iptables-restore < /etc/iptables.rules
chmod +x /etc/network/if-up.d/iptables


CentOS:

service iptables save

至此,IPSec/IKEv2 VPN便搭建好了!现在启用服务就可以使用了:


启动测试:

ipsec start


开机启动

vim /etc/rc.local

添加:

/usr/local/sbin/ipsec start >/dev/null 2>&1


六、客户端配置

1、IOS:

先导入 CA 证书

将之前创建的 ca.cert.pem 用 ftp 导出 , 写邮件以附件的方式发到邮箱, 在 ios 浏览器登录邮箱, 下载附件, 安装 ca 证书.


1)使用 IKEv2 + EAP 认证

找到手机上 “设置->VPN->添加配置”, 选 IKEv2


描述: 随便填

服务器: 填url或ip

远程ID: ipsec.conf 中的 leftid

用户鉴定: 用户名

用户名: EAP 项用户名

密码: EAP 项密码


2)使用 IKEv2 + 客户端证书 认证

把之前的 .p12 证书(里面包含ca证书)发到邮箱在手机上打开.  导入到手机(此时需要之前设置的证书密码).

找到手机上 “设置->VPN->添加配置”, 选 IKEv2


描述: 随便填

服务器: 填url或ip

远程ID: ipsec.conf 中的 leftid

用户鉴定: 证书

证书: 选择安装完的客户端证书


3)使用 IKEv2 + 预设密钥 认证

找到手机上 “设置->VPN->添加配置”, 选 IKEv2


描述: 随便填

服务器: 填url或ip

远程ID: ipsec.conf 中的 leftid

用户鉴定: 无

使用证书: 关

密钥: PSK 项密钥


2、Windows 10:

导入证书:

将 CA 根证书 ca.cert.pem 重命名为 ca.cert.crt

双击 ca.cert.crt 开始安装证书

点击安装证书

“存储位置” 选择 “本地计算机”, 下一步

选择 “将所有的证书都放入下列存储区”, 点浏览, 选择 “受信任的根证书颁发机构”, 确定, 下一步, 完成.

建立连接:


“控制面板”-“网络和共享中心”-“设置新的连接或网络”-“连接到工作区”-“使用我的 Internet 连接”

Internet 地址写服务器 IP 或 URL。

描述随便写。

用户名密码写之前配置的 EAP 的那个。

确定

转到 控制面板网络和 Internet网络连接

在新建的 VPN 连接上右键属性然后切换到“安全”选项卡

VPN 类型选 IKEv2

数据加密选“需要加密”

身份认证这里需要说一下,如果想要使用 EAP 认证的话就选择“Microsoft:安全密码(EAP-MSCHAP v2)”; 想要使用私人证书认证的话就选择“使用计算机证书”。

再切换到 “网络” 选项卡, 双击 “Internet 协议版本 4” 以打开属性窗口, 这里说一下, 如果你使用的是老版本的 win10, 可能会打不开属性窗口, 这是已知的 bug, 升级最新版本即可解决.

点击 “高级” 按钮, 勾选 “在远程网络上使用默认网关”, 确定退出.

VPN 配置完成


3、Windows 7 导入证书略有不同

开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。

「文件」-「添加/删除管理单元」,添加「证书」单元

证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。

在左边的「控制台根节点」下选择「证书」-「受信任的根证书颁发机构」-「证书」,右键 -「所有任务」-「导入」打开证书导入窗口。

选择 CA 证书 ca.cert.crt 导入即可

注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。


本文链接:https://lxyit.com/article/show/151.html

-- EOF --