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

教程类 · 2024-10-07

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

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 守护精灵是访问不了它的。

Theme Jasmine by Kent Liao