注意:

使用动态公共 IP 地址通过 Oracle Cloud Infrastructure 建立 VPN

简介

Oracle Cloud Infrastructure (OCI) 不支持使用域名系统 (DNS) 将客户终端设备 (CPE) 配置为 VPN 隧道端点。本教程旨在使无权访问静态公共 IP 地址的小型企业即使具有动态地址也能使用 IPSec 服务。该策略涉及部署一个脚本,该脚本能够在客户终端设备 (CPE) 的公共 IP 更改时自动生成新的 OCI 隧道。

注:在本教程中,shell 脚本文件中的最后两行用于更新在 OCI 上在我的路由器 (MikroTik) 中创建的新端点的 IP 地址和共享密钥。根据您的路由器,您需要更新它以反映这两个值。

目标

先决条件

使用 Oracle Cloud Infrastructure 设置 VPN

  1. 要与 OCI 建立稳定的 VPN IPSec 连接以进行 CPE IP 地址更新,您必须设置动态更新的 DNS 记录。有多个公共 DNS 提供商支持此功能。选择您的收藏并配置它。(例如:Cloudns.net

    注册并配置公共动态 DNS 记录后,您可以设置 linux VM。

  2. Linux VM 启动并运行后,请安装 OCI CLI,以便从此计算机在 OCI 租户上运行。有关详细信息,请参阅安装和配置 OCI CLI

  3. 安装 sshpass 应用程序,以防需要使用它来更新您的专用 Mikrotik 路由器设置。

    sudo apt-get install sshpass
    
  4. 创建 .sh 文件并在文件中复制以下脚本并将其设为可执行文件。请记住使用数据修改脚本,即指向您的 CPE 的区间 IDDRG IDDNS 名称

    注:您可以在终端中找到执行此命令的 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 隧道,或在其中实施此功能。

  5. 如果希望自动执行脚本,请将该脚本添加到 crontab

    Crontab -e
    

    注:将频率和脚本路径添加到 crontab 的最后一行。以下命令每 15 分钟执行一次。

    */15 * * * * YOUR_SCRIPT_PATH/VPN_update.sh
    

下次更改 CPE IP 地址时,将使用新 IP 地址和共享密钥在 15 分钟内重新创建 OCI 隧道。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心