附註:

使用動態公用 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. 若要針對 CPE IP 位址更新與 OCI 建立穩定的 VPN IPSec 連線,您必須設定動態更新的 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 位址變更時,將會在 15 分鐘內以新的 IP 位址和共用加密密碼重新建立 OCI 通道。

認可

其他學習資源

瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center