こんにちは!ソリューションアーキテクト部の金杉です。よくお客様からご質問をいただくので、本日はIDCFクラウドでセカンダリIPを取得する方法について紹介しようと思います。
はじめに
1つのネットワークインターフェイスに複数IPを割り当てたいというケースは多々ありますよね。例えばバーチャルホストを使って同じサーバーで複数ドメインを運営する時や、Virtual IP (VIP)を用いて冗長構成を実現したい時など、様々なシーンでセカンダリIPが必要になってきます。このような技術を一般的に"IPエイリアス"と呼び、元から割り当てられているIPと追加で取得したIPをそれぞれ"プライマリIP"、"セカンダリIP"と呼んだりします。
IDCFクラウドではセカンダリIPの取得が可能です。このブログではIDCFクラウドのサーバーでセカンダリIPの取得およびセカンダリIPアドレスをグローバルIPアドレスと紐づける方法を紹介します。
セカンダリIP取得の2つのパターンと手順
セカンダリIPの取得には以下2通りのパターンがあります。パターンによって、手順が異なりますのでご注意ください。区別がつかない場合は、図1を参考にしてみてください。
パターン1 (手順1) セカンダリIP経由でインターネットと通信する場合
パターン2 (手順2) セカンダリIP経由でインターネットと通信しない場合
▲図1 セカンダリIP取得の際の2つのパターン
パターンによって手順が異なる理由は、IDCFクラウドのネットワーク仕様です。IDCFクラウドでは、コンピューティング環境とインターネットの間に仮想ルーターが存在します。対象のセカンダリIPがインターネットと通信をする場合、仮想ルーターを経由するので、セカンダリIPとグローバルIPを紐づける必要があります。一方、セカンダリIPがインターネットと通信をする必要がない場合、これらの操作が不要になります。なので、パターンによってセカンダリIPを取得する手順を両方紹介します。
仮想マシンのデプロイに関してはこちらを参考にしてください。
方法① インターネットと通信する場合
今回は、Light.S1(1コア, 1GBメモリ)の仮想マシンを使ってセカンダリIPを取得していきます。ホスト名はsecondary-ip-test、OSはCentOS 6.8を使用します。プライマリIPは10.32.0.122がDHCPで設定されています。
使用できるIPアドレスの確認
セカンダリIPとして使用できるIPアドレスは限られているので確認をします。IDCFクラウドコンソールより、左メニューバー「ネットワーク」、ターゲットのネットワーク名、「IPアドレス一覧」をクリックします。
DHCP範囲内(CIDRの前半)のIPアドレスが選択できます。つまり、このテーブルに表示されている割当済みのIPアドレスと、「割当範囲外」のIPアドレスを除いたすべてのIPアドレスがVIPとして割当可能です。セカンダリIPはDHCPもしくはスタティックで取得することが可能です。今回は10.32.0.100を指定して使います。
TIPS: DHCP範囲内のIPを選択する理由は?
今回、対象のセカンダリIPアドレスとグローバルIPアドレスを紐づける必要があります。紐づけるにはAPI経由でポートフォワードもしくはスタティックNATの2つの方法があるのですが、いずれも仮想ルーターに対しての操作になります。仮想ルーターに対してIPアドレス関連の操作を行う場合、その対象となるIPアドレスは仮想ルーターが認識できる必要があります。DHCP範囲外のIPアドレスは仮想ルーターでは認識できないので、ここではDHCP範囲内のIPアドレスを選択する必要があります。(でないと、グローバルIPアドレスと紐づけることができません。)
セカンダリIPアドレスの取得
手順①ではセカンダリIPアドレスの取得はCloudStack API経由で行います。IPアドレスの値は、先ほど確認した10.32.0.100をスタティックで付与します。APIに関しては、API Referencesをご参照ください。
IPアドレスを付与するに必要なコマンドはaddIpToNicです。必要なパラメーターおよび取得方法は以下になります。
パラメーター | 取得方法 | 取得の際の注意点 |
---|---|---|
nicid | listNics | 取得にあたってvirtualmachineidが必要です。virtualmachineidはlistVirtualMachinesで取得できます |
ipaddress | 指定 | 今回は10.32.0.100を入れます。指定しない場合はDHCPで付与されます |
IPアドレスの取得が完了した後、グローバルIPとセカンダリIPをenableStaticNatコマンドでスタティックNATします。必要なパラメーターおよび取得方法は以下になります。
※通常のスタティックNATの設定はIDCFクラウドコンソールからもできますが、今回はセカンダリIPを紐づけるため、操作はAPI経由で行う必要があります。
パラメーター | 取得方法 | 取得の際の注意点 |
---|---|---|
ipaddressid | listPublicIpAddresses | 特になし |
virtualmachineid | listVirtualMachines | 特になし |
vmguestip | 指定 | 先ほど指定した10.32.0.100を入れます。DHCPで割り当てた場合もIPアドレスを入力する必要があります |
それでは、これらのコマンドを使って実際に操作をしてみましょう。
コマンドラインツールのインストール
APIを利用するにあたって、コマンドラインツールのインストールが必要になります。インストールするサーバーは、Pythonが動けばどのサーバーでもかまいません。APIのGetting Started ガイドに沿って「簡単な使い方:Step4」までを実行してください。
APIでセカンダリIPアドレスを取得
# 仮想マシンのid一覧を表示 [root@API-Server ~]# cloudstack-api listVirtualMachines -t displayname,id +---------------------+--------------------------------------+ | displayname | id | +---------------------+--------------------------------------+ | secondary-ip-test | dd41b1a8-1c4a-48fd-b062-2ccab4c0ffc6 | +---------------------+--------------------------------------+ # secondary-ip-testのNIC idを表示 [root@API-Server ~]# cloudstack-api listNics --virtualmachineid dd41b1a8-1c4a-48fd-b062-2ccab4c0ffc6 -t ipaddress,id +-------------+--------------------------------------+ | ipaddress | id | +-------------+--------------------------------------+ | 10.32.0.122 | 0f25accf-06f8-4722-beda-508cc832c4ef | +-------------+--------------------------------------+ # secondary-ip-testのNICにセカンダリIPアドレスを指定して割り当てる [root@API-Server ~]# cloudstack-api addIpToNic --nicid 0f25accf-06f8-4722-beda-508cc832c4ef --ipaddress 10.32.0.100 # もう一度secondary-ip-testのNICの情報を表示 [root@API-Server ~]# cloudstack-api listNics --virtualmachineid dd41b1a8-1c4a-48fd-b062-2ccab4c0ffc6 (略) "secondaryip": [ { "id": "fadd1502-3aaa-4576-a05a-0d4eb1762265", "ipaddress": "10.32.0.100" } ] (略)
IDCFクラウドコンソールでグローバルIPを取得する
まずは、スタティックNATで使用するグローバルIPをIDCFクラウドコンソールより取得します。標準で1個付与されているグローバルIPはスタティックNAT用に使用できませんのでご注意ください。
IDCFクラウドコンソールにログインしたら、対象のリージョン→コンピューティングを選択し、左の「IPアドレス」タブをクリックします。画面の右上にある「IPアドレス取得」をクリックします。
続いて、ポップアップが出てきたらIPアドレスの表示名と対象のネットワークを選択します。入力が終わったら右下の「取得する」をクリックします。
先ほどのIPアドレスの画面に戻ったら、新たにグローバルIPが追加されているのが確認できます。現在「NAT」の欄は"なし"となっていますが、後ほど対象の仮想マシン名(secondary-ip-test)が表示されます。
APIでセカンダリIPをグローバルIPとスタティックNATをする
それでは、先ほど取得したグローバルIPを10.32.0.100とスタティックNATします。
# 現在あるグローバルIPとそのidを表示 # 先ほど取得した210.140.43.145を使う [root@API-Server ~]# cloudstack-api listPublicIpAddresses -t ipaddress,id +----------------+--------------------------------------+ | ipaddress | id | +----------------+--------------------------------------+ | 203.137.176.8 | eaa68c54-29a9-4ad1-bd93-32740e8bc15d | | 210.140.42.154 | 7b469138-8504-4133-9c73-2d28ebde7aba | | 210.140.43.145 | 17efd86a-9e2e-452a-ade9-d8b11610a091 | +----------------+--------------------------------------+ # スタティックNATを有効化 [root@API-Server ~]# cloudstack-api enableStaticNat --ipaddressid 17efd86a-9e2e-452a-ade9-d8b11610a091 --virtualmachineid dd41b1a8-1c4a-48fd-b062-2ccab4c0ffc6 --vmguestip 10.32.0.100 { "enablestaticnatresponse": { "success": "true" } }
スタティックNATのを確認
スタティックNATの設定が完了したら、ポータルから確認してみましょう。「NAT」の欄にsecondary-ip-testと表示されていますね。これで設定は完了です。
手順② インターネットと通信しない場合
手順②ではセカンダリIPアドレスの取得は直接OS内で指定して行います。手順①より簡単です。このブログではCentOS6系とCentOS7系両方のやり方を紹介します。
使用できるIPアドレスの確認
セカンダリIPとして使用できるIPアドレスは限られているので確認をします。IDCFクラウドコンソールより、左メニューバー「ネットワーク」、ターゲットのネットワーク名、「IPアドレス一覧」をクリックします。
ここで表示されている「割当範囲外」のIPアドレスがすべてセカンダリIPとして指定できます。(「利用不可」と書かれている最後の10個のIPアドレスだけはIDCFクラウド側で使用するため割当はできません)なので、この例では10.32.4.1を使います。
セカンダリIPアドレスの取得
CentOS 6系とCentOS 7系を例に手順を紹介します。
CentOS 6系の場合
今回は、Light.S1(1コア, 1GBメモリ)の仮想マシンを使ってセカンダリIPを取得していきます。ホスト名はsecondary-ip-test-cent6、OSはCentOS 6.8を使用します。プライマリIPは10.32.0.122がDHCPで設定されています。
#ifcfg-eth0:1の設定ファイルを作成 [root@secondary-ip-test-cent6 ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:1 #IPアドレスをDHCP取得ではなく、スタティックに書き込む [root@secondary-ip-test-cent6 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0:1 DEVICE=eth0 ONBOOT=yes IPADDR=10.32.4.1 NETMASK=255.255.248.0 #ネットワークの再起動 [root@secondary-ip-test-cent6 ~]# service network restart #eth0の情報確認 [root@secondary-ip-test-cent6 ~]# ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 02:03:01:be:00:05 brd ff:ff:ff:ff:ff:ff inet 10.32.0.122/21 brd 10.32.7.255 scope global eth0 inet 10.32.4.1/21 brd 10.32.7.255 scope global secondary eth0 inet6 fe80::3:1ff:febe:5/64 scope link valid_lft forever preferred_lft forever
10.32.4.1がちゃんと設定されていました。
CentOS 7系の場合
今回は、Light.S1(1コア, 1GBメモリ)の仮想マシンを使ってセカンダリIPを取得していきます。ホスト名はsecondary-ip-test-cent7、OSはCentOS 6.8を使用します。プライマリIPは10.32.0.209がDHCPで設定されています。
#まずは現在の状態を見てみます [root@secondary-ip-test-cent7 ~]# ip addr show (略) 2: eno16777984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 02:03:01:be:00:06 brd ff:ff:ff:ff:ff:ff inet 10.32.0.209/21 brd 10.32.7.255 scope global eno16777984 valid_lft forever preferred_lft forever inet6 fe80::3:1ff:febe:6/64 scope link valid_lft forever preferred_lft forever #nmcliコマンドでセカンダリIPを追加 [root@secondary-ip-test-cent7 ~]# nmcli connection modify eno16777984 +ipv4.addresses "10.32.4.1/21" #ネットワークを再起動する [root@secondary-ip-test-cent7 ~]# systemctl restart network #再度NICの状態を確認 [root@secondary-ip-test-cent7 ~]# ip addr show (略) 2: eno16777984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 02:03:01:be:00:06 brd ff:ff:ff:ff:ff:ff inet 10.32.0.209/21 brd 10.32.7.255 scope global eno16777984 valid_lft forever preferred_lft forever inet 10.32.4.1/21 brd 10.32.7.255 scope global secondary eno16777984 valid_lft forever preferred_lft forever inet6 fe80::3:1ff:febe:6/64 scope link valid_lft forever preferred_lft forever
こちらでも10.32.4.1がちゃんと設定されていますね。
まとめと注意点
セカンダリIPを使いたい時は、まずはどのような利用をするかに沿って方法を選択しましょう。ちなみに以前セカンダリIPを使ってLVSを冗長化する記事も書いたのでご参考ください。
手順①のAPI経由で取得したセカンダリIPの扱いには、2つ注意点がありますのでご参考ください。
- セカンダリIPはIDCFクラウドコンソールからの管理ができないので、ご自身での管理となります。
- セカンダリIPをグローバルIPとスタティックNATした場合、APIでスタティックNATを解除してから仮想マシンを削除するようにしてください。スタティックNATの設定解除せず、そのまま仮想マシンを削除してしまうとシステム側からスタティックNATが削除できなくなってしまいます。
方法2については特に注意点はないのですが、紹介したCentOS6と7の方法は両方ともネットワークの再起動が伴うため、動的にIPを追加したい場合はip addr addコマンドなどで追加することも可能です。
ぜひ、試してみてください。