###この文書はTremaを使用してパケットレコーダーSonarmanを操作するDemoの操作手順です。
##Section1 インストール
このハンズオンはVirtualboxおよびExtentionPackがインストールされている環境が必要です。
予めご用意ください。
会場で配布するUSBメモリに同梱されている
Sonarman_RD_License_1.5.4_with_Trema.ova
をインポートしてください。
インポートはVirtualboxのファイルメニューから仮想アプライアンスのインポートを選択し、Sonarman_RD_License_1.5.4_with_Trema.ovaを指定します。
続いてアプライアンスの設定画面で以下の画面が表示されますが、Macアドレスを初期化せずにインポートボタンを押してください。
ライセンスが表示されます。当勉強会で使用した環境はデモ用にカスタマイズした特別なバージョンですので、試用されたい場合は別途お問い合わせください。
初回起動時に以下のメッセージが表示されますが、「ネットワーク設定の変更」をクリックします。
アダプタ2タブのデバイス名(名前欄)をPCの無線アダプタに設定し、OKを押します。
もし、「ホストオンリーアダプタがありません」
というエラーが表示される場合は以下の設定からアダプタを手動追加してください。
ファイル > 環境設定 > ネットワーク > ホストオンリーネットワーク
##Section2 Sonarmanの操作
VMが起動しログインプロンプトが表示されます。
ID/パスワードはsonarman/sonarmanです。
操作コンソールとなるeth0 の IPアドレスを確認します。
以下のコマンドを打ってください。
$ ip a
IPアドレスが判明したので、httpでアクセスします。
http://192.168.56.101
basic認証のID/パスワードはadmin/passです。
ログイン後、左メニューの「キャプチャ」を開き、リングバッファを開いてください。
現在PCで発生しているトラフィックが保存されているのが分かると思います。F5でリロードしてバイト数が増えていくのを確認してください。
次に、リングバッファのキャプチャファイルをsyslogからのメッセージで自動的にスイッチ、退避させてみましょう。
sshでSonarmanにログインします。
アカウントはsonarman/sonarmanです。
syslogパケットを出力します。
以下のコマンドを打ってください。
$ echo "ERRORINFO syslog message from bash" > /dev/udp/localhost/514
WEB画面のキャプチャメニューからsyslog退避画面に遷移します。
syslogメッセージを含んだファイル名で、現在と一つ前のキャプチャがアーカイブされて退避されています。
##Section3 パケット生成
これからSDNフレームワークであるTremaを使用して、仮想スイッチからsyslogパケットを直接生成し、Sonarmanにsyslogパケットを届けてみましょう。
Tremaからのsyslog送信に必要な仮想スイッチや接続状態の概要図は以下のようになります。
前準備として仮想NICを作成し、アドレスを振ります。
以下のコマンドを打ってください。
$ ./handson.sh
Tremaを起動し、syslogパケットを送信します。
Tremaからsyslogパケットを送信するコードは以下のとおりです。
class Test < Trema::Controller
def start(_args)
@port_no = 1
end
def switch_ready(dpid)
p `sudo ovs-ofctl show br0xabc`
system('sudo ovs-vsctl add-port br0xabc veth12')
system('sudo ovs-vsctl set Interface veth12 ofport_request=1')
veth11mac = `ip addr show veth11 | grep ether | awk -F ' ' '{ print $2 }'`
udp = Udp.new(destination_mac: veth11mac,
source_mac: '08:00:00:00:00:00',
source_ip_address: '192.168.1.100',
destination_ip_address: '192.168.1.35',
udp_checksum: 49077,
udp_source_port: 62558,
udp_destination_port: 514,
udp_payload: 'ERRORINFO This message was sent by Trema !!!')
send_packet_out(dpid, raw_data: udp.to_binary_s, actions: [SendOutPort.new(@port_no)])
end
end
このコードをTremaから実行します。
$ cd syslog_send/
$ trema run ./lib/syslog_send.rb -c trema.conf
先ほどと同様のsyslog退避画面にTremaからのsyslogメッセージによって退避されたアーカイブが参照できます。
Tremaのプログラムを集了する場合はCtrl+Cで終了させてください。
##Section4 パケットの観察
Tremaのプログラムは何回も繰り返して実行することができます。
ここで、スイッチから送信されるsyslogパケットとOpenFlowパケットの実物を見てみましょう。
sshのターミナルを新たに接続し、以下のコマンドでキャプチャを取得します。
veth11ではスイッチから出力される実際のsyslogパケットが参照できます。
$ sudo tshark -i veth11 -w /tmp/veth11.cap
キャプチャコマンドはCtrl+Cで終了させます。
終了後、SCP等でローカルPCに上記ファイルをコピーし、Wiresharkで展開してみましょう。
コピーの前に/tmp/veth11.capのパーミッションを設定しておいてください。
$ sudo chmod 777 /tmp/veth11.cap
Wiresharkで参照した結果がこちらです。
プログラムを修正することでメッセージの書き換えが可能になりますが、UDPチェックサムの修正も同時に必要になります。
UDPチェックサムの値を0にすることでチェックをバイパスできますので試してみてください。
#udp_checksum: 49077, 下記のように変更
udp_checksum: 0,
loではTremaから出力される実際のOpenFlowパケットが参照できます。
$ sudo tshark -i lo -w /tmp/localhost.cap
同様にパーミッションを設定してSCPでローカルにコピーします
$ sudo chmod 777 /tmp/localhost.cap
一連のOpenFlowプロトコルの動作が参照できます。
以上