Contents
  1. 1. 介绍
  2. 2. 前提
  3. 3. 一、安装strongSwan
  4. 4. 二、建立认证中心
  5. 5. 三、为VPN服务器生成证书
  6. 6. 四、配置StrongSwan
  7. 7. 五、配置VPN登录验证
  8. 8. 六、配置防火墙和IP转发
  9. 9. 七、测试连接
    1. 9.1. windows连接
    2. 9.2. IOS连接
    3. 9.3. macOS连接
  10. 10. 常见问题
  11. 11. 总结
  12. 12. 翻译结语

by kowen

本文讲述了如何在Ubuntu16.04服务器上部署基于IKEv2的VPN服务,主要内容翻译自How to Set Up an IKEv2 VPN Server with StrongSwan on Ubuntu 16.04
斜体部分是我的画蛇添足,在windows、ios亲测完全正常可用。

介绍

介绍看不懂的可以不看

VPN连接英文全名叫virtual private network,即虚拟专用网络,有了它你可以在一些不安全的网络(比如咖啡馆、机场的公共wifi接入网络)中实现可靠的加密信息传输。 当然,国内最多的用途当然就是科学上网了

IKEv2,英文全称Internet Key Exchange v2,是一个让客户端服务器建立直接IPSec通道连接的协议。在基于IKEv2的 VPN中,IPSec为网络传输提供加密功能。IKEv2在OS X10.11+ IOS 9.1+ 和windows10中默认支持,不用安装其他软件 所以苹果手机也可以很方便的使用哦

本文将教你如何在ubuntu16.04服务器上使用StrongSwan建立一个IKEv2 VPN服务器,并在windows、IOS和mac客户端上连接。

前提

你需要做以下准备:

  • 一台Ubuntu16.04服务器,按照the Ubuntu 16.04 initial server setup guide配置好,包括一个执行sudo命令的非root用户和防火墙。特殊需求的用户服务器可以用糖果主机之类的vps, 不用个人配置,直接给你克隆好,包月40左右,英文不好的可以用糖果,网站是中文,服务人员也用中文,去度娘吧不多说了。另外,我直接用root用户配的

另外,你需要先了解一下IPTables,你可以学习一下 How the Iptables Firewall Works 中文的教程:iptables中文简明教程

一、安装strongSwan

首先需要安装StrongSwan,它是一个开源的IPSec后台服务,在此我们把它配制成一个VPN服务器。不建议使用基于证书的登录验证方式,最好使用基于密码的客户端验证登录,使用StrongSwan EAP插件可以帮我们实现密码登录功能。还需要设置一些防火墙规则,所以我们还要安装一个保存防火墙规则的工具防止重启后规则丢失

在服务器上执行以下命令安装上述程序

1
2
sudo apt-get update
sudo apt-get install strongswan strongswan-plugin-eap-mschapv2 moreutils iptables-persistent

注意:安装过程中会提示是否要保存当前 IPv4和IPv6规则。因为我们想保留目前的防火墙规则不变,都选择是即可。

安装完成后,下一步是建立证书

二、建立认证中心

IKEv2服务器需要证书来向客户端验证自己的身份,StrongSwan给我们提供了生成认证中心和服务器证书的工具来帮助我们创建所需的证书。首先我们来创建一个文件夹来保存下面生成的各种文件。

1
2
mkdir vpn-certs
cd vpn-certs

文件夹创建好后,需要创建根密钥,这是一个4096位的RSA密钥,它的用途是给认证中心进行签名。这个密钥非常重要,所以我们只给root用户读权限,其他用户不能访问。生成密钥的命令如下:

1
2
ipsec pki --gen --type rsa --size 4096 --outform pem > server-root-key.pem
chmod 600 server-root-key.pem

接下来,建立根认证中心,使用刚才创建的密钥对认证中心进行签名。注意下面一大垛是一条命令,一块复制到Shell下执行

1
2
3
4
ipsec pki --self --ca --lifetime 3650 \
--in server-root-key.pem \
--type rsa --dn "C=US, O=VPN Server, CN=VPN Server Root CA" \
--outform pem > server-root-ca.pem

你可以修改DN参数后的国家C、组织O和CN名称(Common Name),CN名称在这只是一个名称,你可以胡编乱造。这个时候你可以在vpn-certs下看到生成了两个文件server-root-key.pem和server-root-ca.pem

等会我们将复制根证书server-root-ca.pem到我们的客户端,这样客户端连接时就可以验证服务器了。

到现在根认证中心已经建好并运行,下面创建VPN服务器使用的证书。

三、为VPN服务器生成证书

为VPN服务器生成证书,这个证书用于客户端验证服务器的真实性。

首先为VPN服务器创建一个密钥

1
ipsec pki --gen --type rsa --size 4096 --outform pem > vpn-server-key.pem

然后生成VPN服务器证书,用前面生成的认证中心的密钥对这个证书进行签名。先修改一下命令,把SERVER_NAME_OR_IP换成你服务器的DNS名称或者IP地址。注意要替换两个SERVER_NAME_OR_IP,下面依然是一条命令

1
2
3
4
5
6
7
8
ipsec pki --pub --in vpn-server-key.pem \
--type rsa | ipsec pki --issue --lifetime 1825 \
--cacert server-root-ca.pem \
--cakey server-root-key.pem \
--dn "C=US, O=VPN Server, CN=SERVER_NAME_OR_IP" \
--san SERVER_NAME_OR_IP \
--flag serverAuth --flag ikeIntermediate \
--outform pem > vpn-server-cert.pem

把证书拷贝到配置目录以便StrongSwan读取

1
2
sudo cp ./vpn-server-cert.pem /etc/ipsec.d/certs/vpn-server-cert.pem
sudo cp ./vpn-server-key.pem /etc/ipsec.d/private/vpn-server-key.pem

最后更改权限只允许root用户有读权限

1
2
3
sudo chown root /etc/ipsec.d/private/vpn-server-key.pem
sudo chgrp root /etc/ipsec.d/private/vpn-server-key.pem
sudo chmod 600 /etc/ipsec.d/private/vpn-server-key.pem

这样,我们已经建立了客户端和服务器安全通讯的证书对,还用根密钥对证书进行了签名以使客户端能验证VPN服务器的真实性。所有的证书文件都已准备好了,下面开始配置软件。

四、配置StrongSwan

前面步骤生成了所需要的证书,本节对StrongSwan进行配置。

StrongSwan有一个默认配置文件,在进行配置前,需要进行备份,以便搞错后进行恢复。

1
sudo cp /etc/ipsec.conf /etc/ipsec.conf.original

默认配置文件相当长,为了防止配置出错,我们清除默认配置,从零开始写配置文件。首先,清除配置文件

1
echo '' | sudo tee /etc/ipsec.conf

下面的步骤都是编辑配置文件,比较繁琐,本节最后有完整配置文件,建议本地编写好上传覆盖,完整配置文件中需要根据第5步修改@server_name_or_ip参数

然后编辑配置文件

1
sudo nano /etc/ipsec.conf

  1. 首先开启StrongSwan的后台日志方便调试,允许多重连接。在文件中插入以下下几行:

    1
    2
    3
    config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no
  2. 建立VPN配置,让StrongSwan建立IKEv2通道并且在它启动时自动加载该配置,再加入以下几行:

    1
    2
    3
    4
    5
    6
    7
    conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
  3. 加入StrongSwan VPN需要支持的通讯加密算法,再加入以下几行:

    1
    2
    ike=aes256-sha1-modp1024,3des-sha1-modp1024!
    esp=aes256-sha1,3des-sha1!
  4. 启用断开连接探测清理掉线的连接,再加入以下几行:

    1
    2
    3
    dpdaction=clear
    dpddelay=300s
    rekey=no
  5. 配置服务器端(left)IPSec参数,添加以下几行(注意: 当配置leftid时,只有通过域名连接VPN服务器时才写@符号,比如@vpn.example.com,IP地址不用@符号,比如111.111.111.111):

    1
    2
    3
    4
    5
    left=%any
    leftid=@server_name_or_ip
    leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
  6. 配置客户端(right)IPSec参数,包括客户端连接后分配的IP地址段和DNS配置xxx

    1
    2
    3
    4
    5
    6
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
  7. 最后,配置StrongSwan向客户端要求用户证书:

    1
    eap_identity=%identity

完整的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
config setup
charondebug="ike 1, knl 1, cfg 0"
uniqueids=no
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
ike=aes256-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha1,3des-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=@server_name_or_ip
leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightdns=8.8.8.8,8.8.4.4
rightsourceip=10.10.10.0/24
rightsendcert=never
eap_identity=%identity

那么VPN参数配置完毕,下面介绍如何建立一个远程连接用户。

五、配置VPN登录验证

到这里服务器已经可以接受客户端的连接了,但是我们还没有进行证书配置,证书配置文件是ipsec.secrets,这个文件的作用:

  • 告诉StrongSwan服务器证书私钥的位置,这样服务器才能加密解密传输的数据
  • 建立VPN用户

编辑配置文件:

1
sudo nano /etc/ipsec.secrets

  1. 告诉StrongSwan私钥的位置:

    1
    server_name_or_ip : RSA "/etc/ipsec.d/private/vpn-server-key.pem"
  2. 建立用户登陆凭证(用户名密码),用户名和密码随意取,但是必须注明允许StrongSwan接受用户来自任意地址的连接

    1
    your_username %any% : EAP "your_password"
  3. 关闭保存文件,重新启动ipsec服务启用新的配置。

    1
    sudo ipsec reload

VPN服务器已经配置完毕,下面是最重要的一步:配置防火墙

六、配置防火墙和IP转发

配置完VPN服务器后,需要对防火墙进行配置,以使防火墙允许和转发VPN流量。使用IPTables工具来实现。

  1. 如果已经开启了UFW,先禁用,因为它会跟我们的配置冲突

    1
    sudo ufw disable
  2. 删除所有UFW留下的防火墙规则

    1
    2
    3
    4
    sudo iptables -P INPUT ACCEPT
    sudo iptables -P FORWARD ACCEPT
    sudo iptables -F
    sudo iptables -Z
  3. 为了防止SSH连接断开,先允许目前的连接,然后打开22或者自己设定的SSH端口

    1
    2
    sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  4. 允许本地回环地址的连接

    1
    sudo iptables -A INPUT -i lo -j ACCEPT
  5. 允许IPSec连接

    1
    2
    sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
    sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT
  6. 设置IPTables转发ESp(Encapsulating Security Payload)流量。转发ESP流量,ESP可以在非可信网络中给我们VPN包增加额外保护。

    1
    2
    sudo iptables -A FORWARD --match policy --pol ipsec --dir in --proto esp -s 10.10.10.10/24 -j ACCEPT
    sudo iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.10/24 -j ACCEPT
  7. VPN服务器在客户端和网络之间扮演了网关的角色。因为VPN服务器只有一个公网IP,我们需要启用伪装让服务器代替客户端从互联网请求数据,这样就可以使数据在VPN客户端和服务器之间传输。

    1
    2
    sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
    sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -j MASQUERADE
  8. 为了防止某些客户端的IP包拆分,设置IPTables包大小参数以减小包的大小,预防某些VPN客户端出问题。

    1
    sudo iptables -t mangle -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.10/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
  9. 安全起见,禁止其他所有连接。服务器上有其他服务的请用iptables工具打开相应端口

    1
    2
    sudo iptables -A INPUT -j DROP
    sudo iptables -A FORWARD -j DROP
  10. 保存防火墙配置,防止重启丢失

    1
    2
    sudo netfilter-persistent save
    sudo netfilter-persistent reload
  11. 最后启用包转发功能,包转发用来将数据在服务器上从一个IP发送到另一个IP,实际上我们服务器就是一个转发器。编辑配置文件 /etc/sysctl.conf

    1
    sudo nano /etc/sysctl.conf

    需要配置的东西包括:

    • 启用IPv4转发
    • 禁用Path MTU discovery防止包拆分问题
    • 禁止接受和发送ICMP重定向,防止中间人攻击

    配置修改部分如下(4个参数,前三个取消注释即可,最后一个自己添加)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    . . .
    # Uncomment the next line to enable packet forwarding for IPv4
    net.ipv4.ip_forward=1
    . . .
    # Do not accept ICMP redirects (prevent MITM attacks)
    net.ipv4.conf.all.accept_redirects = 0
    # Do not send ICMP redirects (we are not a router)
    net.ipv4.conf.all.send_redirects = 0
    . . .
    net.ipv4.ip_no_pmtu_disc = 1
  12. 重启服务器

    1
    sudo reboot

服务器配置已经完成,如果客户端连接正常就大功告成了,下面是连接方法

七、测试连接

VPN服务器已经配置完毕,下面来测试一下是否能正常连接。首先要下载根证书到本地,安装到你的客户机上。有两种方式,命令行打印输出和远程下载。

  • 方式一、命令行输出
    1
    cat ~/vpn-certs/server-root-ca.pem

你会看到

1
2
3
4
5
6
-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE
. . .
EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----

复制所有内容包括—–BEGIN CERTIFICATE—–和—–END CERTIFICATE—–到文字编辑器比如记事本,
然后保存,名称自己起,但后缀名必须是pem,比如vpn_root_certificate.pem。

  • 方式二、使用SFTP工具下载
    不详述。

一旦下载了根证书文件,就可以建立VPN连接了。鸡动吧

windows连接

  • 首先导入根证书
    1. 在运行中,输入mmc.exe,打开控制台窗口
    2. 从文件菜单中选择添加删除管理单元,弹出窗口中选择证书,添加
    3. 如果想要本地计算机所有用户都可以使用VPN连接,选择计算机账户,下一步
    4. 选择本地计算机,完成
    5. 依次展开证书->受信任的根证书办法机构(Trusted Root Certification Authorities)-证书
    6. 点击操作->所有任务->导入
    7. 选择证书文件vpn_root_certificate.pem,下一步
    8. 确认证书保存到收信人的根证书办法机构
    9. 完成导入成功。
  • 然后配置VPN连接
    1. 打开控制面板,进入网络和共享中心
    2. 点击设置新的连接或网络,选择连接到工作区
    3. 选择使用我的Internet连接(VPN)
    4. 地址中输入服务器名称或者IP,目标名称可以随意起
    5. 输入用户名密码(ipsec.secret中配置的),域不填写,点击连接

创建后,你可以在网络列表中看到新建的VPN连接,选择然后点击连接,输入用户名密码即可连接。

IOS连接

在苹果手机上连接VPN服务,请遵循一下步骤:

  1. 把根证书文件作为附件发送到你的邮箱
  2. 用IOS登录邮箱,点击附件,点击安装,会要求输入你的ios密码,点击完成
  3. 打开“设置->通用->VPN”,点击添加VPN配置
  4. 类型选择 IKEv2
  5. 描述输入你给vpn连接起的名字
  6. 服务器和远程ID输入ip地址或域名,本地ID不用填
  7. 输入用户名、密码(ipsec.secret),点击完成
  8. 选择创建的vpn名称,点击连接

macOS连接

贫农没有mac,以下纯翻译,未验证,系统提示信息可能与实际不一致

  • 导入证书

    1. 双击证书文件,Keychain Access弹出窗口提示“Keychain Access试图更改系统keychain,输入密码允许”
    2. 输入密码,点击允许更改Keychain
    3. 双击导入的vpn证书,会弹出窗口指定信任级别,设置IP Security为Always Trust,再次输入密码,系统会自动保存配置。
  • 创建VPN连接

    1. 进入系统设置(System Preference),选择网络
    2. 点击网络列表左下角加号按钮
    3. 弹出窗口中,设置接口为VPN, 配置VPN类型为IKEv2,给连接起一个名字
    4. 在服务器和远程ID中输入服务器域名或者IP,本地ID设置为空
    5. 点击认证设置,选择用户名,输入用户名密码,确定保存。

常见问题

如果不能导入证书,请确认证书的后缀名是pem,而不是pem.txt或其他。

如果不能连接到VPN服务器,检查连接的服务器域名或地址是否正确。服务器的域名或IP地址必须和创建证书文件时配置的CN名称一致,否则vpn不能工作。比如你用CN参数为vpn.example.com建立证书,那你必须使用vpn.example.com来创建连接。执行生成证书命令和建立VPN连接时,要反复检查。

最后,检查VPN配置确保使用域名做leftid的时候前面一定要加@,使用IP时一定不加@。

1
leftid = @vpn.example.com

或者

1
leftid = 111.111.111.111

总结

按照本教程你已经建立好了一个支持IKEv2协议的VPN服务器,现在你可以在任何地方使用你的加密连接(科学上网)了。

添加或删除用户,只需要遵照步骤5设置即可,每个用户单独占一行。

StrongSwan输出日志到syslog,也许你想配置一个日志分析器,可以查看这篇文章 How To Install and Use Logwatch Log Analyzer and Reporter on a VPS

翻译结语

防火墙中间有一步转发忘了翻译,结果能连接不能上网,折腾了两天才发现,好累,有时间写个简明教程。

linode测试的ubuntu16.04,iptables配置完后不能正常保存,重启后配置丢失,sugarhost ssd的最低配置,网络很溜,油管秒开,高清视频非常流畅,就是偶尔有不稳定的时候。

Contents
  1. 1. 介绍
  2. 2. 前提
  3. 3. 一、安装strongSwan
  4. 4. 二、建立认证中心
  5. 5. 三、为VPN服务器生成证书
  6. 6. 四、配置StrongSwan
  7. 7. 五、配置VPN登录验证
  8. 8. 六、配置防火墙和IP转发
  9. 9. 七、测试连接
    1. 9.1. windows连接
    2. 9.2. IOS连接
    3. 9.3. macOS连接
  10. 10. 常见问题
  11. 11. 总结
  12. 12. 翻译结语