AzureのLinux VMにNICを追加してマルチNIC構成にする方法|管理用・データ用サブネット分離のazコマンド実践手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのLinux VMにNICを追加してマルチNIC構成にする方法|管理用・データ用サブネット分離のazコマンド実践手順
「Azure Linux VMを複数のサブネットに同時接続したいが、どうすれば管理用ネットワークと業務用ネットワークを1台のVMで分離できるのか分からない」

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の上限が決まっている


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ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-sizesAzure公式ドキュメント で確認できます。以下のコマンドで現在のVMに設定されたサイズを確認してください。

# VMサイズとNIC数の確認 az vm show \ --resource-group myResourceGroup \ --name myLinuxVM \ --query "{vmSize:hardwareProfile.vmSize, nicCount:length(networkProfile.networkInterfaces)}" \ --output table

制約2:プライマリNICは削除不可

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

SSHアクセスはこの管理用NIC(10.0.1.0/24)経由のみに限定します。パブリックIPが必要な場合は、別途 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

Linux VM内でも 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

割り当て解除が完了するまで1~3分程度かかります。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

eth0(プライマリ)に加えて eth1(追加NIC)が表示されれば、Azureのアタッチ作業は完了です。

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

10.0.2.4(eth1)からの応答パケットも、デフォルトゲートウェイ(10.0.1.1 via eth0)を経由してしまいます。これを修正します。

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経由でpingや通信テストを行い、正しくルーティングされることを確認します。

# 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"

設定内容はNetworkManagerが /etc/NetworkManager/system-connections/ に保存するので、再起動後も設定が維持されます。

トラブルシュート

NICを追加してもLinux上にデバイスが表示されない

az vm nic add 後にVMを起動したのに、ip link でeth1が表示されない場合、以下を確認します。

・VMが割り当て解除(Deallocated)の状態でNICを追加したか確認する。Stopped状態では操作できない。
az vm show --query "networkProfile" でAzure上のNICアタッチが完了しているか確認する。
・VMを一度 az vm stopaz vm deallocateaz 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構築からインフラ管理まで一気に習得できます。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。