knqyf263's blog

自分のためのメモとして残しておくためのブログ。

NetFlowコレクタの設定

以前NetFlowエージェントの設定をしたので(Open vSwitchでNetFlow設定 - knqyf263's blog)、今回はNetFlowコレクタの設定をしてみたいと思います。 使うのはnfdumpです。 基本的にmanページとか見れば全部書いてあることをまとめてみました。 つまり無意味です。

環境

NetFlowコレクタ
ツール:nfdump
OS:Ubuntu 13.10

NetFlowエージェントの設定

nfdumpのインストール

Ubuntuの場合はnfdumpがパッケージにあったのでapt-getするだけです。

# apt-get install nfdump

nfcapdの起動

nfdumpをインストールすると、他にも様々なパッケージがインストールされます。 その一覧は公式ページ NFDUMP に書いてあるので読んで頂ければ分かりますが、重要なのはnfdumpnfcapdです。 nfcapdはNetFlowのデータをキャプチャするdaemonで、収集したデータをdumpするのがnfdumpになっております。 ここではnfcapdの起動方法を説明します。

$ nfcapd -w -D -l ~/netflow -p 5566

-wをつけると一定時間で整形してファイルに書き出してくれる。-tでその時間を変えることが出来ます(デフォルトは5分)。-Ddaemonモードで起動。-lはファイルを書き出すディレクトリを指定できます。今回はnetflowディレクトリを作成し、そこに書きだすように指定しました。-pはポート番号で、以前NetFlowエージェントの設定で送信先ポートを5566にしたので、上記のように指定しました。

nfdumpの使い方

nfcapdを起動するとnfcapd.201401141350のようなファイルが書き出されます。 これらを表示するためにnfdumpを使います。 例えば以下の様なコマンドをうちます。

$ nfdump -r ./nfcapd.201401141350 -n 20 -o extended

-rで表示するファイルを指定します。-n 20はFlowの多い順Top 20を表示します。

基本的にmanページにsampleもあるので、色々試してみましょう。

virsh consoleの設定

virsh consoleの設定をすれば、virsh console <ホスト名>でコンソールをつかむことができます。 sshを入れ忘れた場合などに有効です。 例によってそのままやってみただけですが、メモとして残します。

環境

ホストOSはDebian 7.3で、ゲストOSはUbuntu 13.10のサーバー版とします。
また、Ubuntu 13.10のホスト名をhost01とします。

ホストOS:Debian 7.3(wheezy)
ゲストOS:Ubuntu 13.10 server
ゲストOSのホスト名:host01

参考サイト

KVMゲストOSへのコンソール接続設定 - jitsu102の日記
lost and found ( for me ? ): KVM: virsh コンソール接続 ( guest OS Ubuntu )

virsh consoleの設定

今回の作業は全てroot権限で行っています。

ホスト側の設定

VMシリアルコンソール接続があるか確認
# less /etc/libvirt/qemu/host01.xml
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>

上記のような記述があればOKです。 もしなければ、host01がシャットダウンされているのを確認してから、

# virsh edit host01

で上記の設定を追加してください。 私の環境ではデフォルトで入っていました。

VMの起動

上記設定の確認が終わったら、host01を起動します。

# virsh start host01

ゲスト側の設定

/etc/init/ttyS0.conf の作成

/etc/init/ttyS0.conf を新規作成します。 以下のように設定を書いてください。

# vim /etc/init/ttyS0.conf 
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty -L 115200 ttyS0 vt102
ttyS0のスタート
# start ttyS0
ttyS0 start/running, process 1839
/etc/default/grubの編集

/etc/default/grubに以下の設定を追記してください。

# vim /etc/default/grub
+GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
+GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

動作確認

ここまでで設定は終わりなので、virsh consoleを試してみましょう。

# virsh console host01
Connected to domain host01
Escape character is ^]

Ubuntu 13.10 host01 ttyS0

host01 login:

こんな感じで出ていれば成功です。 ユーザ名とパスワードを入れてログインできます。 "Ctrl"+"]"で、ログアウトできます。

DebianでのIPマスカレード設定

以前の記事(KVM環境でVMを作成 - knqyf263's blog)でVMを作成しましたが、これでは192.168.122.0/24というプライベートなネットワーク内でしか通信できないので、外に出れるようにホストOSにIPマスカレード(NAT)の設定を入れてみたいと思います。

環境

ホストOSはDebian 7.3を使っています。 ホストOSにはインタフェースが2つあって、グローバルIPアドレスx.x.x.xとして、ブリッジインタフェースについているプライベートなIPアドレス192.168.122.1とします。

ホストOS:Debian 7.3(wheezy)
ホストOSのIPアドレス:192.168.122.1
ゲストOS:Ubuntu 13.10 server
ゲストOSのIPアドレス:192.168.122.11
ネットワーク:192.168.122.0/24

参考サイト

http://devnull.synergy-marketing.co.jp/2013/07/iptables-ip-masquerade/
Debian 7 の iptables と sshd の設定と IPv6 無効化メモ - 破棄されたブログ
Debian(squeeze)でのiptablesの設定 - epian-wiki

IPマスカレードの設定

今回の設定は全てroot権限で行っています。

iptablesの設定

iptablesにnatの設定

iptablesで設定を行います。 まず、iptables に nat テーブルを設定します。 -sオプションで送信元 IP アドレスを指定しています。 今回の設定では192.168.122.0/24の送信元IPアドレスの場合はアドレスが変換されます。

# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE
iptablesの設定確認

正しく設定が反映されているかを確認します。 通常はfilterテーブルが表示されるので、-t natでnatテーブルを表示します。

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.122.0/24     anywhere
iptablesの設定削除

設定が間違っていた場合や、不要になった場合は削除できます。 最後の数字は、チェインの中の番号(最初のルールを 1 とする)です。

# iptables -t nat -D POSTROUTING 1

iptables ルールファイルの作成

iptables-persistentを使って、iptablesの設定を保存します。

iptables-persistentのインストー

まずiptables-persistentをインストールします。

# apt-get install iptables-persistent

この時、/etc/iptables/rules.v4に現在の設定を保存するか聞かれるので、保存を選択すれば/etc/iptables/rules.v4に設定が保存されます。

iptablesの設定保存

更新があった場合や、インストール時に保存し忘れた場合などの設定は以下になります。 一応バックアップを取ってから設定を保存しています。不要であれば最初から下のコマンドを打ってください。

# mv /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak  
# iptables-save > /etc/iptables/rules.v4
iptables-persistentの再起動
# service iptables-persistent restart

以上で終わりです。

KVM環境でVMを作成

前回(KVM仮想環境構築 - knqyf263's blog)、KVMのHypervisorのセットアップまでやったので、今回は実際にVMを作成してみたいと思います。 virt-managerを使ってGUI操作するだけなので特に難しいところはないです。

環境

ホストOSは前回構築したDebian 7.3で、ゲストOSにUbuntu 13.10のサーバー版を入れてみたいと思います。

ホストOS:Debian 7.3(wheezy)
ホストOSのIPアドレス:192.168.122.1
ゲストOS:Ubuntu 13.10 server
ゲストOSのIPアドレス:192.168.122.11 ネットワーク:192.168.122.0/24

VM作成

virt-managerの起動

これは前回の記事の最後と同じ内容になります。 Macの場合は、XQuartzを予めインストールしておき、以下のようにします。

$ ssh -X <サーバIPアドレス>

sshでログインしたあと、そこで以下のコマンドを打ちます。

$ sudo XAUTHORITY=~/.Xauthority virt-manager

これでvirt-managerが起動されます。

VMのisoを置くためのディレクトリを作成

$ sudo mkdir /var/images

VMのisoをダウンロード

Ubuntu 13.10 serverをダウンロードします。

$ cd /var/images/
$ wget http://releases.ubuntu.com/saucy/ubuntu-13.10-server-amd64.iso

virt-managerからVMを作成

virt-managerの左上に「新規」というボタンがあるので、それをクリックし、流れに沿って進めて行けばインストールできます。isoには先程の/var/images内のisoを指定してください。 途中、必要なパッケージをインストールすることが可能なので、SSHなどを入れておけば最初からSSHを用いてログインできます。 インストールが終わったあと、「開く」ボタンを押すとコンソールをつかむことができるので、インストール時にIPアドレスの設定などをやり忘れた場合は、ここで行ってください。

KVM仮想環境構築

今更ですが、KVMの環境構築についてまとめます。 というのも、ちょっとしたトラブルでHVが全て消えてしまって再構築が必要になったのに、きちんとした作業メモを残して置かなかったために現在苦労しているからです。 自分用なので簡易なメモになります。 とりあえずvirt-managerを起動するところまでのメモです。

環境

環境ですが、ホストOSにはDebian 7.3を利用しています。 OSを入れただけの状態で、インターネットにはつながっている状況を想定しています。 ホストOSとゲストOSのネットワークには192.168.122.0/24を使っています。

ホストOS:Debian 7.3(wheezy)
IPアドレス:192.168.122.1
ネットワーク:192.168.122.0/24

参考サイト

4.2. インストール
SL6.3でKVM構築

事前準備

KVMのインストールを始める前に、事前準備をします。 これはインストールの時の設定によるので、人によって違うと思いますが僕の環境でのメモなので一応残しておきます。

/sbinにパスを通す

.bashrcに次の行を追加。

$ vim ~/.bashrc
+export PATH=$PATH:/sbin
欲しいパッケージをインストール

好きなエディタをインストールしてください。今回はvimを使って設定していきます。 あとはページャとしてlessを入れました。ついでにlsb-releaseも。

$ sudo apt-get install vim less lsb-release

KVMのインストール

ではKVMのインストールをしてきます。

KVMに必要なパッケージをインストール

$ sudo apt-get install kvm libvirt-bin virt-manager sasl2-bin nfs-kernel-server

大量にパッケージがインストールされるので少し待ちます。

libvirtの設定

KVM仮想マシンの管理にlibvirtを使うので、libvirtの設定を行っていきます。

非セキュアなTCP接続を待ち受ける

後にlive migrationなどするために、TLS を使わずにベアTCP を使用します。 TCPを有効にし、TLSを無効にするため、/etc/libvirt/libvirtd.confに下記の設定を行います。 コメントアウトしてあるので、コメントアウトを外すだけでも良いです。

$ sudo vim /etc/libvirt/libvirtd.conf
+listen_tls = 0
+listen_tcp = 1

libvirtの設定を変えたので、さらにlibvirtdが起動するときのパラメータも変更します。 /etc/init/libvirt-bin.confのlibvirtd_optsの行に-lを加えます。

$ sudo vim /etc/default/libvirt-bin
- libvirtd_opts=”-d”
+ libvirtd_opts=”-d -l”
libvirt APIデーモンのアカウント設定

libvirt APIデーモンのアカウントを設定しますが、ここではtestとします。 コマンドを打つとパスワードを聞かれるので、強固なパスワードを設定してください。

$ sudo saslpasswd2 -a libvirt test
Password:
Again (for verification):
libvirtの再起動
$ sudo /etc/init.d/libvirt-bin restart

ホストOSのネットワーク設定

interfacesの編集

br0というブリッジインタフェースを作成し、そこにeth0を結びつけます。 この場合、eth0はただのパケットの通り道であり、UTPが通っているのと同じような状況なので、eth0にはアドレスはつきません。 eth0について既に設定があった場合はコメントアウトして以下の設定を追加してください。

$ sudo vim /etc/network/interfaces
+ auto eth0
+ iface eth0 inet manual
+       pre-up ifconfig eth0 up
+ auto br0
+ iface br0 inet static
+       address 192.168.122.1
+       netmask 255.255.255.0
+       network 192.168.122.0
+       broadcast 192.168.122.255
+       bridge_ports eth0
+       bridge_stp off
+       bridge_maxwait 0
+       bridge_fd 0
ネットワークを再起動
$ sudo /etc/init.d/networking restart

virt-managerの起動

サーバにsshでログインする際にオプションで-Xを使うことで、X Window Systemをローカルに飛ばすことができます。 簡単にいえば、KVMの設定画面が手元のPCでGUIで見れます。 Macの場合は、XQuartzを予めインストールしておき、以下のようにします。

$ ssh -X <サーバIPアドレス>

sshでログインしたあと、そこで以下のコマンドを打ちます。

$ sudo XAUTHORITY=~/.Xauthority virt-manager

これで手元のMacvirt-managerが見られれば成功です。

Open vSwitchでNetFlow設定

前回はOpen vSwitchでsFlowの設定を行ったので、今回はNetFlowを取得するための設定を行いたいと思います。 基本的にsFlowの時と同じ考え方でやっています。 NetFlowの説明を以下に引用します。

NetFlowは、米シスコシステムズが開発したトラフィック管理用技術です。主にシスコ製のルーターやLANスイッチにソフトウエア機能(IOS拡張機能)として実装されていますが、ほかのベンダーのネットワーク機器でもサポートしている製品があります。NetFlowは、ネットワーク機器上で「フロー」(TCP、UDPやICMPのあて先、送信元のIPアドレスとポート番号の組み合わせで識別するセッション)単位でパケット数やバイト数を集計し、集計データをUDPベースのNetFlowパケットで管理ステーション(NetFlowでも「コレクタ」と呼ぶ)に送信します
引用元:ネットワーク管理者のためのトラフィック管理入門 - 第3章 トラフィック管理技術とその比較:ITpro

今回はNetFlowエージェントがOpen vSwitchで、NetFlowコレクタは別にサーバを用意した環境を想定しています。 この記事ではNetFlowエージェント側の設定について説明します。 僕が用意した環境は以下のようになっています。

環境

NetFlowエージェント
Open vSwitch:1.4.2
インタフェース:ovsbr0
IPアドレス:192.168.122.1

NetFlowコレクタ
OS:Ubuntu 13.10
IPアドレス:192.168.122.22

NetFlowエージェントの設定

NetFlowの設定作成

本環境では以下の様な設定となります。

COLLECTOR_IP=192.168.122.22  
COLLECTOR_PORT=5566  
ACTIVE_TIMEOUT=30  

COLLECTOR_IPはコレクタのIPアドレスで、192.168.122.22、COLLECTOR_PORTはコレクタに送る際の送信先ポート番号で、5566番としています。 上記の値を反映するためのコマンドは以下になります。

#  ovs-vsctl -- set Bridge ovsbr0 netflow=@nf -- --id=@nf  
create NetFlow target=\"192.168.122.22:5566\" active-timeout=30 

NetFlowの設定確認

NetFlowの設定が正しく入っているかを確認します。

# ovs-vsctl list netflow
_uuid               : f7eebd0b-6a8f-4d86-911a-b61c5246273a
active_timeout      : 30
add_id_to_interface : false
engine_id           : []
engine_type         : []
external_ids        : {}
targets             : ["192.168.122.22:5566"]

次に、正しくパケットが流れているかを確認します。

# tcpdump -ni ovsbr0 udp port 5566
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ovsbr0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:46:27.870141 IP 192.168.122.1.40117 > 192.168.122.22.5566: UDP, length 72
15:46:30.873135 IP 192.168.122.1.40117 > 192.168.122.22.5566: UDP, length 120
15:46:35.878141 IP 192.168.122.1.40117 > 192.168.122.22.5566: UDP, length 72

NetFlowエージェントのIPアドレス192.168.122.1からNetFlowコレクタのIPアドレス192.168.122.22のポート番号の5566番に対してUDPパケットが送信されているのが確認できます。

NetFlowの設定削除

NetFlowの設定を削除したくなった場合、以下のコマンドで削除することができます。

$ ovs-vsctl remove bridge ovsbr0 netflow $NETFLOWUUID 

$NETFLOWUUIDは、上の設定確認で表示されている_uuidなので、今回は

$ ovs-vsctl remove bridge ovsbr0 netflow f7eebd0b-6a8f-4d86-911a-b61c5246273a

で削除できる。
また、NetFlowの設定全てを削除する場合は、removeでなくclearを使っても良い。

$ ovs-vsctl clear Bridge ovsbr0 netflow

NetFlowコレクタの設定は次回以降にします。

Open vSwitchでsFlow設定

今回はOpen vSwitchでsFlowを取得するための設定を行いたいと思います。 設定方法はOpen vSwitchの公式サイトを参考にしました( sFlow | Open vSwitch)。 というかそのままのことをやってみただけです。 自分の解釈なので間違ってたらすみません。。 sFlowの説明を以下に引用します。

sFlowは、LANスイッチやルーターなどを流れるトラフィックをモニターして、トラフィックに関する情報を送信するsFlowエージェントと、トラフィック情報を受信して解析するsFlowコレクタで構成します。sFlowエージェントは、主にLANスイッチに内蔵する形で実装されています。
引用元:ネットワーク管理者のためのトラフィック管理入門 - 第1章 sFlowとは:ITpro

今回はsFlowエージェントがOpen vSwitchで、sFlowコレクタは別にサーバを用意した環境を想定しています。 僕が用意した環境は以下のようになっています。

環境

sFlowエージェント
Open vSwitch:1.4.2
インタフェース:ovsbr0
IPアドレス:192.168.122.1

sFlowコレクタ
OS:Ubuntu 13.10
IPアドレス:192.168.122.22

sFlowエージェントの設定

sFlowの設定作成

今回はsFlowエージェントであるOpen vSwitchの設定をします。 本環境では以下の様な設定となります。

COLLECTOR_IP=192.168.122.22
COLLECTOR_PORT=6343
AGENT_IP=ovsbr0
HEADER_BYTES=128
SAMPLING_N=64
POLLING_SECS=10

COLLECTOR_IPはコレクタのIPアドレスで、192.168.122.22、COLLECTOR_PORTはコレクタに送る際の送信先ポート番号で、6343番としています。 6343番はsFlowのデフォルトポートです。 AGENT_IPはエージェントがsFlowのパケットを送信する際の送信元のIPアドレスで、今回はovsbr0としたので192.168.122.1から送信されます。
上記の値を以下のコマンドに代入します。

# ovs-vsctl — –id=@sflow create sflow agent=${AGENT_IP}  
target=\”${COLLECTOR_IP}:${COLLECTOR_PORT}\”  
header=${HEADER_BYTES} sampling=${SAMPLING_N} 
polling=${POLLING_SECS} — set bridge br0 sflow=@sflow

僕の環境では以下のようになります。

# ovs-vsctl -- --id=@s create sFlow agent=ovsbr0   
target=\"192.168.122.22:6343\" header=128  
sampling=64 polling=10 -- set Bridge ovsbr0 sflow=@s

sFlowの設定確認

sFlowの設定が正しく入っているかを確認します。

# ovs-vsctl list sflow
_uuid               : 4854f279-eadf-4257-ba1d-b1e862e5f9a2
agent               : "ovsbr0"
external_ids        : {}
header              : 128
polling             : 10
sampling            : 64
targets             : ["192.168.122.22:6343"]

次に、正しくパケットが流れているかを確認します。

# tcpdump -ni ovsbr0 udp port 6343
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode  
listening on ovsbr0, link-type EN10MB (Ethernet), capture size 65535 bytes  
19:22:30.269169 IP 192.168.122.1.46682 > 192.168.122.22.6343: sFlowv5, IPv4 agent 192.168.122.1, agent-id 2, length 260  
19:22:35.269066 IP 192.168.122.1.46682 > 192.168.122.22.6343: sFlowv5, IPv4 agent 192.168.122.1, agent-id 1, length 144  
19:22:37.269026 IP 192.168.122.1.46682 > 192.168.122.22.6343: sFlowv5, IPv4 agent 192.168.122.1, agent-id 1, length 144  

sFlowエージェントのIPアドレス192.168.122.1からsFlowコレクタのIPアドレス192.168.122.22のポート番号の6343番に対してUDPパケットが送信されているのが確認できる。

sFlowの設定削除

sFlowの設定を削除したくなった場合、以下のコマンドで削除することができる。

$ ovs-vsctl remove bridge ovsbr0 sflow $SFLOWUUID 

$SFLOWUUIDは、上の設定確認で表示されている_uuidなので、今回は

$ ovs-vsctl remove bridge ovsbr0 sflow 4854f279-eadf-4257-ba1d-b1e862e5f9a2

で削除できる。
また、sFlowの設定全てを削除する場合は、removeでなくclearを使っても良い。

$ ovs-vsctl clear Bridge ovsbr0 sflow

sFlowコレクタの設定は次回以降にします。