hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

ラベル network の投稿を表示しています。 すべての投稿を表示
ラベル network の投稿を表示しています。 すべての投稿を表示

2011-11-12

Scientific Linux 6.1のネットワーク設定ファイルの項目についての説明を調べた

KVMを入れようと思ってふと見ると/etc/sysconfig/network-scripts/ifcfg-eth0は以下のようになっていました(HWADDRの値は伏せてます)。
DEVICE="eth0"
BOOTPROTO="none"
HWADDR="XX:XX:XX:XX:XX:XX"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE=Ethernet
IPADDR=192.168.11.103
PREFIX=24
GATEWAY=192.168.11.1
DNS1=192.168.11.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
NAME="System eth0"

RHEL6のリファレンスDeployment Guideを見ても載ってない項目がありました。

NM_CONTROLLEDは10.2. Bridged networking with libvirtに説明がありました。

IPV6INITとIPV6_AUTOCONFは「site: docs.redhat.com」付きで検索しても説明が見つけられず。1次情報ではないですがRed Hat / CentOS IPv6 Network ConfigurationPeter Bieringer's IPv6-HowTo - Script Files (3.15+)に説明を見つけました。

IPV4_FAILURE_FATALやNAMEは◇ネットワークの詳細設定(CentOS6)◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆に説明を見つけました。

2010-12-19

CentOSのKVMのゲストOSに2枚目のネットワークカードを追加

ゲストOSが1枚のネットワークカードでブリッジで動いていることとホスト側では2枚のネットワークカードの両方をブリッジに設定済みであることを前提とします。
なお、この方法は試しにやってみたらできたという手順なので、もっとよい手順があるかもしれません。

ゲストOSで/etc/sysconfig/network-scripts/ifcfg-eth0をコピーしてifcfg-eth1を作成し、適宜編集。MACアドレスを適当に変更(但し頭の54:52:00:は変えずに下3オクテットのみを変えます。上3オクテットはKVMで決まっている値のため(ソース失念))。
また/etc/sysconfig/networkのGATEWAYも編集(hnakamur’s blog: CentOSでネットワークカード2枚挿しの場合のゲートウェイの設定を参照)。

ゲストOSをシャットダウン。

ホストOSでドメインのxml(/etc/libvirt/qemu/<ドメイン名>.xml)を編集。interfaceのタグをコピペして、mac addressを先程ゲストOSでeth1に割り当てた値にし、bridgeをホストのもう一つのブリッジデバイス(br1)にします。
<domain type='kvm'>
  …(略)…
  <devices>
    …(略)…
    <interface type='bridge'>
      <mac address='54:52:00:4f:0a:85'/>
      <source bridge='br0'/>
    </interface>
    <interface type='bridge'>
      <mac address='54:52:00:4f:0a:86'/>
      <source bridge='br1'/>
    </interface>
    …(略)…
  </devices>
</domain>

以下のコマンドで設定を反映。
# virsh define /etc/libvirt/qemu/<ドメイン名>.xml

CentOSでネットワークカード2枚挿しの場合のゲートウェイの設定

この説明ではeth0をLAN側、eth1をWAN側とします。
GATEWAYの設定は/etc/sysconfig/network-scripts/のifcfg-eth0とifcfg-eth1ではコメントアウトして/etc/sysconfig/networkにeth1のGATEWAYを書く(GATEWAYDEVは書かなくても大丈夫でした)。
DNS1、DNS2の設定は/etc/sysconfig/network-scripts/のifcfg-eth0ではコメントアウトしてifcfg-eth1では有効にする。

その後以下のコマンドで設定を反映。
# /etc/init.d/network reload

参考:
Reference Guide
ルータにするための基本設定

2009-08-26

libvirtでNAT構成にするための設定

ブリッジを止めてNATに切り替えたわけ

KVMのゲストOSのネットワークをブリッジにするの環境でkeepalivedでのVRRPの実験は成功したのですが、DSR構成でのロードバランサの実験がどうもうまくいきませんでした。仮想環境でのネットワーク構築がよくわかっていない私がいきなり上級者編のDSRにチャレンジというのに無理があったということで、まずはNAT構成でチャレンジすることにしてみました。

libvirtでNAT構成

libvirt: Wiki: Networkingを参考にしました。また、今まではゲストOSを実運用に近い設定にしようとして固定IPにしていましたが、virt-cloneでゲストOSイメージをコピーしたあとにゲストOS毎に設定を変えるのが面倒なので、今回から極力ゲストOS毎の設定変更箇所を少なくするという方針に変更しました。

試行錯誤しながらホストOSでのlibvirtの設定変更を変更したので、手順は無しで設定ファイルだけメモしておきます。

ホストOS (Ubuntu) の設定

/etc/libvirt/qemu/networks/default.xml

<network>
  <name>default</name>
  <uuid>212ea219-055f-bd26-1c76-52817e607642</uuid>
  <bridge name="virbr%d" />
  <forward mode="nat"/>
  <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.122.100" end="192.168.122.254" />
      <host mac="52:54:00:12:34:56" name="vm10" ip="192.168.122.11" />
      <host mac="52:54:00:12:34:57" name="vm11" ip="192.168.122.12" />
    </dhcp>
  </ip>
</network>

/etc/libvirt/qemu/vm10.xml

<domain type='kvm'>
  <name>vm10</name>
  <uuid>35e92166-78c8-641f-15d7-5a30af377d55</uuid>
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='i686' machine='pc'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <source file='/home/hnakamur/kvm_work/vm10.qcow2'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <disk type='file' device='cdrom'>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <interface type='network'>
      <mac address='52:54:00:12:34:56'/>
      <source network='default'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
  </devices>
</domain>

/etc/sysctl.confでは以下の設定変更をしてsysctl -pで読み込みました。

net.ipv4.ip_forward=1

/etc/resolv.conf

nameserver 192.168.122.1
nameserver 192.168.11.1

ゲストOS (CentOS) の設定

/etc/sysconfig/network (ホスト名はDHCPで設定するので空にしました)

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=

/etc/resolv.conf

nameserver 192.168.122.1

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
DNS1=192.168.122.1

(追記) その後試していると/etc/resolv.confの設定が消されてしまってeth0が上がらないことがありました。/etc/sysconfig/network-scripts/ifcfg-eth0にDNS1=で指定しておくとOKでした。これがまっとうなのかはわかりませんが、とりあえずこれで。

(2009-08-27追記) CentOSのDeployment Guideの14.2. Interface Configuration Filesに説明がありました。PEERDNSがyesの場合DNS1とDNS2に指定した値で/etc/resolv.confが修正されます。dhcpの場合PEERDNSのデフォルト値はyesです。

ホストOSでのlibvirtの設定の試行錯誤

手順として整理したものは無いのですが、どんな試行錯誤をしたかのメモを書いておきます。

/etc/libvirt/qemu/networks/default.xmlの変更と反映での試行錯誤

libvirt: Wiki: Networkingを参考にしたのですが、結局のところvirshを起動してhelpコマンドで出てくるネット関連のコマンド(net-*)を手当たり次第に試して変更しました。net-editで変更してみたり、net-destroyやnet-undefineで消してからnet-createで作り直したり。net-destroyかnet-undefineを実行したときは、/etc/libvirt/qemu/networks/default.xmlが消えてしまって慌てたりしました。事前にバックアップをとっておいたほうがいいです。

また途中でnet-editを実行したときに

error: invalid network pointer in no network with matching uuid
というエラーが出て困りました。どうやら、/etc/libvirt/qemu/networks/default.xmlを直接エディタで変更したのがよくなかったようで、常にnet-editで編集するようにしておいたほうがいいみたいです。あと、確か元々の/etc/libvirt/qemu/networks/default.xmlにはuuidの要素は無かったのが、net-editで見たときは入っていました。/etc/libvirt/qemu/networks/default.xmlはテンプレートみたいなものでvmを作るときにそこからコピーされるのかとも思ったのですが、net-editで編集した結果は/etc/libvirt/qemu/networks/default.xmlに反映されるようです。そのときにどこか別の場所にも反映されているのかな、まだよくわかってないです。

ゲストOSでのlibvirt組み込みのDNSサーバーdnsmasqの設定変更の試行錯誤

libvirt: Wiki: Networking

If you are already running dnsmasq on your machine, please see libvirtd and dnsmasq.
という説明があります。libvirt: Wiki: Libvirtd and dnsmasqを読んで、psで見てみるとdnsmasqのプロセスがありますが/etc/dnsmasq.confはありませんでした。というわけでこれはlibvirtが起動したもののようです。ただ、/etc/init.d/dnsmasqとかはないんですよね。Bug #231060 in libvirt (Ubuntu): “packages dnsmasq and libvirt-bin conflict with each other”とかが関係ありそうですが、とりあえずスルーしました。

libvirtのネットワークをうまく設定できた今の状態ではpsで見るとこんな感じです。

# ps auxww|grep dnsmasq
root      5077  0.0  0.0   2076   564 pts/7    S+   00:52   0:00 grep dnsmasq
nobody   31008  0.0  0.0   2388   716 ?        S    Aug26   0:00 dnsmasq --strict-order
 --bind-interfaces --pid-file=/var/run/libvirt/network/default.pid --conf-file=  
--listen-address 192.168.122.1 --except-interface lo --dhcp-range 192.168.122.100,192.168.122.254
 --dhcp-host 52:54:00:12:34:56,vm10,192.168.122.11 --dhcp-host 52:54:00:12:34:57,vm11,192.168.122.12

こうなるまでにいろいろ試行錯誤しました。/etc/libvirt/qemu/networks/default.xmlの<dhcp>タグの設定に対応していることはわかったのですが、viやvirsh net-editで変更するだけでは反映されないようなので、killして上げ直そうとしたのですが起動方法をまた試行錯誤するはめに。どうやらnet-startのときに同時にあがるのかと思いきや

virsh# net-start default
error: Failed to start network default
error: internal error network is already active
というエラーになったり。1

今、再度試してみたところ以下の手順でとりあえず変更できることを確認しました。

virsh # net-destroy default

ここでviで/etc/libvirt/qemu/networks/default.xmlを編集

virsh # net-create /etc/libvirt/qemu/networks/default.xml
Network default created from /etc/libvirt/qemu/networks/default.xml

net-createを実行した時点でdnsmasqのプロセスが上がっていました。

さらに一覧を確認して自動実行する設定にします。

virsh # net-list --all
Name                 State      Autostart
-----------------------------------------
default              active     no
virsh # net-autostart default
error: failed to mark network default as autostarted
error: Failed to create symlink '/etc/libvirt/qemu/networks/autostart/default.xml' 
to '/etc/libvirt/qemu/networks/default.xml': File exists

別端末にて/etc/libvirt/qemu/networks/autostart/default.xmlというシンボリックリンクを削除します。

# ls -l /etc/libvirt/qemu/networks/autostart/default.xml 
lrwxrwxrwx 1 root root 38 Aug 26 20:43 /etc/libvirt/qemu/networks/autostart/default.xml -> /etc/libvirt/qemu/networks/default.xml
# rm /etc/libvirt/qemu/networks/autostart/default.xml

これでようやく設定変更できた状態でdnsmasqが起動できたと思ったら今度は、ゲストOSの変更前のIPアドレスがキャッシュされて残っていたようでdigコマンドで引いても古い値を返されてしまいました。そこでkillして

# dnsmasq --clear-on-reload

を実行した後再度killしてvirshでnet-destroy、net-createとして再起動などとしてなんとかdigで新しい設定のIPアドレスが返されるところまでこぎつけました。このへんの手順も試行錯誤してたまたま見つけただけで、まっとうな手順はまだよくわかっていません。が、とりあえず目的は達成できたのでよしということで。

DHCPの恩恵

ホストOSもゲストOSも192.168.122.1のdnsmasqを使うようにしたので、/etc/hostsからvm10とvm11のエントリを削除できました。DHCPといっても、/etc/libvirt/qemu/networks/default.xmlの<host>タグでMACアドレスに対してホスト名とIPアドレスを指定しているので、各vmのIPアドレスが変動することはありません。

2009-09-29追記

  1. これはdnsmasqのプロセスが残っていたからでした。単にpsでdnsmasqのPIDを調べてkillした後、net-defineコマンドでxmlの内容を反映し、net-startコマンドでdnsmasqを起動します。ちなみに、net-destroyは定義ファイルを削除するのでやりすぎです。

2010-09-19追記

定義ファイルごと削除されるのはnet-undefineを実行したときです。net-destroyはdnsmasqのプロセスを止めます。

2010-12-16追記

DHCPで運用しているとゲストを上げたまま一日ぐらいたつとゲストのIPアドレスが消失してネットワークが繋がらなくなるという現象を何度か体験しました。仕方が無いのでDHCPはやめて静的にIPアドレスを指定する運用に切り替えました。

2009-08-25

QEMU WikiのSlirpやTapについての解説がわかりやすい

QemuNetwork - #qemu WikiからたどれるSlirpやTapの解説が非常に分かりやすかったです。後から読み返すこともありそうなのでメモ。

  • Slirpについての説明
    • ルート権限が無くても使えます。→Slirpによるネットワークはuser mode networkingあるいは略してuser networkingとかuser-netとも呼ばれます。
    • Slirp自体はダイアルアップの時代にSLIP接続とのやりとりをソケットに見せかけるために作られたプログラムのことです。
    • KVMのネットワークページのUser Networkingセクションに対応します。
  • Tapに付いての説明
    • The 'tap' deviceの項とNote5:によると、Tapはホスト・ゲスト間の通信に使われるそうです。LinuxやBSDのカーネルでは直接eth0にパケットを送るということはできないので、間にtap0を挟む必要があるということです。で、tap0からホストを宛先にして送ればホストのeth0に届くということになります。
    • Possibility 2: NAT routing with one "external" net, and one "virtual internal" LANsがKVMのネットワークページのprivate virtual bridgeセクションに対応します。
    • Possibility 3: NO routing, one LAN made up of real and virtual devicesがKVMのネットワークページのpublic bridgeセクションやKVM Networking - Community Ubuntu DocumentationのCreating a network bridge on the hostセクションに対応します。

WiresharkのCLI版tsharkのインストール

Wiresharkとは

WiresharkはネットワークプロトコルアナライザEtherealの後継にあたるらしい。

インストール

リモートのサーバーにsshで入って使うことを想定しているのでGUI版ではなくCLI版を使います。CLI版のコマンドはtsharkです。

CentOS 5.2の場合

# yum install wireshark

ちなみにGUI版のパッケージ名はwireshark-gnome

Ubuntu 9.04の場合

$ sudo aptitude install tshark

ちなみにGUI版のパッケージ名はwireshark

テスト

CLI版のコマンドはtsharkです。

# tshark -n -i br0 tcp port 80

別の端末で以下のコマンドを実行。

$ telnet 192.168.11.241 80
GET /

tsharkの端末で^Cを入力。出力結果はこんな感じ。

# tshark -n -i br0 tcp port 80
Running as user "root" and group "root". This could be dangerous.
Capturing on br0
  0.000000 192.168.11.102 -> 192.168.11.241 TCP 36674 > 80 [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=1738335 TSER=0 WS=6
  0.000905 192.168.11.241 -> 192.168.11.102 TCP 80 > 36674 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 TSV=3965771 TSER=1738335 WS=4
  0.000978 192.168.11.102 -> 192.168.11.241 TCP 36674 > 80 [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=1738335 TSER=3965771
  1.362928 192.168.11.102 -> 192.168.11.241 HTTP GET /
  1.363635 192.168.11.241 -> 192.168.11.102 TCP 80 > 36674 [ACK] Seq=1 Ack=8 Win=5792 Len=0 TSV=3967134 TSER=1738471
  1.364764 192.168.11.241 -> 192.168.11.102 HTTP Continuation or non-HTTP traffic 
  1.364829 192.168.11.102 -> 192.168.11.241 TCP 36674 > 80 [ACK] Seq=8 Ack=22 Win=5888 Len=0 TSV=1738471 TSER=3967135
  1.364852 192.168.11.241 -> 192.168.11.102 TCP 80 > 36674 [FIN, ACK] Seq=22 Ack=8 Win=5792 Len=0 TSV=3967136 TSER=1738471
  1.365315 192.168.11.102 -> 192.168.11.241 TCP 36674 > 80 [FIN, ACK] Seq=8 Ack=23 Win=5888 Len=0 TSV=1738471 TSER=3967136
  1.366978 192.168.11.241 -> 192.168.11.102 TCP 80 > 36674 [ACK] Seq=23 Ack=9 Win=5792 Len=0 TSV=3967138 TSER=1738471
^C10 packets captured

ちなみにtcpdumpの場合はこんな感じ。

# tcpdump -n -i br0 tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 96 bytes
11:49:01.942466 IP 192.168.11.102.36673 > 192.168.11.241.80: S 3722872408:3722872408(0) win 5840 <mss 1460,sackOK,timestamp 1722908 0,nop,wscale 6>
11:49:01.943604 IP 192.168.11.241.80 > 192.168.11.102.36673: S 1321486056:1321486056(0) ack 3722872409 win 5792 <mss 1460,sackOK,timestamp 3811486 1722908,nop,wscale 4>
11:49:01.943673 IP 192.168.11.102.36673 > 192.168.11.241.80: . ack 1 win 92 <nop,nop,timestamp 1722909 3811486>
11:49:04.794205 IP 192.168.11.102.36673 > 192.168.11.241.80: P 1:8(7) ack 1 win 92 <nop,nop,timestamp 1723194 3811486>
11:49:04.795714 IP 192.168.11.241.80 > 192.168.11.102.36673: . ack 8 win 362 <nop,nop,timestamp 3814337 1723194>
11:49:04.795782 IP 192.168.11.241.80 > 192.168.11.102.36673: P 1:22(21) ack 8 win 362 <nop,nop,timestamp 3814338 1723194>
11:49:04.795818 IP 192.168.11.102.36673 > 192.168.11.241.80: . ack 22 win 92 <nop,nop,timestamp 1723194 3814338>
11:49:04.795838 IP 192.168.11.241.80 > 192.168.11.102.36673: F 22:22(0) ack 8 win 362 <nop,nop,timestamp 3814339 1723194>
11:49:04.796667 IP 192.168.11.102.36673 > 192.168.11.241.80: F 8:8(0) ack 23 win 92 <nop,nop,timestamp 1723194 3814339>
11:49:04.798567 IP 192.168.11.241.80 > 192.168.11.102.36673: . ack 9 win 362 <nop,nop,timestamp 3814341 1723194>
^C
10 packets captured
10 packets received by filter
0 packets dropped by kernel

2009-08-20

KVMのゲストOSのネットワークをブリッジにする

Networking - KVMを参考にしました。

sudo kvm -hda vm10.qcow2 -m 256 -curses -net nic,00:23:7d:29:e1:02 -net tap,script=/etc/kvm/kvm-ifup

メモ

  • 00:23:7d:29:e1:02はランダムなMACアドレスです。ifconfigで表示された他のアドレスを変更してでっちあげました。
  • tunctlは無くてもいけました。ちなみにuml-utilitiesパッケージに含まれているらしい。
$ sudo aptitude show uml-utilities
Package: uml-utilities
State: not installed
Version: 20070815-1.1ubuntu2
Priority: extra
Section: universe/otherosfs
Maintainer: Ubuntu MOTU Developers 
Uncompressed Size: 336k
Depends: adduser, libc6 (>= 2.4), libfuse2 (>= 2.6), libncurses5 (>= 5.6+20071006-3), libreadline5 (>= 5.2), lsb-base (>= 3.0-10)
Suggests: user-mode-linux
Description: User-mode Linux (utility programs)
 User-mode Linux is a port of the Linux kernel to its own system call interface.  It provides a kind of virtual machine, which runs
 Linux as a user process under another Linux kernel.  This is useful for kernel development, sandboxing, jailing, experimentation,
 and many other things. 
 
 This package contains userspace utilities for use with User-mode Linux, including uml_mconsole, uml_moo, uml_switch, uml_net and
 tunctl.

Ubuntuでネットワークブリッジを作成

KVM Networking - Community Ubuntu Documentationを参考にしました。

bridge-utilsパッケージをインストールします。

$ sudo aptitude install bridge-utils

/etc/network/interfacesを以下のように書き換えます。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
  address 192.168.11.102
  netmask 255.255.255.0
  gateway 192.168.11.1
  bridge_ports eth0
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0

で以下のコマンドを実行します。

$ sudo /etc/init.d/networking restart

libvirt: Wiki: Networkingによると/etc/sysctl.confも変更するらしいです。

$ sudo vi /etc/sysctl.conf

追加内容

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

以下のコマンドを実行して変更を反映。

$ sudo sysctl -p /etc/sysctl.conf

ブログ アーカイブ