ノート:

動的パブリックIPアドレスを使用したOracle Cloud InfrastructureでのVPNの確立

イントロダクション

Oracle Cloud Infrastructure (OCI)は、顧客構内機器(CPE)をVPNトンネル・エンドポイントとして構成するためのドメイン・ネーム・システム(DNS)の使用をサポートしていません。このチュートリアルでは、静的パブリックIPアドレスにアクセスできない中小企業が、動的アドレスでもIPSecサービスを使用できるようにすることを目的としています。この戦略には、顧客構内設備(CPE)のパブリックIPが変更されるたびに新しいOCIトンネルを自動的に生成できるスクリプトのデプロイが含まれます。

ノート:このチュートリアルでは、シェル・スクリプト・ファイルの最後の2行を使用して、自分のルーター(MikroTik)内でOCIに作成された新しいエンドポイントのIPアドレスと共有シークレットを更新します。ルータによっては、これら2つの値を反映するように更新する必要があります。

目標

前提条件

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. プライベートのMikrotikルーター設定の更新にsshpassアプリケーションを使用する必要がある場合に備えてインストールします。

    sudo apt-get install sshpass
    
  4. .shファイルを作成し、次のスクリプトをファイルにコピーして実行可能にします。データ、CPEを指すコンパートメントIDDRG 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トンネルを終了するか、この機能を実装する必要がある場合があります。

  5. スクリプトを自動的に実行する場合は、そのスクリプトをcrontabに追加します。

    Crontab -e
    

    ノート:頻度とスクリプト・パスをcrontabの最後の行に追加します。次のコマンドは、15分ごとに実行することを目的としています。

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

次回CPE IPアドレスを変更すると、OCIトンネルが新しいIPアドレスと共有シークレットで最大15分以内に再作成されます。

承認

その他の学習リソース

docs.oracle.com/learnの他のラボをご覧いただくか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントは、Oracle Help Centerを参照してください。