Azureには仮想マシンに複数のNIC(ネットワークインターフェイス)をアタッチし、それぞれ別のサブネットに接続する「マルチNIC構成」があります。管理用とデータ転送用でネットワークを分離したいとき、またはセキュリティ要件でインターネット向き・プライベート向きを物理的に切り離したいときに有効です。
この記事では、Azure CLIを使ったマルチNIC構成の実践手順を解説します。新規VM作成時に複数NICをアタッチする方法と、既存VMへの後付け追加、さらにLinux側で必須となるポリシーベースルーティングの設定まで、コマンド実行例とともに一通りカバーします。
動作確認環境:Ubuntu 24.04 LTS(Azure Standard_D2s_v3、japaneast)、Azure CLI 2.65.0
この記事のポイント
・az vm nic addで既存VMにNICを後から追加できる
・マルチNICはVMを停止(割り当て解除)してから操作する
・Linux側でip ruleを使わないとセカンダリNICの通信が正しく流れない
・VMサイズごとにアタッチできるNICの上限が決まっている
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜLinux VMにNICを複数アタッチするのか
1台のLinux VMに複数のNICを接続する理由は、主に以下の3つです。・管理用とデータ転送用の分離:SSHやAnsibleによる管理通信を管理サブネット経由に限定し、アプリケーションのデータ通信は別サブネットを使う構成。NTT/ISP系のシステム設計でよく使われます。
・セキュリティゾーンの分離:インターネットに接続するDMZサブネット(フロントエンド)と、DBサーバーなどが属するプライベートサブネット(バックエンド)の両方に同一VMを接続し、ファイアウォールVM・プロキシVMを実現する。
・高帯域用途の分離:NFS・iSCSI・バックアップなどのストレージ通信専用NICを追加して、業務通信との帯域干渉を避ける。
AWS EC2では「複数のENI(Elastic Network Interface)をアタッチする」という操作に相当します。Azureでは「NIC(Network Interface Controller)を複数アタッチ」と呼びます。操作の概念はほぼ同一です。
マルチNIC構成の前提条件と制約
Azureでマルチ NICを使う前に確認すべき制約が2点あります。制約1:VMサイズごとのNIC上限
アタッチできるNICの最大数はVMサイズ(SKU)によって異なります。
| VMサイズ | 最大NIC数 | vCPU |
|---|---|---|
| Standard_B1s / B1ms | 2 | 1 |
| Standard_D2s_v3 | 2 | 2 |
| Standard_D4s_v3 | 4 | 4 |
| Standard_D8s_v3 | 8 | 8 |
VMサイズのNIC上限は
az vm list-sizes や Azure公式ドキュメント で確認できます。以下のコマンドで現在のVMに設定されたサイズを確認してください。# VMサイズとNIC数の確認 az vm show \ --resource-group myResourceGroup \ --name myLinuxVM \ --query "{vmSize:hardwareProfile.vmSize, nicCount:length(networkProfile.networkInterfaces)}" \ --output table
VM作成時に最初にアタッチしたNICはプライマリNICとなり、VM稼働中は取り外せません。プライマリNICを変えたい場合は、VMを再作成する必要があります。
マルチNIC用のVNetとサブネットを準備する
1. リソースグループとVNetを作成する
既存のVNetを使う場合はこの手順をスキップして構いません。# リソースグループを作成(japaneastリージョン) az group create \ --name myResourceGroup \ --location japaneast # VNetを作成(アドレス空間: 10.0.0.0/16) az network vnet create \ --resource-group myResourceGroup \ --name myVNet \ --address-prefix 10.0.0.0/16
{ "newVNet": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "location": "japaneast", "name": "myVNet", "provisioningState": "Succeeded" } }
2. 管理用サブネットと業務用サブネットを作成する
管理用(10.0.1.0/24)と業務用(10.0.2.0/24)の2つのサブネットを作成します。それぞれ後でNICをアタッチします。# 管理用サブネット(プライマリNICをここに接続) az network vnet subnet create \ --resource-group myResourceGroup \ --vnet-name myVNet \ --name subnet-mgmt \ --address-prefix 10.0.1.0/24 # 業務用サブネット(セカンダリNICをここに接続) az network vnet subnet create \ --resource-group myResourceGroup \ --vnet-name myVNet \ --name subnet-data \ --address-prefix 10.0.2.0/24
Linux VMをマルチNICで新規作成する手順
1. プライマリNIC(管理用)を作成する
az network nic create でNICを事前に作成し、VMに渡します。# プライマリNIC(管理用サブネットに接続、パブリックIPあり) az network nic create \ --resource-group myResourceGroup \ --name nic-mgmt \ --vnet-name myVNet \ --subnet subnet-mgmt \ --public-ip-address "" \ --private-ip-address 10.0.1.4
az network public-ip create で作成して --public-ip-address に指定してください。2. セカンダリNIC(業務用)を作成する
# セカンダリNIC(業務用サブネットに接続、パブリックIPなし) az network nic create \ --resource-group myResourceGroup \ --name nic-data \ --vnet-name myVNet \ --subnet subnet-data \ --private-ip-address 10.0.2.4
3. az vm createで両NICをアタッチしてVMを作成する
--nics オプションに複数のNIC名を指定します。最初に指定したNICがプライマリになります。# マルチNICでLinux VM(Ubuntu 24.04)を作成 az vm create \ --resource-group myResourceGroup \ --name myLinuxVM \ --image Ubuntu2404 \ --size Standard_D2s_v3 \ --nics nic-mgmt nic-data \ --admin-username azureuser \ --generate-ssh-keys \ --no-wait
--nics に複数のNIC名を指定する場合は、 --public-ip-address オプションは使えません(NIC作成時にパブリックIPを紐づけてください)。4. VM起動後にNIC一覧を確認する
VMが起動したら、アタッチされているNICの一覧をAzure CLIで確認します。az vm show \ --resource-group myResourceGroup \ --name myLinuxVM \ --query "networkProfile.networkInterfaces[].{id:id, primary:primary}" \ --output table
Id Primary ------------------------------------------------------------------- --------- /subscriptions/xxxx/resourceGroups/myRG/providers/.../nic-mgmt True /subscriptions/xxxx/resourceGroups/myRG/providers/.../nic-data None
ip link または ip addr を実行してNICが認識されていることを確認します。# VM内で実行 ip addr show # 出力例(抜粋) # 2: eth0:
mtu 1500 state UP # inet 10.0.1.4/24 brd 10.0.1.255 scope global eth0 # 3: eth1: mtu 1500 state UP # inet 10.0.2.4/24 brd 10.0.2.255 scope global eth1
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Azureの学習をもっと体系的に進めたいなら、Azure実践ハンズオン講座をご覧ください。現役エンジニアが教える実務直結カリキュラムで、VM構築からインフラ管理まで一気に習得できます。
既存のLinux VMにNICを後から追加する方法
1. VMを停止・割り当て解除する
NICの追加・削除はVMが停止(割り当て解除)された状態でのみ可能です。単に「停止」しただけ(Stopped状態)では操作できないので、必ずaz vm deallocate を使います。# VMを割り当て解除(課金も止まります) az vm deallocate \ --resource-group myResourceGroup \ --name myLinuxVM
az vm show --query "powerState" で "VM deallocated" を確認してから次の手順へ進んでください。2. az vm nic addでNICを追加する
追加するNICは事前にaz network nic create で作成しておきます。# 追加するNICをあらかじめ作成(業務用サブネット) az network nic create \ --resource-group myResourceGroup \ --name nic-data \ --vnet-name myVNet \ --subnet subnet-data \ --private-ip-address 10.0.2.4 # 既存VMにNICを追加 az vm nic add \ --resource-group myResourceGroup \ --vm-name myLinuxVM \ --nics nic-data
{ "networkProfile": { "networkInterfaces": [ { "id": "...nic-mgmt", "primary": true }, { "id": "...nic-data", "primary": null } ] } }
3. VMを起動してLinux上で確認する
# VMを起動 az vm start \ --resource-group myResourceGroup \ --name myLinuxVM # SSH接続後、NICの認識を確認 ip link show
Linux側のルーティング設定(マルチNICのデフォルトゲートウェイ問題)
複数のNICがある場合、Linuxはデフォルトゲートウェイを1つしか持てないため、セカンダリNIC(eth1)経由の通信が意図したとおりに流れないことがあります。これはAzureに限らずLinux共通の問題です。解決策はポリシーベースルーティング(Policy Based Routing / PBR)です。送信元IPアドレスによって異なるルーティングテーブルを選択する仕組みです。
1. ip routeで現在のルーティングを確認する
# デフォルトルートを確認(eth0のゲートウェイのみが登録されているはず) ip route show
default via 10.0.1.1 dev eth0 proto dhcp 10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.4 10.0.2.0/24 dev eth1 proto kernel scope link src 10.0.2.4
2. ip ruleでポリシーベースルーティングを設定する
セカンダリNIC(eth1)専用のルーティングテーブルを作成し、eth1の送信元IPからの通信はそのテーブルを使うよう ip rule で指定します。# Azureのデフォルトゲートウェイは各サブネットの.1アドレス # eth1(10.0.2.4)のゲートウェイは 10.0.2.1 # カスタムルーティングテーブル(100)にデフォルトルートを追加 ip route add default via 10.0.2.1 dev eth1 table 100 ip route add 10.0.2.0/24 dev eth1 src 10.0.2.4 table 100 # 送信元が 10.0.2.4 のパケットはテーブル100を参照 ip rule add from 10.0.2.4 lookup 100
# eth1経由での疎通確認(送信元IPを明示して実行) ping -I eth1 10.0.2.1 # または送信元IPを指定 ping -I 10.0.2.4 10.0.2.1
3. NetworkManagerで恒久設定する
上記のip rule / ip route 設定はOSを再起動すると消えます。Ubuntu 24.04はNetworkManager(nmcli)で管理されているため、設定ファイルで恒久化します。# eth1の接続名を確認 nmcli connection show # eth1接続にルーティングルールを追加 nmcli connection modify "Wired connection 2" \ ipv4.routes "10.0.2.0/24 10.0.2.1 100" \ ipv4.routing-rules "priority 100 from 10.0.2.4 table 100" # NetworkManagerを再起動して設定を反映 nmcli connection down "Wired connection 2" nmcli connection up "Wired connection 2"
トラブルシュート
NICを追加してもLinux上にデバイスが表示されない
az vm nic add 後にVMを起動したのに、ip link でeth1が表示されない場合、以下を確認します。・VMが割り当て解除(Deallocated)の状態でNICを追加したか確認する。Stopped状態では操作できない。
・
az vm show --query "networkProfile" でAzure上のNICアタッチが完了しているか確認する。・VMを一度
az vm stop → az vm deallocate → az vm start のサイクルで再起動してみる。それでも表示されない場合は、Azureのゲストエージェント(walinuxagent)の状態を確認します。
systemctl status walinuxagent
セカンダリNICからの通信が想定どおりに流れない
最も多いのは上述のデフォルトゲートウェイ問題です。ip rule によるポリシーベースルーティングを設定しても解消しない場合は、以下を確認します。・NSG(ネットワークセキュリティグループ)のインバウンド/アウトバウンドルールでセカンダリNICが属するサブネットへの通信が許可されているか確認する。
・Azure側で「NIC上のIPフォワーディング」が必要な場合(ルーターVM・プロキシVM)は
az network nic update --ip-forwarding true で有効化する。# nic-dataのIPフォワーディングを有効化(ルーターVMとして使う場合) az network nic update \ --resource-group myResourceGroup \ --name nic-data \ --ip-forwarding true
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| VMサイズのNIC上限を確認する | az vm show --query "hardwareProfile.vmSize" |
| NICを新規作成する | az network nic create --vnet-name VNet --subnet サブネット |
| マルチNICでVMを新規作成する | az vm create --nics nic-mgmt nic-data |
| VMを割り当て解除する | az vm deallocate --resource-group RG --name VM |
| 既存VMにNICを追加する | az vm nic add --vm-name VM --nics nic-data |
| セカンダリNIC用のルーティングテーブルを作成する | ip route add default via GW dev eth1 table 100 |
| 送信元IPでルーティングを切り替える | ip rule add from 10.0.2.4 lookup 100 |
| IPフォワーディングを有効化する | az network nic update --ip-forwarding true |
Azureの学習をもっと体系的に進めたいなら、Azure実践ハンズオン講座をご覧ください。現役エンジニアが教える実務直結カリキュラムで、VM構築からインフラ管理まで一気に習得できます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AzureのTerraformでVNetとLinux VMをコード化する方法|azurermプロバイダーの設定からapply・destroy実践まで
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます