抱歉,你查看的文章不存在

如何在Ubuntu 16.04上使用StrongSwan设置IKEv2 VPN服务器

介绍

虚拟专用网络(VPN)允许您在通过不受信任的网络(例如咖啡店,会议或机场的网络)时安全地加密流量。

IKEv2或Internet Key Exchange v2是一种允许在服务器和客户端之间进行直接IPSec隧道连接的协议。在IKEv2 VPN实施中,IPSec为网络流量提供加密。IKEv2在新平台(OS X 10.11 +,iOS 9.1+和Windows 10)上本机支持,无需其他应用程序,它可以非常顺利地处理客户端的暂时性的小问题。

在本教程中,您将在Ubuntu 16.04服务器上使用StrongSwan设置IKEv2 VPN服务器,并从Windows,iOS和macOS客户端连接到该服务器。

准备

要完成本教程,您需要:

  • 一个具有多个CPU的Ubuntu 16.04服务器,包括具有sudo权限的非root用户和防火墙。

此外,您应该熟悉IPTables

第一步 - 安装StrongSwan

首先,我们将安装StrongSwan,一个开源的IPSec守护进程,我们将其配置为我们的VPN服务器。我们还将安装StrongSwan EAP插件,该插件允许客户端进行密码身份验证,而不是基于证书的身份验证。作为此配置的一部分,我们需要创建一些特殊的防火墙规则,因此我们还将安装一个实用程序,它允许我们使新的防火墙规则持久化。

执行以下命令以安装这些组件:

$ sudo apt-get install strongswan strongswan-plugin-eap-mschapv2 moreutils iptables-persistent

注意:安装iptables-persistent时,安装程序将询问是否保存当前的IPv4和IPv6规则。由于我们希望任何以前的防火墙配置保持不变,我们将在两个提示中选择“是”。

现在已经安装了所有东西,让我们继续创建我们的证书:

第二步 - 创建证书颁发机构

IKEv2服务器需要证书才能向客户端标识自己。为了帮助我们创建所需的证书,StrongSwan附带了一个实用程序来生成证书颁发机构和服务器证书。首先,让我们创建一个目录来存储我们将要处理的所有内容。

$ mkdir vpn-certs
$ cd vpn-certs

现在我们有了一个存储所有内容的目录,让我们生成我们的根密钥。这将是一个4096位RSA密钥,用于签署我们的根证书颁发机构,因此通过确保只有root用户可以读取它来保护此密钥非常重要。

执行以下命令以生成并保护密钥:

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

现在我们有了一个密钥,我们可以继续创建我们的根证书颁发机构,使用密钥签署根证书:

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

如果需要,您可以将专有名称(DN)值(例如国家/地区,组织和公用名)更改为其他值。由于这里的名称只是起到一个指示的作用,所以你可以使用任何你想用的名称,甚至随便创造也不为过。

稍后,我们将根证书(server-root-ca.pem)复制到我们的客户端设备,以便他们在连接时验证服务器的真实性。

现在我们已经启动并运行了根证书权限,我们可以创建VPN服务器将使用的证书。

第三步- 为VPN服务器生成证书

我们现在将为VPN服务器创建证书和密钥。该证书将允许客户端验证服务器的真实性。

首先,使用以下命令为VPN服务器创建私钥:

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

然后使用您在上一步中创建的证书颁发机构密钥创建并签署VPN服务器证书。执行以下命令,但将Common Name(CN)和Subject Alternate Name(SAN)字段更改为VPN服务器的DNS名称或IP地址:

$ 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读取证书的路径:

$ 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用户读取。

$ 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有一个默认配置文件,但在我们进行任何更改之前,让我们先备份它,以便我们有一个参考文件以防万一出错:

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

示例文件很长,因此为防止配置错误,我们将清除默认配置文件并从头开始编写自己的配置。首先,清除原始配置:

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

然后在文本编辑器中打开文件:

$ sudo nano /etc/ipsec.conf

首先,我们将告诉StrongSwan记录守护程序状态以进行调试并允许重复连接。将这些行添加到文件中:

/etc/ipsec.conf

config setup
  charondebug="ike 1, knl 1, cfg 0"
  uniqueids=no

然后,我们将为VPN创建配置部分。我们还将告诉StrongSwan创建IKEv2 VPN隧道并在启动时自动加载此配置部分。将以下行附加到文件:

/etc/ipsec.conf

conn ikev2-vpn
  auto=add
  compress=no
  type=tunnel
  keyexchange=ikev2
  fragmentation=yes
  forceencaps=yes

接下来,我们将告诉StrongSwan哪些加密算法用于VPN。附加以下行:

/etc/ipsec.conf

  ike=aes256-sha1-modp1024,3des-sha1-modp1024!
  esp=aes256-sha1,3des-sha1!

我们还将配置失效对等体检测以清除任何“悬空”连接,以防客户端意外断开连接。添加以下行:

/etc/ipsec.conf

dpdaction=clear
  dpddelay=300s
  rekey=no

然后我们将配置服务器(左)侧IPSec参数。将其添加到文件中:

/etc/ipsec.conf

  left=%any
  leftid=@server_name_or_ip
  leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
  leftsendcert=always
  leftsubnet=0.0.0.0/0

注意:配置服务器ID(leftid)时,如果您的VPN服务器将通过域名标识,则仅包括\@字符:

  leftid=@vpn.example.com

如果服务器将通过其IP地址识别,只需将IP地址放入:

  leftid=111.111.111.111

然后我们配置客户端(右侧)IPSec参数,例如要使用的私有IP地址范围和DNS服务器:

/etc/ipsec.conf

 right=%any
  rightid=%any
  rightauth=eap-mschapv2
  rightsourceip=10.10.10.0/24
  rightdns=8.8.8.8,8.8.4.4
  rightsendcert=never

最后,我们将告诉StrongSwan在连接时询问客户端的用户凭据:

/etc/ipsec.conf

  eap_identity=%identity

配置文件应如下所示:

/etc/ipsec.conf

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身份验证

我们的VPN服务器现已配置为接受客户端连接,但我们尚未配置任何凭据,因此我们需要在名为ipsec.secrets的特殊配置文件中配置一些内容:

  • 我们需要告诉StrongSwan在哪里找到我们的服务器证书的私钥,这样服务器就能够加密和解密数据。
  • 我们还需要设置允许连接到VPN的用户列表。

让我们打开secrets文件进行编辑:

$ sudo nano /etc/ipsec.secrets

首先,我们将告诉StrongSwan在哪里可以找到我们的私钥。

/etc/ipsec.secrets

server_name_or_ip : RSA "/etc/ipsec.d/private/vpn-server-key.pem"

然后我们将创建用户凭据。您可以组成任何您喜欢的用户名或密码组合,但我们必须告诉StrongSwan允许此用户从任何地方进行连接:

tc/ipsec.secrets

your_username %any% : EAP "your_password"

保存并关闭文件。现在我们已经完成VPN参数的处理,我们将重新加载VPN服务,以便我们的配置将被应用:

$ sudo ipsec reload

现在VPN服务器已完全配置了服务器选项和用户凭据,现在是时候继续配置最重要的部分:防火墙。

第六步 - 配置防火墙和内核IP转发

现在我们已经配置了VPN服务器,我们需要配置防火墙以转发并允许VPN流量通过。我们将使用IPTables。

首先,如果你已经设置了它,请禁用UFW,因为它可能与我们需要配置的规则冲突:

$ sudo ufw disable

然后删除由UFW创建的任何剩余防火墙规则:

$ iptables -P INPUT ACCEPT
$ iptables -P FORWARD ACCEPT
$ iptables -F
$ iptables -Z

为了防止我们被锁定在SSH会话之外,我们将接受已被接受的连接。我们还将打开端口22(或您配置的任何端口),以便将来与服务器建立SSH连接。执行以下命令:

$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

我们还需要接受本地环回接口上的连接:

$ sudo iptables -A INPUT -i lo -j ACCEPT

然后我们将告诉IPTables接受IPSec连接:

$ sudo iptables -A INPUT -p udp --dport  500 -j ACCEPT
$ sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT

接下来,我们将告诉IPTables转发ESP(Encapsulating Security Payload)流量,以便VPN客户端能够连接。因为它们正在遍历不受信任的网络,所以ESP为我们的VPN数据包提供了额外的安全性:

$ 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

我们的VPN服务器将充当VPN客户端和互联网之间的网关。由于VPN服务器只有一个公共IP地址,我们需要配置伪装,以允许服务器代表客户端从互联网上请求数据; 这将允许流量从VPN客户端流向互联网,反之亦然:

$ 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

为了防止某些客户端上的IP数据包碎片,我们将告诉IPTables通过调整数据包的最大段大小来减小数据包的大小。这可以防止某些VPN客户端出现问题。

$ 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

为了更好的安全性,我们将删除与我们配置的规则不匹配的所有其他内容:

$ sudo iptables -A INPUT -j DROP
$ sudo iptables -A FORWARD -j DROP

现在我们将防火墙配置保持不变,以便在重新启动时不会擦除所有配置工作:

$ sudo netfilter-persistent save
$ sudo netfilter-persistent reload

最后,我们将在服务器上启用数据包转发。数据包转发使我们的服务器能够将数据从一个IP地址“路由”到另一个IP地址。从本质上讲,我们正在使我们的服务器像路由器一样。

编辑/etc/sysctl.conf文件:

$ sudo nano /etc/sysctl.conf

我们需要在这里配置一些东西:

  • 首先,我们将启用IPv4数据包转发。
  • 我们将禁用路径MTU发现以防止数据包碎片问题。
  • 我们也不会接受ICMP重定向,也不会发送ICMP重定向来防止中间人攻击。

您需要对文件所做的更改在以下代码中突出显示:

/etc/sysctl.conf

. . .

# 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

进行这些更改,保存文件,然后退出编辑器。然后重启服务器:

$ sudo reboot

在重新启动时,您将与服务器断开连接,但这是预期的。服务器重新启动后,以具有sudo权限的非root用户身份重新登录服务器。您已准备好在客户端上测试连接。

第七步 - 在Windows,iOS和macOS上测试VPN连接

现在您已经完成了所有设置,现在是时候尝试一下了。首先,您需要复制您创建的根证书,并将其安装在将连接到VPN的客户端设备上。最简单的方法是登录服务器并执行此命令以显示证书文件的内容:

$ cat ~/vpn-certs/server-root-ca.pem

您将看到类似于此的输出:

-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE

. . .

EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----

将此输出复制到您的计算机,包括-----BEGIN CERTIFICATE----------END CERTIFICATE-----行,并将其保存到具有可识别名称的文件,例如vpn_root_certificate.pem。确保您创建的文件具有.pem扩展名。

vpn_root_certificate.pem文件下载到计算机后,即可设置与VPN的连接。

从Windows连接

首先,按照以下步骤导入根证书:

  1. 按WINDOWS+R以显示“ 运行”对话框,然后输入mmc.exe以启动Windows管理控制台。
  2. 从“ 文件”菜单中,导航到“添加或删除管理单元”,从可用管理单元列表中选择“ 证书 ”,然后单击“ 添加”
  3. 我们希望VPN与任何用户的工作,所以选择计算机帐户,然后单击下一步
  4. 我们在本地计算机上配置内容,因此选择“ 本地计算机”,然后单击“ 完成”
  5. Console Root节点下,展开Certificates(LocalComputer)条目,展开Trusted Root CertificationAuthorities,然后选择Certificates条目:
Certificates条目
  1. 从“ 操作”菜单中,选择“ 所有任务”并单击“导入”以显示“证书导入向导”。单击“ 下一步”以跳过介绍。
  2. 在“ 要导入文件”屏幕上,按“浏览”按钮,然后选择已保存的证书文件。然后单击下一步
  3. 确保将“ 证书存储”设置为“ 受信任的根证书颁发机构”,然后单击“下一步”
  4. 单击“ 完成”以导入证书。

然后使用以下步骤配置VPN:

  1. 启动“ 控制面板”,然后导航到“ 网络和共享中心”
  2. 单击“ 设置新连接或网络”,然后选择“ 连接到工作区”
  3. 选择使用我的Internet连接(VPN)
  4. 输入VPN服务器详细信息。在Internet地址字段中输入服务器的域名或IP地址,然后使用描述VPN连接的内容填写目标名称。然后单击“完成”

您的新VPN连接将显示在网络列表下。选择VPN,然后单击“连接”。系统将提示您输入用户名和密码。输入它们,单击“ 确定”,即可连接。

从iOS连接

要在iOS设备上配置VPN连接,请按照下列步骤操作:

  1. 给自己发送附有根证书的电子邮件。
  2. 打开iOS设备上的电子邮件,然后点击附加的证书文件,然后点击安装并输入您的密码。安装完成后,点击“完成”
  3. 转到设置常规VPN,然后点击添加VPN配置。这将打开VPN连接配置屏幕。
  4. 点击Type并选择IKEv2
  5. 在“ 描述”字段中,输入VPN连接的短名称。这可能是你喜欢的任何东西。
  6. 在“ 服务器远程ID”字段中,输入服务器的域名或IP地址。“本地ID”字段可以留空。
  7. 在“ 身份验证”部分输入您的用户名和密码,然后点击“完成”
  8. 选择刚刚创建的VPN连接,点击页面顶部的开关,即可连接。

从macOS连接

请按照以下步骤导入证书:

  1. 双击证书文件。 Keychain Access将弹出一个对话框,显示“Keychain Access正在尝试修改系统密钥链。请输入密码以允许此操作。”
  2. 输入您的密码,然后单击“ 修改Keychain”。
  3. 双击新导入的VPN证书。这会打开一个小属性窗口,您可以在其中指定信任级别。将IP安全(IPSec)设置始终信任,系统将再次提示您输入密码。输入密码后,此设置会自动保存。

既然证书很重要且值得信任,请使用以下步骤配置VPN连接:

  1. 转到System Preferences,然后选择网络
  2. 单击网络列表左下方的小“加号”按钮。
  3. 在出现的弹出窗口中,将Interface Interface设置为VPN,将VPNType设置为 IKEv2,并为连接命名。
  4. 在“服务器远程ID”字段中,输入服务器的域名或IP地址。将本地ID留空。
  5. 单击“ 身份验证设置”,选择“用户名”,然后输入您为VPN用户配置的用户名和密码。然后单击确定

最后,单击“ 连接”以连接到VPN。您现在应该连接到VPN。

连接故障排除

如果您无法导入证书,请确保该文件具有.pem扩展名,而不是.pem.txt

如果您无法连接到VPN,请检查您使用的服务器名称或IP地址。服务器的域名或IP地址必须与您在创建证书时配置为公用名(CN)的名称相匹配。如果它们不匹配,则VPN连接将不起作用。如果使用vpn.example.com的CN设置证书,则在输入VPN服务器详细信息时必须使用vpn.example.com。仔细检查用于生成证书的命令以及创建VPN连接时使用的值。

最后,仔细检查VPN配置,以确保在使用域名时使用@符号配置leftid值:

  leftid=@vpn.example.com

如果您使用的是IP地址,请确保省略@符号。

结论

在本教程中,您已构建了一个使用IKEv2协议的VPN服务器。现在您可以放心,无论您走到哪里,您的在线活动都将保持安全!

要添加或删除用户,请再次查看第五步。每行都是针对一个用户的,因此添加或删除用户就像编辑文件一样简单。

从这里开始,您可能需要考虑设置日志文件分析器,因为StrongSwan会将其日志转储到syslog中。如果使用的腾讯云服务器,可以参考腾讯云VPN网关对接StrongSwan开源VPN软件配置方法。


参考文献:《How to Set Up an IKEv2 VPN Server with StrongSwan on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

云计算教程系列

729 篇文章300 人订阅

相关文章

来自专栏原创

个推推送iOS版 常见问题详解

1、提交了.p12文件后多久可以测试? 提交后10分钟左右才可以测试,并不是立即生效的。 2、应用在后台时接收不到消息,即APNS消息接收不到? 1.    先...

37811
来自专栏惨绿少年

SSH服务详解

第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Wo...

3380
来自专栏潇涧技术专栏

Using Git with multiple Public Keys

很多时候,如果我们在多个网站有了Git账号,例如Github、GitCafe、CodingNet等,当我们与不同网站的代码库进行连接的时候可能会因为我们没有配置...

782
来自专栏赵俊的Java专栏

搭建一个自己的私有云 + 离线下载站

3.3K4
来自专栏Android相关

Gradle解决多lib冲突

在引入第三方jar包的时候,可能会遇到很多库的冲突,例如均使用了OkHttp,RxJava等等,在打包的时候就会遇到Class多个定义的问题。而目前Androi...

1632
来自专栏优启梦

emlog后台登录失败邮件通知

前面说到emlog后台登录参数加密,下面我们说说如何给emlog添加后台登录失败邮件通知的功能,本次我们需要用到mail函数,当然也就是需要25端口发信,如果是...

64612
来自专栏云计算教程系列

如何在Ubuntu 16.04上为用户目录设置vsftpd

FTP是文件传输协议的缩写,是一种曾经广泛用于在客户端和服务器之间移动文件的网络协议。它已被更快,更安全,更方便的文件传输方式所取代。许多休闲网民希望直接用ht...

2200
来自专栏云计算教程系列

如何在Ubuntu 14.04上保护Nginx

即使使用默认设置,Nginx也是一个非常安全可靠的Web服务器。但是,有很多方法可以进一步保护Nginx。

1562
来自专栏云计算教程系列

如何在Ubuntu 18.04上安装Webmin

Webmin是适用于任何Linux机器的基于Web的控制面板,可让您通过基于Web的现代界面管理服务器。使用Webmin,您可以动态更改常用软件包的设置,包括W...

1961
来自专栏Youngxj

emlog后台登录失败邮件通知

1273

扫码关注云+社区

领取腾讯云代金券