池の上にも

平均以下の理解力で、色々アウトプットしてみるブログ

quagga + mininet で BGP 検証環境を作る

BGP を検証できる環境がほしかったので探したところ、quagga + mininet を使った環境が見つかったので、そちらを利用させてもらうことにしました。

BGP Path Hijacking Attack Demo · mininet/mininet Wiki · GitHub

mininet が namespace を使うことで routing table が個別に扱えるようになります。その上で quagga を動作させて、BGP peer をはれる NW 環境が構成できるとのことです。

環境

  • OS: Ubuntu 16.04.3 LTS
  • Memory: 4GB

Installation

1. Git インストール
$ sudo apt install git
2. Mininet インストール
$ git clone git://github.com/mininet/mininet
$ cd mininet
$ git tag
$ git checkout -b 2.2.1 2.2.1
$ cd ..
$ mininet/util/install.sh -nfv

-nfv オプションで mininet とあわせて Open vSwitch もインストールします

3. Quagga インストール
$ sudo apt install libreadline-dev libc-ares-dev
$ wget http://download.savannah.gnu.org/releases/quagga/quagga-1.2.1.tar.gz
$ tar xvzf quagga-1.2.1.tar.gz
$ cd quagga-1.2.1
$ ./configure --enable-multipath=0
$ make
$ sudo make install

ECMP も動作確認したかったので、--enable-multipathのオプションもつけました。引数が0だと、ECMP の数を上限なしに設定できます。

quagga ユーザを作っておいて、ldconfiglibzebra.so.1を読み込んでおきます。

$ sudo adduser --system --no-create-home --group quagga
$ sudo ldconfig
$ ldconfig -p | grep -i zebra
4. BGP サンプル環境をインストール
$ git clone https://bitbucket.org/jvimal/bgp.git
$ sudo bash -c "curl -kL https://bootstrap.pypa.io/get-pip.py | python"
$ sudo pip install termcolor

これで、bgp/bgp.py を起動すれば、quagga が各 Switch で動作した mininet が起動するのですが、zebra/quagga のパスが違っていたりするので修正しておきます。

--- a/bgp.py
+++ b/bgp.py
@@ -140,9 +140,9 @@
-        router.cmd("/usr/lib/quagga/zebra -f conf/zebra-%s.conf -d -i /tmp/zebra-%s.pid > logs/%s-zebra-stdout 2>&1" % (router.name, router.name, router.name))
+        router.cmd("/usr/local/sbin/zebra -f conf/zebra-%s.conf -d -i /tmp/zebra-%s.pid > logs/%s-zebra-stdout 2>&1" % (router.name, router.name, router.name))
         router.waitOutput()
-        router.cmd("/usr/lib/quagga/bgpd -f conf/bgpd-%s.conf -d -i /tmp/bgp-%s.pid > logs/%s-bgpd-stdout 2>&1" % (router.name, router.name, router.name), shell=True)
+        router.cmd("/usr/local/sbin/bgpd -f conf/bgpd-%s.conf -d -i /tmp/bgp-%s.pid > logs/%s-bgpd-stdout 2>&1" % (router.name, router.name, router.name), shell=True)
         router.waitOutput()

修正後に quagga + mininet を起動します。

$ cd bgp
$ sudo ./bgp.py

BGP ルータに接続

./connect.sh <Router名> で接続します。ですが、ps コマンドからノード名を取得するための正規表現が合っていなかったので、スクリプトを少し書き換えます。

--- a/run.py
+++ b/run.py
@@ -16,7 +16,7 @@
-node_pat = re.compile(r'.*bash ... mininet:(.*)')
+node_pat = re.compile(r'.*bash --norc -is mininet:(.*)')

その後に、./connect.sh <Router名> で接続します。telnet login/enable の password は、いずれも en です。

$ ./connect.sh R2
Connecting to R2 shell
Trying ::1...

Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 1.2.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password: 
bgpd-R2> en
Password: 
bgpd-R2# 

トポロジを変更する

デフォルトのトポロジは、とてもシンプル(R1---R2---R3)なので、topology.py の中身を変更してトポロジを好きなように変更します。トポロジを変更してノード名を変えた場合は、conf/配下にノードに対応する設定ファイルを作る必要があります。特に zebra に対応する設定では loopback の設定を残しておかないと connect.sh で接続ができなくなるので注意が必要です。

Spotify + Mopidy でカラオケしてみた

以前に手元の Lubuntu で Spotify を再生できるように、Mopidy をインストールしてみました。

tawaku.hatenablog.com

設定いじって色々できないか探してみたところ、GStreamer というマルチメディアのフレームワークの設定を変えて、簡単なカラオケができそうです。

GStreamer pipeline

Mopidy では、GStreamer を使って音を再生しています。
Mopidy のチュートリアルにもあるのですが、まずは GStreamer で音が再生できるか確認してみます。Mopidy で音楽が聞けている場合は、音がなるはずです。

$ gst-launch-1.0 audiotestsrc ! audioresample ! autoaudiosink


Mopidy のデフォルトでは、音の再生にautoaudiosinkが使われています。それで音をいじれないか探してみたところ、audiokaraokeというものを見つけました。


audiokaraoke: GStreamer Good Plugins 1.0 Plugins Reference Manual

センタチャネルをフィルタして、音楽から音声を取り除けるそうです。センタチャネルがなにか分かってないですが、効果は楽しそうです。

まずは、サンプルでaudiokaraokeが再生可能か確認してみます。

$ gst-inspect-1.0 | grep -i "karaoke"
audiofx:  audiokaraoke: AudioKaraoke

$ gst-launch-1.0 audiotestsrc ! audioresample ! audiokaraoke ! autoaudiosink


再生できたら、Mopidy に設定してみます。

Mopidy に audiokaraoke を設定する

[audio] セクションのoutputに、GStreamer のパイプラインを設定できます。

$ vim /usr/share/mopidy/conf.d/mopidy.conf

[audio]
output = audiokaraoke ! autoaudiosink


Mopidy を再起動して、音楽を再生してみます。サンプルが載せられないですが、ボーカルがコーラスみたいになってカラオケっぽくなっています。

課題

以下の2点が不満で、暇があれば改善したいです。

  • カラオケなので歌詞が欲しかったですが、適当な Extension が見つからなかった
  • カラオケを止める時は一々設定を書き換えて、Mopidy を再起動しないといけない

Mopidy で Spotify を聴いてみた

Lubuntu で音楽聴きたいので、探してみたらこんなのありました。

github.com

インストール環境

Mopidy とは

Python ベースの Music Server とのことで、ローカルの音楽ファイルを再生できるし、Extension を使うことで Spotify とかクラウド上の音楽サービスを再生できるとのこと。

Mopidy に加えて、Mopidy Spotify という Extension を入れて Spotify を聴けるようにします。

github.com

なお、Mopidy SpotifySpotify プレミアムアカウントでないと正しく動かないみたいです。

Mopidy インストール

まずはリポジトリを登録します。

$ wget -q -O - https://apt.mopidy.com/mopidy.gpg | sudo apt-key add -
$ sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/jessie.list

$ sudo apt update


次にパッケージをインストールします。

$ sudo apt install mopidy
$ sudo apt install mopidy-spotify


最後に関連するライブラリをインストールしておきます。

$ sudo pip install spotipy

Mopidy の設定

Client ID と Client Secret を手に入れる

Mopidy から Spotify にアクセスするため、Spotify から Client ID と Client Secret を発行してもらう必要があります。

developer.spotify.com

上のページにログインしたら、"My Apps"に進みます。

f:id:tawaku:20170907232413p:plain


“My Applications"を選択して、 Mopidy を登録します。

f:id:tawaku:20170907235023p:plain


アプリケーション名は適当に入れて、"CREATE"をクリックします。

f:id:tawaku:20170907232947p:plain


Client ID と Client Secret が表示される画面に移動するので、文字列を控えておきます。

f:id:tawaku:20170907235050p:plain


mopidy.conf の編集

mopidy.conf の [spotify] のセクションを設定します。

$ cp ~/.config/mopidy/mopidy.conf /usr/share/mopidy/conf.d/mopidy.conf
$ vim /usr/share/mopidy/conf.d/mopidy.conf

[spotify]
enabled = true
username = <username>
password = <password>
client_id = <client_id>
client_secret = <client_secret>

Mopidy 起動

PC 立ち上げ時に mopidy が起動するように設定しておき、サービスを開始します。

$ sudo systemctl enable mopidy
$ sudo systemctl start mopidy


これで、TCP port 6600 と 6680 で接続待ち受けが始まります。6600 は MPD Client 用の接続で、6680 は Web Client 用の接続です。

Mopidy-Iris でアクセス

ブラウザからアクセスしたかったので、Web Client をインストールします。 Web Client はいくつかあるようです( Web extensions — Mopidy 2.1.0-10-gd4d7680 documentation )。見た目が気に入った Mopidy-Iris をインストールしてみました。

$ sudo pip install Mopidy-Iris
$ sudo systemctl restart mopidy


その後、ブラウザからhttp://127.0.0.1:6680/にアクセスします。"Web Clients"にirisが表示されているので、クリックします。

Mopidy-Iris の画面が表示されます。音楽再生前にいくつか設定を入れておきます。サイドのナビゲーションから、"Settings"を選択します。

f:id:tawaku:20170910000111p:plain


Localization 設定に以下を設定します。

f:id:tawaku:20170910000120p:plain


“Log in"を押して、Mopidy-Iris でのログインを実行します。

f:id:tawaku:20170910000126p:plain


これで音楽の再生ができるようになりました。

f:id:tawaku:20170910000131p:plain

おわりに

Spotify 聞くだけであれば手元のスマホだけで済む気もしますが、Extension で拡張していければスマホとの違いも出せそうです。暇なときに他の Extension も調べてみようかと思います。

python スクリプトの行頭に書く "#!"

pyenv の環境でスクリプトの行頭の#!に何を書けばよいかと言う話。
#!/usr/bin/env pythonが適当みたい。

$ pyenv version
2.7.13 (set by /home/***/.pyenv/version)
$ /usr/bin/env python -V
Python 2.7.13

$ cd test
test$ pyenv version
3.6.2 (set by /home/***/test/.python-version)
test$ /usr/bin/env python -V
Python 3.6.2


#!/usr/bin/pythonだとダメそう。

test$ pyenv version
3.6.2 (set by /home/***/test/.python-version)
test$ /usr/bin/python -V
Python 2.7.12

apt のリポジトリを削除する

Ubuntu(16.04) に Spotify をインストールしたのですが、何故かログインできなかったので削除します。

$ dpkg -l | grep -i spotify
ii  spotify-client    1:1.0.49.125.g72ee7853-111     amd64     Spotify streaming music client

$ sudo apt remove spotify-client


リポジトリ登録時に鍵を追加していたので削除します。

$ apt-key list
pub   4096R/D2C19886 2015-05-28 [有効期限: 2017-11-22]
uid                  Spotify Public Repository Signing Key <operations@spotify.com>

$ sudo apt-key del D2C19886
OK

apt-key list で表示されるD2C19886の部分が apt-key delで指定する key-id です。

リポジトリ登録情報を削除します。

$ ls /etc/apt/sources.list.d/
spotify.list
spotify.list.save

$ sudo rm -f /etc/apt/sources.list.d/spotify.list*


最後にsudo apt updateしておきます。

pyenv versions の出力で気になったこと

$ pyenv virtualenv 3.6.2 hoge

を実行したら、環境が作られたのは良いのですが、

$ pyenv versions
  system
* 2.7.13 (set by /home/***/.pyenv/version)
  3.6.2
  3.6.2/envs/hoge
  hoge

hoge だけでなく3.6.2/envs/hogeも作らてしまって。

余計なものな気がして、気持ち悪かったので調べたら、hoge3.6.2/envs/hogeのsymlinkとのことでした。

There are two entries for each virtualenv, and the shorter one is just a symlink.
GitHub - pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv)

確認したら、確かにsymlinkでした。

$ ls -l ${PYENV_ROOT}/versions
合計 8
drwxr-xr-x 6 *** *** 4096  8月 20 13:45 2.7.13
drwxr-xr-x 7 *** *** 4096  8月 20 13:35 3.6.2
lrwxrwxrwx 1 *** ***   42  8月 31 22:31 hoge -> /home/***/.pyenv/versions/3.6.2/envs/hoge

Catalyst の banner で変数が使えた

$(hostname) って書いてあった

会社の Catalyst をいじっていたら、banner に $(hostname)と書いてある設定を見つけた。変数(トークンと言うらしい)使えたんだ。Catalyst 3550 と古い機種なので、ほとんどの機種で使えるのではないかな。

banner motd ^C
---------------------------
Welcome to Catalyst Switch
This switch is $(hostname)
---------------------------
^C

使えるトークンは他にもあるみたいだけど、MTU サイズとか banner で知らされても何が嬉しいのかしら。 www.cisco.com