2階層インターネットアクセス(NAT)パターン#

本構成は従来リージョン向けとなります。
東日本/西日本リージョン3では、1つのサブネットにルータは1つのみとなります。
類似構成として DEX・NATパターン[東日本/西日本リージョン3向け] を参照ください。

要求事項#

  • 階層をもたせたネットワーク構成で、外部ネットワークに接続されていない 内部ネットワークからインターネットにアクセスしたい

対応するデザインパターン概要#

このパターンでは、NATサーバを構築することで、外部ネットワークに接続されていない内部ネットワークからインターネットへのアクセスを可能にする例を記載します。

なお、ネットワーク構成は、2階層ネットワーク構成 の ルータ 2つの場合① の構成と同一です。

Note

東日本リージョン2相当のリージョンの場合は、NATサーバを構築せずに仮想ルータでNATする構成も構成可能です。
仮想ルータでNATする構成については、2階層ネットワーク構成 の ルータ 2つの場合② をご覧ください。

FJcloud-Oのネットワーク#

FJcloud-Oのネットワークでは、FJcloud-Oであらかじめ用意された「外部ネットワーク」(インターネットに接続されたネットワーク) と、自分で作成する「内部ネットワーク」があります。

ネットワーク 内容
外部ネットワーク FJcloud-Oであらかじめ用意された、インターネットに接続されたネットワーク。
内部ネットワーク 自分で作成するネットワーク。
ネットワーク構成やセキュリティの設定で、インターネットに接続可能にも接続不可能にもできる。
セグメントが複数階層に分かれている場合、外部ネットワークに接続しない「内部ネットワーク(private)」は、ネットワーク構成上でインターネットから接続できません。

なお、本資料はネットワーク構成について記載しており、セキュリティ設定については記載しておりません。
セキュリティ設定については、実装サンプルでリンクしている セキュリティグループ/ファイアーウォール併用パターン 等をご覧ください。

構造 (イメージ図)#

image

  • public層のみグローバルIPアドレス割り当て可能
  • public層のみ、インターネットからの通信を受信可能
  • public層/private層とも、インターネットに通信可能
    private層からの通信はPublic層のNATサーバを経由する(通信制御はFWおよびSGで実施)
  • 外部とpublic層、public層とprivate層間それぞれの通信制御を各ネットワーク固有のFWにて設定可能
    (設定ミスをおこしにくい)

実装サンプル#

シングルAZ構成で、ネットワークを構築する手順を示します。

(1) 仮想ルータの作成/外部ネットワークのアタッチ#

  • 仮想ルータを2つ(外部-public、public-private)を作成します。
  • IaaSポータルにログインします。
  • 「ネットワーク」⇒「仮想ルータ」画面で、「+」ボタンをクリックします。
  • 「仮想ルータ作成」画面で、以下の項目を入力し、「作成」ボタンをクリックします。
項目 必須 設定値例 内容
AZ 必須 "jp-east-1b" システムを設置するアベイラビリティゾーン
AZ1:"jp-east-1a"
AZ2:"jp-east-1b"
仮想ルーター名(外部-public) 必須 "demo_router_public" 適宜設定してください。
仮想ルーター名(public-private) 必須 "demo_router_private" 適宜設定してください。
  • 「仮想ルータ一覧」画面で、作成した仮想ルータ(外部-public)の「アクション」⇒「ゲートウェイ設定」を選択します。
    「ゲートウェイ設定画面」で仮想ルータを接続する「外部仮想ネットワーク」(インターネット側のネットワーク)を選択し、「設定」ボタンをクリックします。

(2) 内部ネットワーク/サブネットの作成#

  • ネットワーク画面にてpublic層/private層それぞれのネットワークを作成します。
    • 「ネットワーク」⇒「仮想ネットワーク」画面で、「+」ボタンをクリックします。
    • 「仮想ネットワーク作成」画面で、以下の項目を入力し、「作成」ボタンをクリックします。
タブ 項目 必須 内部ネットワーク
(public層)
設定値例
内部ネットワーク
(private層)
設定値例
内容
仮想
ネットワーク
AZ 必須 "jp-east-1b" "jp-east-1b" システムを設置するアベイラビリティゾーン
AZ1:"jp-east-1a"
AZ2:"jp-east-1b"
仮想ネットワーク名 必須 "demo_intnet3" "demo_intnet4" 適宜設定してください。
管理状態 必須 "UP" "UP" 適宜設定してください。
サブネット サブネット作成 必須 "あり" "あり"  
サブネット名 必須 "demo_subnet3" "demo_subnet4" 適宜設定してください。
仮想ネットワークアドレス 必須 "192.168.13.0/24" "192.168.14.0/24" CIDR形式で入力してください。
ゲートウェイ 推奨 "あり" "あり"  
ゲートウェイIP 推奨 "192.168.13.1" "192.168.14.1" 必須ではありませんが、設定してください。
この後に設定する仮想ルータのIPアドレス
サブネット
詳細
DHCP 推奨 "有効" "有効" 必須ではありませんが、設定してください。
この項目は、インターネット接続パターンのDHCPに関する説明 をご覧ください。
IPアドレス割当プール 任意     必要に応じて設定してください。
DNSサーバ 推奨 "133.162.201.10",
"133.162.201.9"
"133.162.201.10",
"133.162.201.9"
必須ではありませんが、設定してください。
IaaSポータル上では、後から追加できません。
DNSサーバは1行につき1項目設定できます。
DNSサーバのIPアドレスはリージョン/AZごとに異なります。
詳細は、機能説明書を参照してください。
追加のルート設定 任意 Destination:"192.168.14.0/24"
Nexthop:"192.168.13.100"
  ゲートウェイIPに設定されるデフォルトのルート以外で接続する宛先を設定します。
以下を設定します。
  • CIDR形式の宛先(Destination)
  • その宛先へ接続するルータ(Nexthop)
  • (3) 外部-public間の仮想ルータにインタフェース追加#

    • 「仮想ルーター」画面にて外部-public間の仮想ルータの詳細を開き、インタフェース追加を行います。
    項目 必須 設定値例 内容
    サブネット 必須 "demo_subnet3" 内部ネットワーク(public層)を選択してください。
    IPアドレス 必須 "192.168.13.1" 内部ネットワーク(public層)作成の際に設定したゲートウェイIPアドレスを設定してください。

    (4) public-private間の仮想ルータにインタフェース追加#

    • public-private間の仮想ルータの詳細を開き、インタフェース追加を行います。
    項目 必須 内部ネットワーク(public層) 内部ネットワーク(private層) 内容
    サブネット 必須 "demo_subnet3" "demo_subnet4" 内部ネットワーク作成の際に設定したサブネットを選択してください。
    IPアドレス 必須 "192.168.13.100" "192.168.14.1"
  • public層側
  • 内部ネットワーク作成の際に「追加のルート設定」で設定したルータ用のIPアドレスを設定してください。
  • private層側
  • 内部ネットワーク作成の際に設定したゲートウェイIPアドレスを設定してください。

    (5)NATサーバの作成#

    • NATサーバとして使用する仮想サーバを作成します。
    • 実装手順は インターネット接続パターンの仮想サーバ作成例 を参照してください。
    • 動作検証はCentOS6.8で実施しています。
    • 当資料では、NATサーバに設定されたIPアドレスを192.168.13.3として説明します。

    (6)NATサーバへのIPフォワーディングとIPマスカレード設定#

    public層ネットワークに配置した仮想サーバに対して、以下の設定を行ってください。
    以下、Linuxでの設定を示します。

    rootになり、後述のコマンドを実行してください。

    • 設定ファイル(/etc/sysctl.conf)の編集

      • vi /etc/sysctl.conf
        net.ipv4.ip_forward の値を 1 に変更し、保存する

      • sysctl -p
        設定が反映されていることを確認する

    • iptablesの設定をクリア(設定していなければ不要)

      • iptables -F
      • iptables -t nat -F
      • iptables -X
    • iptablesにNAT(IP MASQUERADE)を設定

      • iptables -t nat -A POSTROUTING -o eth0 -s 192.168.14.0/24 -j MASQUERADE
        -sオプションにはprivate層ネットワーク(CIDR)を指定する
    • iptablesの設定を確認

      • iptables -t nat -nL
    • iptablesの設定を恒久反映(設定の保存とサービスの有効化)

      • service iptables save
      • chkconfig iptables on

    (7) NATサーバへのポート設定#

    以下のAPIに設定項目(json)を設定し、実行してください。

    • 設定項目(REST API)
    項目 設定値例 内容
    $PORT_ID (生成されたID) NATサーバが使用しているポートID
    • 設定項目(json)
    項目 設定値例 内容
    $PAIR_IP {\"ip_address\":\"0.0.0.0/1\"},
    {\"ip_address\":\"128.0.0.0/1\"},
    {\"ip_address\":\"133.162.201.0/24\"}
    NATを許可するIPアドレス範囲 *1

    DNSサーバのIPアドレス範囲 *2

    *1 "ip_adress"に"0.0.0.0/0"を設定することはできません。
    東日本リージョン1相当のリージョンではAPI実行エラーになります。
    また、東日本リージョン2相当のリージョンではエラーにはなりませんが、設定が反映されません。
    環境に合わせて、接続先のIPアドレス範囲を具体的に指定してください。
    上記サンプルは、"0.0.0.0/0"に相当するアドレス範囲の設定例になります。

    *2 NATを許可するIPアドレス範囲にDNSサーバのIPアドレス範囲が包含されていますが、後者は必ず設定が必要になるため、前者の範囲を狭めた場合にも漏れを無くす目的で定義しています。
    なお、今回の設定であれば後者を省略しても動作します。

    • 実行API
    curl -i -X PUT $NETWORK/v2.0/ports/$PORT_ID -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" -d '{"port":{"allowed_address_pairs": ['$PAIR_IP']}}'
    
    • ポートの設定を確認(allowed_address_pairsに値が設定されていることを確認)
    curl -s -X GET $NETWORK/v2.0/ports/$PORT_ID -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" | jq .
    

    (8) 外部-public間の仮想ルータへのルーティング設定#

    以下のAPIに設定項目(json)を設定し、実行してください。

    • 設定項目(REST API)
    項目 設定値例 内容
    $ROUTER_ID (生成されたID) 外部-public間仮想ルータのID
    • 設定項目(json)
    項目 設定値例 内容
    $ROUTES {\"nexthop\":\"192.168.13.100\",
    \"destination\":\"192.168.14.0/24\"}
    内部ネットワーク(private層)宛ての経路を設定する。
    • 実行API
    curl -i $NETWORK/v2.0/routers/$ROUTER_ID -X PUT -H "X-Auth-Token: $OS_AUTH_TOKEN " -H "Content-Type: application/json" -d '{"router": { "routes": ['$ROUTES'] }} '
    
    • 設定の確認
    curl -s $NETWORK/v2.0/routers/$ROUTER_ID -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN " | jq .
    

    (9) public-private間の仮想ルータへのルーティング設定#

    以下のAPIに設定項目(json)を設定し、実行してください。

    • 設定項目(REST API)
    項目 設定値例 内容
    $ROUTER_ID (生成されたID) public-private間仮想ルータのID
    • 設定項目(json)
    項目 設定値例 内容
    $ROUTES {\"nexthop\":\"192.168.13.3\",\"destination\":\"0.0.0.0/0\"},
    {\"nexthop\":\"192.168.13.3\",\"destination\":\"133.162.201.0/24\"}
    NATを許可するIPアドレス範囲およびDNSサーバのIPアドレス範囲のNexthopをNATサーバに向ける *3

    *3 NATを許可するIPアドレス範囲にDNSサーバのIPアドレス範囲が包含されていますが、後者は必ず設定が必要になるため、前者の範囲を狭めた場合にも漏れを無くす目的で定義しています。
    なお、今回の設定であれば後者を省略しても動作します。

    • 実行API
    curl -i $NETWORK/v2.0/routers/$ROUTER_ID -X PUT -H "X-Auth-Token: $OS_AUTH_TOKEN " -H "Content-Type: application/json" -d '{"router": { "routes": ['$ROUTES'] }} '
    
    • 設定の確認
    curl -s $NETWORK/v2.0/routers/$ROUTER_ID -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN " | jq .
    

    (10) セキュリティ設定 (ファイアーウォール/セキュリティグループ)#

    • 仮想サーバを配備する前に、ファイアーウォールやセキュリティグループの設定を行ってください。
    • ファイアーウォールの設定は、2つの仮想ルータ(外部ネットワーク-public、public-private)に、それぞれの通信を許可する設定を行ってください。
    • 設定に際しては、以下のデザインパターンをご覧ください。
    デザインパターン名称 説明
    セキュリティグループ活用 セキュリティグループ のみでアクセス制御するパターンです。
    セキュリティグループ/ファイアーウォール併用 セキュリティグループ と ファイアーウォール を組み合わせたパターンです。
    機能別セキュリティグループ 機能別にアクセス制限をかけるパターンです。

    curlコマンドやyumコマンドで、NATを許可した宛先に接続できることを確認してください。

    メリット・効果#

    • 東日本リージョン1相当のリージョンでも、private層の仮想サーバからインターネットにアクセスできます。
    • ファイアウォール、セキュリティグループを制御することで、DBサーバにパッチをあてる必要がある場合など、必要な時だけインターネットにアクセス可能です。
    • セグメント間の通信で、ファイアーウォールによるアクセス制御をかけることができます。
    • イメージ図のprivate層とpublic層のように、仮想ルータを分けられる (=ファイアーウォールを分けられる) ため、構築時の操作ミスを防ぎます。
    • private層の仮想サーバにはグローバルIPアドレスを割り当てられないため、同じく構築時の操作ミスを防ぎます。

    注意事項#

    • 本パターンは2017年12月時点のFJcloud-O 東日本リージョン2 で動作検証しています。
      実装サンプルは東日本リージョン1での構築を想定し、AZとDNSサーバの設定を置き換えています。
      (東日本リージョン2では仮想ルータでNATする構成が可能なため)

    • WindowsServerやLinuxOS上のルーティング設定(NAT)に関しては、FJcloud-Oのサポート対象外となります。
      利用者責任のもとで構築を行ってください。
      本実装サンプルのようなIPマスカレードを使用したNAT構成は一般的な手法として事例や情報が多いことから、NATサーバはLinuxOSでの構築を推奨します。

    • ネットワーク構成は自由度が高いため、様々な構成を実現できますが、ファイアーウォール、セキュリティグループにて通信の制御は必ず行ってください。