


https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto-zh.md#android-4x-to-9x

使用这个辅助脚本来自动地在 VPN 服务器上配置 IKEv2：

sudo bash /opt/src/ikev2.sh --auto

该 脚本 必须使用 bash 而不是 sh 运行。
以上命令使用自动模式和默认选项运行辅助脚本。
如果你想要自定义 IKEv2 安装选项，
请在运行脚本时去掉 --auto 参数。
在完成之后，请转到 配置 IKEv2 VPN 客户端。

错误："bash: /opt/src/ikev2.sh: No such file or directory".

你可以指定一个域名，客户端名称和/或另外的 DNS 服务器。
这是可选的。点这里查看详情。
单击此处以查看 IKEv2 辅助脚本的使用信息。


手动在 VPN 服务器上配置 IKEv2
除了使用 辅助脚本 之外，高级用户也可以手动配置 IKEv2。在继续之前，推荐 升级 Libreswan 到最新版本。

下面举例说明如何手动在 Libreswan 上配置 IKEv2。以下命令必须用 root 账户运行。

获取 VPN 服务器的公共 IP 地址，将它保存到变量并检查。

PUBLIC_IP=$(dig @resolver1.opendns.com -t A -4 myip.opendns.com +short)
[ -z "$PUBLIC_IP" ] && PUBLIC_IP=$(wget -t 3 -T 15 -qO- http://ipv4.icanhazip.com)
printf '%s\n' "$PUBLIC_IP"
检查并确保以上命令的输出与服务器的公共 IP 一致。该变量将在以下步骤中使用。

注： 另外，在这里你也可以指定 VPN 服务器的域名。例如： PUBLIC_IP=myvpn.example.com。

添加一个新的 IKEv2 连接：

if ! grep -qs '^include /etc/ipsec\.d/\*\.conf$' /etc/ipsec.conf; then
  echo >> /etc/ipsec.conf
  echo 'include /etc/ipsec.d/*.conf' >> /etc/ipsec.conf
fi
注： 如果你在上面的第一步指定了服务器的域名（而不是 IP 地址），则必须将以下命令中的 leftid=$PUBLIC_IP 换成 leftid=@$PUBLIC_IP。

cat > /etc/ipsec.d/ikev2.conf <<EOF

conn ikev2-cp
  left=%defaultroute
  leftcert=$PUBLIC_IP
  leftid=$PUBLIC_IP
  leftsendcert=always
  leftsubnet=0.0.0.0/0
  leftrsasigkey=%cert
  right=%any
  rightid=%fromcert
  rightaddresspool=192.168.43.10-192.168.43.250
  rightca=%same
  rightrsasigkey=%cert
  narrowing=yes
  dpddelay=30
  dpdtimeout=120
  dpdaction=clear
  auto=add
  ikev2=insist
  rekey=no
  pfs=no
  ike=aes256-sha2,aes128-sha2,aes256-sha1,aes128-sha1
  phase2alg=aes_gcm-null,aes128-sha1,aes256-sha1,aes128-sha2,aes256-sha2
  ikelifetime=24h
  salifetime=24h
EOF
还需要在该文件中添加一些行。首先查看你的 Libreswan 版本，然后运行以下命令之一：

ipsec --version

如果是 Libreswan 3.23 或更新版本：

cat >> /etc/ipsec.d/ikev2.conf <<EOF
  modecfgdns="8.8.8.8 8.8.4.4"
  encapsulation=yes
  mobike=no
EOF
注： MOBIKE IKEv2 协议扩展允许 VPN 客户端更改网络连接点，例如在移动数据和 Wi-Fi 之间切换，并使 VPN 保持连接。如果你的服务器（或者 Docker 主机）的操作系统 不是 Ubuntu Linux，并且你想要启用 MOBIKE 支持，可以将上面命令中的 mobike=no 换成 mobike=yes。不要 在 Ubuntu 系统或者 Raspberry Pi 上启用该选项。

如果是 Libreswan 3.19-3.22：

cat >> /etc/ipsec.d/ikev2.conf <<EOF
  modecfgdns1=8.8.8.8
  modecfgdns2=8.8.4.4
  encapsulation=yes
EOF
如果是 Libreswan 3.18 或更早版本：

cat >> /etc/ipsec.d/ikev2.conf <<EOF
  modecfgdns1=8.8.8.8
  modecfgdns2=8.8.4.4
  forceencaps=yes
EOF
生成 Certificate Authority (CA) 和 VPN 服务器证书。

注： 使用 "-v" 参数指定证书的有效期（单位：月），例如 "-v 120"。

生成 CA 证书：

certutil -z <(head -c 1024 /dev/urandom) \
  -S -x -n "IKEv2 VPN CA" \
  -s "O=IKEv2 VPN,CN=IKEv2 VPN CA" \
  -k rsa -g 3072 -v 120 \
  -d sql:/etc/ipsec.d -t "CT,," -2
Generating key.  This may take a few moments...

Is this a CA certificate [y/N]?
y
Enter the path length constraint, enter to skip [<0 for unlimited path]: >
Is this a critical extension [y/N]?
N
生成 VPN 服务器证书：

注： 如果你在上面的第一步指定了服务器的域名（而不是 IP 地址），
则必须将以下命令中的 --extSAN "ip:$PUBLIC_IP,dns:$PUBLIC_IP" 换成 --extSAN "dns:$PUBLIC_IP"。

certutil -z <(head -c 1024 /dev/urandom) \
  -S -c "IKEv2 VPN CA" -n "$PUBLIC_IP" \
  -s "O=IKEv2 VPN,CN=$PUBLIC_IP" \
  -k rsa -g 3072 -v 120 \
  -d sql:/etc/ipsec.d -t ",," \
  --keyUsage digitalSignature,keyEncipherment \
  --extKeyUsage serverAuth \
  --extSAN "ip:$PUBLIC_IP,dns:$PUBLIC_IP"
Generating key.  This may take a few moments...
生成客户端证书，然后导出 .p12 文件，该文件包含客户端证书，私钥以及 CA 证书。

注： 你可以重复本步骤来为更多的客户端生成证书，但必须将所有的 vpnclient 换成比如 vpnclient2，等等。
如需同时连接多个客户端，则必须为每个客户端生成唯一的证书。

生成客户端证书：

certutil -z <(head -c 1024 /dev/urandom) \
  -S -c "IKEv2 VPN CA" -n "vpnclient" \
  -s "O=IKEv2 VPN,CN=vpnclient" \
  -k rsa -g 3072 -v 120 \
  -d sql:/etc/ipsec.d -t ",," \
  --keyUsage digitalSignature,keyEncipherment \
  --extKeyUsage serverAuth,clientAuth -8 "vpnclient"
Generating key.  This may take a few moments...
导出 .p12 文件：

pk12util -d sql:/etc/ipsec.d -n "vpnclient" -o vpnclient.p12
Enter password for PKCS12 file:
Re-enter password:
pk12util: PKCS12 EXPORT SUCCESSFUL
指定一个安全的密码以保护导出的 .p12 文件（在导入到 iOS 或 macOS 设备时，该密码不能为空）。

（适用于 iOS 客户端） 导出 CA 证书到 ikev2vpnca.cer：

certutil -L -d sql:/etc/ipsec.d -n "IKEv2 VPN CA" -a -o ikev2vpnca.cer
证书数据库现在应该包含以下内容：

certutil -L -d sql:/etc/ipsec.d
Certificate Nickname                               Trust Attributes
                                                   SSL,S/MIME,JAR/XPI

IKEv2 VPN CA                                       CTu,u,u
($PUBLIC_IP)                                       u,u,u
vpnclient                                          u,u,u
注： 如需显示证书内容，可使用 certutil -L -d sql:/etc/ipsec.d -n "Nickname"。
要吊销一个客户端证书，请转到这一节。关于 certutil 的其它用法参见 这里。

（重要）重启 IPsec 服务：

service ipsec restart
在继续之前，你必须重启 IPsec 服务。VPN 服务器上的 IKEv2 配置到此已完成。下一步：配置 VPN 客户端。











