2階層インターネットアクセス(NAT)パターン#
本構成は東日本/西日本リージョン1・2向けとなります。
要求事項#
- 階層をもたせたネットワーク構成で、外部ネットワークに接続されていない 内部ネットワークからインターネットにアクセスしたい
対応するデザインパターン概要#
このパターンでは、NATサーバを構築することで、外部ネットワークに接続されていない内部ネットワークからインターネットへのアクセスを可能にする例を記載します。
なお、ネットワーク構成は、2階層ネットワーク構成 の ルータ 2つの場合① の構成と同一です。
Note
東日本リージョン2の場合は、NATサーバを構築せずに仮想ルータでNATする構成も構成可能です。
仮想ルータでNATする構成については、2階層ネットワーク構成 の ルータ 2つの場合② をご覧ください。
FJcloud-Oのネットワーク#
FJcloud-Oのネットワークでは、FJcloud-Oであらかじめ用意された「外部ネットワーク」(インターネットに接続されたネットワーク) と、自分で作成する「内部ネットワーク」があります。
ネットワーク | 内容 |
---|---|
外部ネットワーク | FJcloud-Oであらかじめ用意された、インターネットに接続されたネットワーク。 |
内部ネットワーク | 自分で作成するネットワーク。 ネットワーク構成やセキュリティの設定で、インターネットに接続可能にも接続不可能にもできる。 セグメントが複数階層に分かれている場合、外部ネットワークに接続しない「内部ネットワーク(private)」は、ネットワーク構成上でインターネットから接続できません。 |
なお、本資料はネットワーク構成について記載しており、セキュリティ設定については記載しておりません。
セキュリティ設定については、実装サンプルでリンクしている セキュリティグループ/ファイアーウォール併用パターン 等をご覧ください。
構造 (イメージ図)#
- 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に設定されるデフォルトのルート以外で接続する宛先を設定します。 以下を設定します。 |
(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" |
(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・西日本リージョン2では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・西日本リージョン2でも、private層の仮想サーバからインターネットにアクセスできます。
- ファイアウォール、セキュリティグループを制御することで、DBサーバにパッチをあてる必要がある場合など、必要な時だけインターネットにアクセス可能です。
- セグメント間の通信で、ファイアーウォールによるアクセス制御をかけることができます。
- イメージ図のprivate層とpublic層のように、仮想ルータを分けられる (=ファイアーウォールを分けられる) 。
- private層の仮想サーバにはグローバルIPアドレスを割り当てられない。
注意事項#
-
本パターンは2017年12月時点のFJcloud-O 東日本/西日本リージョン1・2で動作検証しています。
実装サンプルは東日本リージョン1での構築を想定し、AZとDNSサーバの設定を置き換えています。
(東日本リージョン2では仮想ルータでNATする構成が可能なため) -
WindowsServerやLinuxOS上のルーティング設定(NAT)に関しては、FJcloud-Oのサポート対象外となります。
利用者責任のもとで構築を行ってください。
本実装サンプルのようなIPマスカレードを使用したNAT構成は一般的な手法として事例や情報が多いことから、NATサーバはLinuxOSでの構築を推奨します。 -
ネットワーク構成は自由度が高いため、様々な構成を実現できますが、ファイアーウォール、セキュリティグループにて通信の制御は必ず行ってください。