Operation

异地组网之 IPSec VPN 快速部署

异地组网之 IPSec VPN 快速部署

目前流行的 VPN 组网方案有 OpenVPN、IPSec/L2TP、WireGuard等,相比也各有优缺点,当然都支持 Linux、Windows、Android、iOS,本文先做一个简单对比,然后再列出 IPesc 的搭建过程相关的实用资料。

  • OpenVPN 功能较强大但配置较复杂、采用用户空间+中心服务转发的机制实现,性能会有一定损失;

  • IPSec/L2TP 相比 OpenVPN 类似,但相对部署就比较简单了,如使用 github.com/hwdsl2/ipsec-vpn-server 的 docker 镜像一键部署(支持 IKEv2),更多关于 IPSec 底层协议族请参见:https://zh.wikipedia.org/wiki/IPsec

  • WireGuard 出来较晚有后发优势,优点是采用去中心化 peer-to-peer in UDP 架构,在 linux 上采用内和空间实现,性能最好,非常适合云原生异地多数据中心、边缘计算等场景组网,且 linux kernel >=5.6 内置,缺点是安装条件较苛刻,如kernel版本要求,当然在 Windows 上有用户空间实现可作为普通用户的 VPN 工具(这种场景就对性能要求没那么高),再就是 UDP 打洞的机制可能会被运营商干扰。

1. IPSec Server 搭建

1.1 启动服务

docker run \
    --name ipsec-vpn-server \
    --restart=always \
    -v ikev2-vpn-data:/etc/ipsec.d \
    -v /lib/modules:/lib/modules:ro \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -d --privileged \
    hwdsl2/ipsec-vpn-server

1.2 管理客户端证书

docker exec -it ipsec-vpn-server bash

# 列出所有客户端证书
sudo ikev2.sh --listclients

# 添加客户端证书
sudo ikev2.sh --addclient [client name]

# 导出客户端证书
sudo ikev2.sh --exportclient [client name]

# 吊销客户端证书
sudo ikev2.sh --revokeclient [client name]

# 永久删除客户端证书(注:一般吊销即可)
sudo ikev2.sh --deleteclient [client name]

1.3 其他管理命令

docker exec -it ipsec-vpn-server bash

# 查看当前连接客户端的流量状态
ipsec trafficstatus

# 查看服务进程指标
ipsec globalstatus

1.4 更改 IKEv2 服务器地址

在某些情况下,你可能需要在配置之后更改 IKEv2 服务器地址。例如切换为使用域名,或者在服务器的 IP 更改之后。请注意,你在 VPN 客户端指定的服务器地址必须与 IKEv2 辅助脚本输出中的服务器地址 完全一致,否则客户端可能无法连接。

  • 更改服务器地址,运行 辅助脚本 并按提示操作。
wget https://get.vpnsetup.net/ikev2addr -O ikev2addr.sh
sudo bash ikev2addr.sh
  • 重要: 运行此脚本后,你必须手动更新任何现有 IKEv2 客户端设备上的服务器地址以及 Remote ID(如果适用)。对于 iOS 客户端,你需要使用 IKEv2 辅助脚本 导出然后重新导入客户端配置。

1.5 自定义 VPN 子网

默认情况下,IPsec/L2TP VPN 客户端将使用内部 VPN 子网 192.168.42.0/24,而 IPsec/XAuth ("Cisco IPsec") 和 IKEv2 VPN 客户端将使用内部 VPN 子网 192.168.43.0/24。有关更多详细信息,请阅读上一节。

对于大多数用例,没有必要也 不建议 自定义这些子网。但是,如果你的用例需要它,你可以在安装 VPN 时指定自定义子网。

重要: 你只能在 初始 VPN 安装时 指定自定义子网。如果 IPsec VPN 已安装,你 必须 首先 卸载 VPN,然后指定自定义子网并重新安装。否则,VPN 可能会停止工作。

  • 示例:为 IPsec/L2TP 模式指定自定义 VPN 子网
# 注:必须指定所有三个变量。
sudo VPN_L2TP_NET=10.1.0.0/16 \
VPN_L2TP_LOCAL=10.1.0.1 \
VPN_L2TP_POOL=10.1.0.10-10.1.254.254 \
sh vpn.sh
  • 示例:为 IPsec/XAuth 和 IKEv2 模式指定自定义 VPN 子网
# 注:必须指定以下两个变量。
sudo VPN_XAUTH_NET=10.2.0.0/16 \
VPN_XAUTH_POOL=10.2.0.10-10.2.254.254 \
sh vpn.sh

1.6 VPN 客户端分流

2. IPSec Clients 安装

  • IPSec/L2TP 模式即 IKEv1
  • IKEv2(推荐)

2.1 Windows 10 and 8 GUI 客户端配置(IPsec/L2TP或IPsec/XAuth模式)

2.2 Windows 命令行客户端配置(IKEv2模式)

2.3 Linux GUI 客户端配置(IKEv2模式)

  • 参见:Linux GUI 客户端配置 IPSec

  • 前提条件: 在配置 Linux GUI 客户端之前,你必须更改 VPN 服务器上的以下设置:编辑服务器上的 /etc/ipsec.d/ikev2.conf。在 conn ikev2-cp 小节的末尾添加 authby=rsa-sha1,开头必须空两格。保存文件并运行 service ipsec restart

  • 安装客户端 GUI

# Ubuntu and Debian
sudo apt-get update
sudo apt-get install network-manager-strongswan

# Arch Linux
sudo pacman -Syu  # 升级所有软件包
sudo pacman -S networkmanager-strongswan

# Fedora
sudo yum install NetworkManager-strongswan-gnome

# CentOS
sudo yum install epel-release
sudo yum --enablerepo=epel install NetworkManager-strongswan-gnome
  • 提取 CA 证书,客户端证书和私钥。在完成后可以删除 .p12 文件
# 注:你可能需要输入 import password,它可以在 IKEv2 辅助脚本的输出中找到。
# 如果在脚本的输出中没有 import password,请按回车键继续。
openssl pkcs12 -in vpnclient.p12 -cacerts -nokeys -out ikev2vpnca.cer
openssl pkcs12 -in vpnclient.p12 -clcerts -nokeys -out vpnclient.cer
openssl pkcs12 -in vpnclient.p12 -nocerts -nodes  -out vpnclient.key

2.4 Linux 命令行客户端配置(IPsec/L2TP或IPsec/XAuth模式)

# Ubuntu and Debian
apt-get update
apt-get install strongswan xl2tpd net-tools
# Fedora
yum install strongswan xl2tpd net-tools
# CentOS
yum install epel-release
yum --enablerepo=epel install strongswan xl2tpd net-tools
  • 创建 VPN 变量(替换为你自己的值):
VPN_SERVER_IP='你的VPN服务器IP'
VPN_IPSEC_PSK='你的IPsec预共享密钥'
VPN_USER='你的VPN用户名'
VPN_PASSWORD='你的VPN密码'
  • 配置 strongSwan:
cat > /etc/ipsec.conf <<EOF
# ipsec.conf - strongSwan IPsec configuration file
conn myvpn
  auto=add
  keyexchange=ikev1
  authby=secret
  type=transport
  left=%defaultroute
  leftprotoport=17/1701
  rightprotoport=17/1701
  right=$VPN_SERVER_IP
  ike=aes128-sha1-modp2048
  esp=aes128-sha1
EOF

cat > /etc/ipsec.secrets <<EOF
: PSK "$VPN_IPSEC_PSK"
EOF

chmod 600 /etc/ipsec.secrets

# For CentOS and Fedora ONLY
mv /etc/strongswan/ipsec.conf /etc/strongswan/ipsec.conf.old 2>/dev/null
mv /etc/strongswan/ipsec.secrets /etc/strongswan/ipsec.secrets.old 2>/dev/null
ln -s /etc/ipsec.conf /etc/strongswan/ipsec.conf
ln -s /etc/ipsec.secrets /etc/strongswan/ipsec.secrets
  • 配置 xl2tpd:
cat > /etc/xl2tpd/xl2tpd.conf <<EOF
[lac myvpn]
lns = $VPN_SERVER_IP
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
EOF

cat > /etc/ppp/options.l2tpd.client <<EOF
ipcp-accept-local
ipcp-accept-remote
refuse-eap
require-chap
noccp
noauth
mtu 1280
mru 1280
noipdefault
defaultroute
usepeerdns
connect-delay 5000
name "$VPN_USER"
password "$VPN_PASSWORD"
EOF

chmod 600 /etc/ppp/options.l2tpd.client

至此 VPN 客户端配置已完成。按照下面的步骤进行连接。

注:当你每次尝试连接到 VPN 时,必须重复下面的所有步骤。

  • 创建 xl2tpd 控制文件:
mkdir -p /var/run/xl2tpd
touch /var/run/xl2tpd/l2tp-control
  • 重启服务:
service strongswan restart
# 适用于 Ubuntu 20.04,如果 strongswan 服务不存在
ipsec restart

service xl2tpd restart
  • 开始 IPsec 连接
# Ubuntu and Debian
ipsec up myvpn
# CentOS and Fedora
strongswan up myvpn
  • 开始 L2TP 连接:
echo "c myvpn" > /var/run/xl2tpd/l2tp-control
  • 断开连接
# Ubuntu and Debian
echo "d myvpn" > /var/run/xl2tpd/l2tp-control
ipsec down myvpn

# CentOS and Fedora
echo "d myvpn" > /var/run/xl2tpd/l2tp-control
strongswan down myvpn

2.5 Android GUI 客户端配置

2.6 iOS GUI 客户端配置

3. 故障排除

4. FAQ

4.1 目前已知问题

  • 本文已包含 Windows(IPsec/L2TP 模式和 IKEv2模式)、Linux(IPsec/L2TP 模式和 IKEv2模式)、Android、iOS 等客户端的配置,但可惜的是 Linux IKEv2 模式仅在 gnome(GUI)环境下测试成功,命令行环境下没有成功(仅测试 IPSec/L2TP(IKEv1) 通过),如需在全平台简单安全快速的部署 VPN 请参考:异地组网之 OpenVPN 快速部署

留言

您的电子邮箱地址不会被公开。