8
15

More than 3 years have passed since last update.

CentOSのKVMで使う仮想ネットワークについて調べてみた

Last updated at Posted at 2019-12-25

はじめに

CentOSのKVMで使う仮想ネットワークについて調べてみました

まとめ

  • 仮想マシンをネットワークに接続するにはvirbr0またはbr0の仮想ブリッジを作成する必要がある
  • 仮想ブリッジとは仮想スイッチ
  • 仮想ブリッジの種類は2種類。virbr0とbr0
    • vibr0よりはbr0がよく使われていて、その場合vibr0は削除することが多い
  • ip aで見えるvnetXとは
    • Tapデバイスのこと。ブリッジ(仮想スイッチ)のポートのようなイメージ
  • 仮想ブリッジと物理NICの接続
    • ifcfg-eth0ファイルを編集することでbr0仮想ブリッジとeth0を接続する

仮想ネットワークの概要

KVMではホストLinuxの仮想ブリッジ機能を利用して仮想ネットワークを構成します。
仮想ブリッジは,ホストLinux上に仮想的なL2スイッチを構成する機能です。
複数の仮想ブリッジを構成することも可能です。

イメージ

【仮想マシン】【仮想マシン】
////////////  //////////// 
  プロセス     プロセス
     ↓         ↓
  仮想NIC         仮想NIC
////////////  ////////////    
   ↓           ↓
////////////////////////////////////////////////// 【ホストLinux】
   ↓                ↓
TAPデバイス    TAPデバイス   
   ↓           ↓
###########仮想ブリッジ############# virbr0/br0 **仮想的なL2スイッチ**
         ↓  iptables (virbr0) or ブリッジ接続 (br0)
          物理NIC(eth0)
//////////////////////////////////////////////////

仮想マシンをネットワークに接続するにはvirbr0またはbr0の仮想ブリッジを作成する必要がある

仮想ブリッジとは?

  • 仮想ブリッジは,ホストLinux上に仮想的なL2スイッチを構成する機能
  • ホストOSのネットワークをブリッジ化するとは?
    • 仮想マシンとホストLinuxのネットワークを共有すること
    • ホストOSをインストールしたとき、そのネットワークインターフェースはeth0になっています
    • これをホストOSとゲストOSで共有するために、仮想的なブリッジをホストOSに作ってeth0を接続する方法に切り替えます。

virbr0、br0とは?

  • 仮想ブリッジの名前
  • 違い

virbr0とは?

  • virbr0 とは仮想環境でNAT 変換の役割を行う仮想ブリッジ
  • KVM仮想環境を構築する場合に標準で導入

http://tooljp.com/linux/Redhat7/faqRedhat7/html/what-is-virbr.html
https://www.orangetakam.com/blog/?p=1034

vibr0の構成

  • 仮想ブリッジから物理NICにiptablesで向けている
  • iptablesのNAT(IPマスカレード)機能を利用
  • 仮想ブリッジに対してIPアドレスをアサインして,仮想マシンのゲストOSでは,これをデフォルトゲートウェイに指定
  • このゲートウェイに到達したパケットについては,送信元IPアドレスを物理NICのIPアドレスに変換して外部ネットワークに送出
  • 仮想ブリッジに接続された仮想マシン全体は,外部のネットワークとは独立したプライベート・ネットワークを構成
  • 仮想マシンから外部のサーバに接続することは可能ですが,仮想マシン上のサーバ・アプリケーションに外部から接続することはできません
  • vibr0はlibvirtdサービスが管理しており,virt-managerから追加/削除などの管理作業する
  • ホストLinux上で稼働するdnsmasqプロセスにより,DHCPサーバとDNSサーバの機能が提供されます。ゲストOSのIPアドレスをDHCPで自動設定することが可能です。また,外部ネットワークとの接続に必要なiptablesの設定は,libvirtdサービスが起動したタイミングで自動的に行われます。

イメージ

【仮想マシン】【仮想マシン】
////////////  //////////// 
 プロセス      プロセス
   ↓          ↓
 仮想NIC         仮想NIC
////////////  ////////////    
   ↓         ↓
////////////////////////////////////////////////// 【ホストLinux】
   ↓              ↓
TAPデバイス  TAPデバイス   
   ↓         ↓
###########仮想ブリッジ############# virbr0 **仮想的なL2スイッチ**
         ↓  iptables (virbr0) 
          物理NIC(eth0)
//////////////////////////////////////////////////

br0とは?

  • vibr0と同じく仮想マシンをネットワークに接続するための仮想スイッチ
  • 標準では作成されていない
  • vibr0よりはbr0がよく使われている

ホストLinuxの物理NICを仮想ブリッジに接続する構成

  • ホストLinuxのネットワーク設定ファイルを直接に編集する必要

イメージ

【仮想マシン】【仮想マシン】
////////////  //////////// 
 プロセス    プロセス
   ↓        ↓
 仮想NIC         仮想NIC
////////////  ////////////    
   ↓         ↓
////////////////////////////////////////////////// 【ホストLinux】
   ↓              ↓
TAPデバイス   TAPデバイス   
   ↓         ↓
###########仮想ブリッジ############# br0 **仮想的なL2スイッチ**
         |  接続 
          物理NIC(eth0)
//////////////////////////////////////////////////

br0ブリッジの作成

nmcliで作成

# nmcli con add type bridge ifname br0
# nmcli con modify bridge-br0 bridge.stp no
# nmcli con modify bridge-br0 ipv4.method manual ipv4.address "192.168.199.100/24" ipv4.gateway "192.168.199.254"

KVMホストの物理ポートenp0s25をブリッジに接続します。

# nmcli con add type bridge-slave ifname enp0s25 master bridge-br0

ゲストOSをブリッジに接続する
仮想マシンのGUIから設定

手動で作成

ifcfg-br0を作成

$ cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE="Bridge"    ### 
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"

br0仮想ブリッジとeth0を接続する

ifcfg-eth0の設定

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
HWADDR="52:54:00:xx:xx:xx"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
BRIDGE="br0"

TAPデバイスとは?

  • TUN/TAPは仮想ネットワークデバイス及びそのデバイスドライバの実装およびデバイス名
  • TAP(Terminal Access Point) は、イーサネットデバイスをシミュレートし、データリンク層を操作できる。
  • TUN(TUNnel) はネットワーク層をシミュレートし、IPパケットなどを操作できる

OSがTUN/TAPデバイスに送ったパケットは、そのデバイスに接続しているユーザープログラムに送信される。
また、ユーザープログラムからTUN/TAPデバイスに送られたパケットは、TUN/TAPデバイスはそれらのパケットをOSのプロトコルスタックに渡すので、
OS側からはあたかも外部からパケットを受け取ったように見える。
用途としては、たとえばTAPはブリッジに使われ、TUNはルーティングに使われる。

ブリッジ(仮想スイッチ)のポートのようなイメージ

OSがTUN/TAPデバイスに送ったパケットは、そのデバイスに接続しているユーザープログラムに送信される。

自分で投げたデータがそのまま自分のOSに届くような動作をするデバイスなのですね。
デバイスとしてそういう動作をするものを用意しておくと、プロセスから見ると便利な場面が多々あるという事かな。

TAPはL2で動作する仮想デバイス。
例えば、仮想ブリッジはL2だけで動作するものなので作成した時のポートにはTAPデバイスを追加していく。

TUNはL3で動作する仮想デバイス。
L3つまりIP層で動作する。なのでRubyの例の様なトンネルデバイスを作成する場合に利用する。

vnetX (X = 1, 2, …)

  • 仮想マシンとホストマシンが通信するために使用するTAPデバイスです
  • ホストLINUX側からみたTAPデバイス

virbrY (Y = 1, 2, …)

  • 仮想スイッチです。仮想ネットワークの作成順に連番が振られていきます
  • KVMをインストールした時点では、virbr0がデフォルトで作成されています
8
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
15