注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于您的云环境的值。
使用动态公共 IP 地址通过 Oracle Cloud Infrastructure 建立 VPN
简介
Oracle Cloud Infrastructure (OCI) 不支持使用域名系统 (DNS) 将客户终端设备 (CPE) 配置为 VPN 隧道端点。本教程旨在使无权访问静态公共 IP 地址的小型企业即使具有动态地址也能使用 IPSec 服务。该策略涉及部署一个脚本,该脚本能够在客户终端设备 (CPE) 的公共 IP 更改时自动生成新的 OCI 隧道。
注:在本教程中,shell 脚本文件中的最后两行用于更新在 OCI 上在我的路由器 (MikroTik) 中创建的新端点的 IP 地址和共享密钥。根据您的路由器,您需要更新它以反映这两个值。
目标
- 使用更新的 CPE IP 地址创建新的 Oracle Cloud Infrastructure 站点到站点 VPN 隧道。
先决条件
-
动态更新的 DNS 记录,指向您的公共 CPE IP 地址。
-
Linux 虚拟机 (VM)。
-
将
sshpass
安装到 Linux VM 中。在本教程中,这将用于向 MikroTik 路由器发送命令。 -
安装和配置 Oracle Cloud Infrastructure 命令行界面 (OCI CLI)。
-
生成 API 密钥。有关更多信息,请参见 How to Generate an API Signing Key 。
使用 Oracle Cloud Infrastructure 设置 VPN
-
要与 OCI 建立稳定的 VPN IPSec 连接以进行 CPE IP 地址更新,您必须设置动态更新的 DNS 记录。有多个公共 DNS 提供商支持此功能。选择您的收藏并配置它。(例如:Cloudns.net )
注册并配置公共动态 DNS 记录后,您可以设置 linux VM。
-
Linux VM 启动并运行后,请安装 OCI CLI,以便从此计算机在 OCI 租户上运行。有关详细信息,请参阅安装和配置 OCI CLI 。
-
安装
sshpass
应用程序,以防需要使用它来更新您的专用 Mikrotik 路由器设置。sudo apt-get install sshpass
-
创建
.sh
文件并在文件中复制以下脚本并将其设为可执行文件。请记住使用数据修改脚本,即指向您的 CPE 的区间 ID 、DRG ID 和 DNS 名称。注:您可以在终端中找到执行此命令的 oci 路径:
which oci
注:仅当使用 MikroTik 路由器时,才需要脚本的最后一部分(专用于 MikroTik 路由器)。否则,您必须实施命令将 OCI 隧道端点 IP 地址和共享密钥更新到路由器中。
nano VPN_update.sh
#!/bin/bash #OCI variables export compartment_id=ocid1.compartment.oc1… #your OCI compartment ID export drg_id=ocid1.drg.oc1.eu-frankfurt-1… #your DRG ID export DNS_cpe=YOUR_DYNAMIC_DNS_RECORD_POINT_TO_YOUR_CPE #(example: your-domain.com) #Mikrotik variables export static_routes=192.168.1.0/24 #(YOUR PRIVATE SUBNET) export router_ip=192.168.1.1 #(YOUR ROUTER PRIVATE IP ADDRESS) export router_user=USER #(YOUR ROUTER USER) export router_password=PWD #(YOUR ROUTER PASSWORD) #oci command path (to find the path of oci command type 'which oci' into the terminal) export oci_path=PATH #(YOUR oci COMMAND PATH. example: /home/ubuntu/bin/oci) export ip_address=$(ping -c 1 $DNS_cpe | gawk -F'[()]' '/PING/{print $2}') check_out=$($oci_path network ip-sec-connection list --compartment-id $compartment_id --all --query "data[?\"cpe-local-identifier\"=='$ip_address']" | sed 's|[[]]||g') if [[ -n $check_out ]] then printf -- "%s\n" "IP of the CPE is not changed - EXIT" exit else printf -- "%s\n" "create new IPSEC tunnel" cpe_id=$($oci_path network cpe create --compartment-id $compartment_id --ip-address $ip_address --query data.id --raw-output) $oci_path network cpe update --cpe-id $cpe_id ipsc_id=$($oci_path network ip-sec-connection create --compartment-id $compartment_id --cpe-id $cpe_id --drg-id $drg_id --static-routes '["$static_routes"]' --query data.id --raw-output) $oci_path network ip-sec-connection update --ipsc-id $ipsc_id tunnel_id1=$($oci_path network ip-sec-tunnel list --ipsc-id=$ipsc_id --all --query 'data[0].id' --raw-output) tunnel_id2=$($oci_path network ip-sec-tunnel list --ipsc-id=$ipsc_id --all --query 'data[1].id' --raw-output) ip_sec_psk1=$($oci_path network ip-sec-psk get --ipsc-id=$ipsc_id --tunnel-id=$tunnel_id1 | grep -oP '(?<="shared-secret": ").*(?=")') ip_sec_psk2=$($oci_path network ip-sec-psk get --ipsc-id=$ipsc_id --tunnel-id=$tunnel_id2 | grep -oP '(?<="shared-secret": ").*(?=")') vpn_ip1=$($oci_path network ip-sec-tunnel list --ipsc-id=$ipsc_id --all --query 'data[0]."vpn-ip"' --raw-output) vpn_ip2=$($oci_path network ip-sec-tunnel list --ipsc-id=$ipsc_id --all --query 'data[1]."vpn-ip"' --raw-output) echo OCI TUNNEL 1 IP and SHARED SECRET echo $vpn_ip1 echo $ip_sec_psk1 echo OCI TUNNEL 2 IP and SHARED SECRET echo $vpn_ip2 echo $ip_sec_psk2 #Mikrotik router update section. (Execute the sshpass command before run this script). Avoid and delete these two rows if you don't need it. sshpass -p '$router_password' ssh $router_user@$router_ip "/ip ipsec/ identity/ set number=0 secret=$ip_sec_psk1" sshpass -p '$router_password' ssh $router_user@$router_ip "/ip ipsec/ peer/ set number=0 address=$vpn_ip1"
chmod +x VPN_update.sh
注:脚本可以创建隧道,但不能终止旧隧道。有时,您必须登录到 OCI 控制台并终止未使用的旧 OCI 站点到站点 VPN 隧道,或在其中实施此功能。
-
如果希望自动执行脚本,请将该脚本添加到
crontab
。Crontab -e
注:将频率和脚本路径添加到
crontab
的最后一行。以下命令每 15 分钟执行一次。*/15 * * * * YOUR_SCRIPT_PATH/VPN_update.sh
下次更改 CPE IP 地址时,将使用新 IP 地址和共享密钥在 15 分钟内重新创建 OCI 隧道。
相关链接
确认
- 作者 - Marco Santucci(EMEA 企业云解决方案架构师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Establish a VPN with Oracle Cloud Infrastructure using a Dynamic Public IP Address
F96566-01
April 2024