paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

Home labについて考える

気になったパッケージを触りたいときVirtualboxやコンテナとかでセコセコ確認したりするんですが、エンジニアたるもの自宅に検証環境欲しいですよね。

でもサーバの置き場所や電気代なんか考えるとなかなかポンと買えないです。

また、今はいろんな仮想環境があるのでどういう構成にするかも考えものです。

そこで自分が欲しい構成について整理します。

Home labに欲しいもの

自宅環境なんて自分で好きなの考えて作れよ!って言われそうですがまずは自分の要件を出してみます。

  • 自宅環境で使えるパッケージ類
    • システムは使ってなんぼなので勉強用よりは使えるものを
  • NWレイヤを意識できるもの
    • 仕事はNWエンジニアなのでルーティングさせてNW構成を意識できるものがいいですね
    • 構成図書くの大好きです
  • 邪魔にならない ‐ 今の家は2DKなんで割と場所はあるのですが、ラックマウント型まではいらないかな…
  • なるべくOSS
    • 抑えられるところはなるべく安くいきましょう

仮想環境の選択

選択肢としてこんな感じですよね。
コンテナか仮想マシンのどちらかでボコボコ立てていくになると思いますが仮想ルータを作りたいのでhyper visorの方がいいかな。

コンテナのNWって何回読んでもまだよく分からないんですよね。

サーバ構成

スペックは後で考えるとしてとりあえず置き場所を考えるとタワー側の1台でいいかな。
クラスタの勉強は仮想マシンでやろう。

ストレージサーバもやってみたいですが物理マシンを買うのは我慢します。

作っておきたい仮想サーバ

ぱっと作ってみたいのはこんな感じ。
この中で自宅環境で活躍しそうなのはldapくらいですかね。
サーバ障害は通知して欲しいのでとりあえずzabbixも立てよう。

結論

そんなこんなで構成を考えていたらいい資料を見つけました。

https://files.sans.org/summit/pen_test_hackfest_2016/PDFs/Building-Your-Own-Kickass-Home-Lab-Jeff-McJunkin.pdf

kickass home labです。

何がkickassなの?

kickassにはやっつける、最高などの意味をもつスラングで使われるようです。
(映画しか知らなかったけど)

オフリースのサーバは安いけどそれよりも静音サーバを作れたら最高じゃない?ってことらしいです。

サーバは自作で、内容はざっくりまとめると

  • vmware workstationベースで作るよ
  • 仮想NWも作るよ
  • ゲストはTURNKEY LINUXでさくっとたてるよ
  • Windowsも検証ライセンスあるよ

という感じです。
結構いい感じじゃない!?

全部自分で作ることばかり考えていましたがTURNKEY LINUXを活用するのはありですね。

一人だとやはり構築していくのもなかなか...
ESXiじゃなくWorkstationていうのも意外とホストの融通が利きそうですね。

資料ではRAM128GBの16coreで800ドルって書いてありますが、日本でこんな安く手に入るんでしょうか?
とりあえず自作に限らずメーカ製でもよいので似たような予算で32GB 8coreあたり目標で探します。

というわけで今回は自宅環境の構想でした。
もう8月が終わりそうですが、ボーナスはまだ手を付けてないのでそろそろ自宅環境構築を目指してわくわくしておきます。

WSLのPrivoxyの機能をいろいろ有効にする

前回インストールしたprivoxyですが、ログが出力されていなかったので有効にします。
ついでに広告ブロックもやってみます。

前回勘違いしていましたが、コンテンツフィルタをしたいわけではないのでProxyサーバに証明書は入れなくても大丈夫ですね。 リバースプロキシとごっちゃになっていたようです。

HTTPSの場合はCONNECTメソッドを投げてプロキシは中継するだけみたいですね。
TLSの終端は通常通りClient - Serverでやると。

Privoxyでやりたいこと

とりあえずこれだけできればOKです。

トラフィックログ出力

マニュアルを読むとデフォルトだとログ出力されず、デバッグを有効にしないといけないようです。

http://www.privoxy.org/user-manual/config.html#LOGFILE

The logfile is where all logging and error messages are written. The level of detail and number of messages are set with the debug option (see below).

デバッグにも出力レベルがあります。 接続先が分かればOKですが、とりあえず推奨レベルをONにします。

debug     1 # Log the destination for each request Privoxy let through. See also debug 1024.
debug   512 # Common Log Format
debug  1024 # Actions that are applied to all sites and maybe overruled later on.
debug  4096 # Startup banner and warnings
debug  8192 # Non-fatal errors

サービス再起動

masashi@DESKTOP-986MNSO:~/privoxy-blocklist$ sudo /etc/init.d/privoxy restart

ログを見てみると…

masashi@DESKTOP-986MNSO:~/privoxy-blocklist$ tail -20 /var/log/privoxy/logfile
(略)
2018-08-18 17:05:29.183 7f0e420b0700 Info: exiting by signal 15 .. bye
2018-08-18 17:05:29.385 7f06e5d30700 Info: Privoxy version 3.0.24
2018-08-18 17:05:29.385 7f06e5d30700 Info: Program name: /usr/sbin/privoxy
2018-08-18 17:05:29.385 7f06e5d30700 Info: Loading filter file: /etc/privoxy/default.filter
2018-08-18 17:05:29.388 7f06e5d30700 Info: Loading filter file: /etc/privoxy/user.filter
2018-08-18 17:05:29.388 7f06e5d30700 Info: Loading actions file: /etc/privoxy/match-all.action
2018-08-18 17:05:29.388 7f06e5d30700 Info: Loading actions file: /etc/privoxy/default.action
2018-08-18 17:05:29.392 7f06e5d30700 Info: Loading actions file: /etc/privoxy/user.action
2018-08-18 17:05:29.393 7f06e5d30700 Info: Listening on port 8118 on IP address 0.0.0.0
2018-08-18 17:05:29.440 7f06e4500700 Request: play.google.com:443/
2018-08-18 17:05:31.147 7f06e30b0700 Request: api.twitter.com:443/
2018-08-18 17:05:31.148 7f06e28a0700 Request: twitter.com:443/
2018-08-18 17:05:34.164 7f06e2090700 Request: tweetdeck.twitter.com:443/
2018-08-18 17:05:39.442 7f06e38c0700 Request: ocsp.digicert.com/
127.0.0.1 - - [18/Aug/2018:17:05:44 +0900] "POST http://ocsp.digicert.com/ HTTP/1.1" 200 0
2018-08-18 17:05:50.232 7f06e38c0700 Request: pbs.twimg.com:443/

おおー取れてますね。
これで変なとこに投げていないか確認できますね。
ということはこのログを分析するツールも作らないといけないわけですね。

あとログローテートもしないとファイルが大きくなってしまうので後でやっておきます。

To prevent the logfile from growing indefinitely, it is recommended to periodically rotate or shorten it.

広告ブロック有効化

Arch Wikiの手順に沿ってやります。
Arch Wikiはいろんな機能の記事が豊富にあるので助かります。

普段FirefoxAdblockを使っているのでこのフィルタを使わせてもらいます。

Privoxy - ArchWiki

ツールをインストール

masashi@DESKTOP-986MNSO:~$ git clone https://github.com/Andrwe/privoxy-blocklist.git
Cloning into 'privoxy-blocklist'...
remote: Counting objects: 7, done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 7
Unpacking objects: 100% (7/7), done.
Checking connectivity... done.
masashi@DESKTOP-986MNSO:~$
masashi@DESKTOP-986MNSO:~$ cd privoxy-blocklist/
masashi@DESKTOP-986MNSO:~/privoxy-blocklist$ ls
privoxy-blocklist.sh  privoxy-blocklist_test.sh  README.md
masashi@DESKTOP-986MNSO:~/privoxy-blocklist$ ./privoxy-blocklist.sh
Root privileges needed. Exit.

…

権限がない?のでsudoで

masashi@DESKTOP-986MNSO:~/privoxy-blocklist$ sudo ./privoxy-blocklist.sh
[sudo] password for masashi:
The config directory /etc/conf.d doesn't exist. Please either adjust the variable SCRIPTCONF in this script or create the directory.

今度はファイルがない…作ってくれないのか。

masashi@DESKTOP-986MNSO:~/privoxy-blocklist$ sudo ./privoxy-blocklist.sh
No config found in /etc/conf.d/privoxy-blacklist. Creating default one and exiting because you might have to adjust it.
masashi@DESKTOP-986MNSO:~/privoxy-blocklist$

ファイルができたようです。
手順に沿ってコメントインします。

12行目から3行をコメントイン

 12 PRIVOXY_USER="privoxy"
 13 PRIVOXY_GROUP="privoxy"
 14 PRIVOXY_CONF="/etc/privoxy/config"

インストールします

masashi@DESKTOP-986MNSO:~/privoxy-blocklist$ sudo ./privoxy-blocklist.sh
Processing https://easylist-downloads.adblockplus.org/easylistgermany.txt ...

Downloading https://easylist-downloads.adblockplus.org/easylistgermany.txt ...
.. downloading done.
install: invalid group ‘privoxy’

(略)

install: invalid group ‘privoxy’
... http://adblockplus.mozdev.org/easylist/easylist.txt installed successfully.

フィルターをダウンロードしてprivoxyのフォーマットに変換して書き込んでくれたようです。


訂正

上記スクリプトですが、上手く動いていませんでした。
成功するとeasylistgermany.script.xxxというファイルとconfigファイルに追記してくれます。
別の環境ですが、以下のようになります。

失敗
vagrant@vagrant:~/privoxy-blocklist$ sudo ./privoxy-blocklist.sh
Processing https://easylist-downloads.adblockplus.org/easylistgermany.txt ...

Downloading https://easylist-downloads.adblockplus.org/easylistgermany.txt ...
.. downloading done.
sed: character class syntax is [[:space:]], not [:space:]
install: invalid group ‘privoxy’
(略)

よく見るとグループ無効のメッセージが…

vagrant@vagrant:~/privoxy-blocklist$ diff -u /etc/privoxy/config ../config.old

configも変化なしです。

成功

スクリプトの中身に沿ってグループを作成します。(ユーザーはパッケージインストール時に作成済み)

vagrant@vagrant:~/privoxy-blocklist$ sudo groupadd privoxy
vagrant@vagrant:~/privoxy-blocklist$ sudo ./privoxy-blocklist.sh
Processing https://easylist-downloads.adblockplus.org/easylistgermany.txt ...

Downloading https://easylist-downloads.adblockplus.org/easylistgermany.txt ...
.. downloading done.
sed: character class syntax is [[:space:]], not [:space:]

Modifying /etc/privoxy/config ...
... modification done.

Installing new config ...
... installation done
(略)

invalid groupのメッセージが消えました。

vagrant@vagrant:~/privoxy-blocklist$ diff -u /etc/privoxy/config ../config.old
--- /etc/privoxy/config 2022-01-08 05:03:49.799406948 +0000
+++ ../config.old       2022-01-08 05:01:43.028048888 +0000
@@ -383,7 +383,6 @@
 #
 actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.
 actionsfile default.action   # Main actions file
-actionsfile easylistgermany.script.action
 actionsfile user.action      # User customizations
 #
 #  2.6. filterfile

configファイルに追記されてます。

vagrant@vagrant:~/privoxy-blocklist$ ls -l /etc/privoxy/
total 332
-rwxr-xr-x 1 privoxy privoxy 74163 Jan  8 05:03 config
-rw-r--r-- 1 root    root    92760 Mar 18  2021 default.action
-rw-r--r-- 1 root    root    40764 Mar 18  2021 default.filter
-rwxr-xr-x 1 privoxy privoxy 53215 Jan  8 05:03 easylistgermany.script.action
-rwxr-xr-x 1 privoxy privoxy    54 Jan  8 05:03 easylistgermany.script.filter
-rw-r--r-- 1 privoxy root      827 Mar 18  2021 match-all.action
-rw-r--r-- 1 root    root    39828 Mar 18  2021 regression-tests.action
drwxr-xr-x 2 root    root     4096 Dec 31 04:19 templates
-rw-r--r-- 1 privoxy root     3646 Mar 18  2021 trust
-rw-r--r-- 1 privoxy root     8685 Mar 18  2021 user.action
-rw-r--r-- 1 root    root     3236 Mar 18  2021 user.filter

easylistgermany.script.xxxが作成されてます。


再起動して試してみます。 FirefoxAdblockを切って…

f:id:paloma69:20180818172353p:plain

効いているようです!
でもブロックログとかは出ないんですかね。
膨大になっちゃうか。

とりあえず動いたのでよし!
でも画面表示が1秒くらい遅くなった気がします。
この辺は支障がでてきたらキャッシュサーバも検討しようと思います。
というか読み込みが遅くなったらわざわざ広告カットした意味がないような(笑)
スマホとか見るときに見やすくなるからいいか。

ちなみにスマホからプロキシONにしたけどページが表示されませんでした。
デフォゲのルータのほう向いちゃってるのが悪いのかな?
ルータにリダイレクト入れればできるか…これは今度やってみます。

前回の宿題

WSLのubuntuはsystemdが無いって書きましたがissueに上がっていたようです。
中身まだ読めてません…。

https://github.com/Microsoft/WSL/issues/1579

参考サイト
https://blog.himanoa.net/entries/19

追記

広告ブロックスクリプトが実はうまくいっていなかったので訂正を追加しました。
このファイルがないのでブロックできていなかったことになりますが、uriのパターンで弾くものがいくつかあったので効果はありました。

広告ブロック機能がうまくいくかは再度デプロイしたものがありますのでこちらを運用してみて確かめます。

privoxyをdockerで作り直す 自分でbuild編 - paloma blog

WSLでProxyサーバを有効にしてみる

家のメイン機はWindows10を使っているのですが、WSLを動かして簡単なコマンド確認とかに使っています。

前からプロキシを導入したいと思っていたのでWSLでできるか試してみます。

今はUbuntu16.041つだけ入っていてこんな感じ。

masashi@DESKTOP-986MNSO:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"

masashi@DESKTOP-986MNSO:~$ uname -a
Linux DESKTOP-986MNSO 4.4.0-17134-Microsoft #137-Microsoft Thu Jun 14 18:46:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux

プロキシサーバはprivoxyを使います。
Privoxy - Home Page

squidしか知らなかったのですが、調べ物をしていてたまたま発見し、導入が簡単そうなので使ってみることにしました。
キャッシュ機能はなく、広告ブロックやTorとの連携ができるみたいです。

インストール

aptでいれます。

masashi@DESKTOP-986MNSO:~$ sudo apt install privoxy
masashi@DESKTOP-986MNSO:~$ dpkg -l | grep privoxy
ii  privoxy                          3.0.24-1                                   amd64        Privacy enhancing HTTP Proxy
masashi@DESKTOP-986MNSO:~$
masashi@DESKTOP-986MNSO:~$ privoxy --version
Privoxy version 3.0.24 (http://www.privoxy.org/)
masashi@DESKTOP-986MNSO:~$

サービス起動

systemctlで動かなかったのでinitで起動。
WSLのubuntuはsystemdじゃない?
後で調べよう。

masashi@DESKTOP-986MNSO:~$ sudo systemctl start proivoxy
Failed to connect to bus: No such file or directory
masashi@DESKTOP-986MNSO:~$
masashi@DESKTOP-986MNSO:~$ sudo /etc/init.d/privoxy start
 * Starting filtering proxy server privoxy                                                                       [ OK ]
masashi@DESKTOP-986MNSO:~$

起動確認

masashi@DESKTOP-986MNSO:~$ ss -lnt
State      Recv-Q Send-Q               Local Address:Port                              Peer Address:Port
Cannot open netlink socket: Protocol not supported
masashi@DESKTOP-986MNSO:~$
masashi@DESKTOP-986MNSO:~$
masashi@DESKTOP-986MNSO:~$ netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
masashi@DESKTOP-986MNSO:~$

あれ?Listenしてない…

プロセスを見てみる。

masashi@DESKTOP-986MNSO:~$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   8304    56 ?        Ss   Jul16   0:00 /init ro
root         3  0.0  0.0   8304    52 tty1     Ss   Jul16   0:00 /init ro
masashi      4  0.0  0.0  15112  3328 tty1     S    Jul16   0:00 -bash
masashi   1253  0.0  0.0  12548  1100 tty1     R    13:41   0:00 script 20180815_134125.log
masashi   1254  0.0  0.0  15028  3716 pts/0    Ss   13:41   0:00 bash -i
privoxy   4067  0.0  0.0  12100  1272 ?        Ss   13:51   0:00 /usr/sbin/privoxy --pidfile /var/run/privoxy.pid --user
masashi   4073  0.0  0.0  15664  1852 pts/0    R    14:07   0:00 ps aux
masashi@DESKTOP-986MNSO:~$

動いてるよなー。

ぐぐったら気になるページを見つけました。

http://murkyideas.xsrv.jp/index.php?WSL%20on%20Windows10

sshdがソケットをLISTENしてもUbuntu側でnetstat -ant|grep LISTENとかやってもみえない(WSLのネットワーク周りとかユーザ周りは完全にWindows側のエミュレーションで動いていて、カーネルから何か読み出そうとしても失敗する、たとえばdmesgでさえ)

windows側でしかみえないのか? 確認してみます。
わかりやすいようにこっちはキャプチャで。

f:id:paloma69:20180815151904p:plain

ポートあがってますね。

プロセスも確認。

f:id:paloma69:20180815151945p:plain

privoxy見えてる。
これで動くのかな?

ブラウザで有効にする。

Firefoxをメインで使っているので、オプションから変更。

f:id:paloma69:20180815152243p:plain

検索してみます。

f:id:paloma69:20180815152417p:plain

一応ページは表示できるが動いているのか?
ログは何もでていません。

masashi@DESKTOP-986MNSO:~$ ls /var/log/privoxy/logfile -l
-rw-r--r-- 1 privoxy nogroup 0 Aug 15 13:45 /var/log/privoxy/logfile

というかHTTPSだとプロキシ側に証明書かまさないといけない気がする…。

今日はここまで

サービスは起動できましたが、動いているのかわかりませんでした。
今後はログの有効化、広告ブロック等の機能を有効にしていきたいと思います。
Torなんかも一回使ってみたいです。

8月になった

先月は仕事が忙しくて全部記事をかけませんでした。
openpyxlさえ入れとけばexcel方眼紙の設計書なんか瞬殺だと思っていたけど甘かったです。

今のフォーマットを崩さず入出力をどうすっかと考えながらて入力してます。


先月は着手できなかったけど夏の間にやりたいことメモっときます。

  • portainer.ioを触ってみる
    • LXDがシンプルで好きですが、時代の流れはDockerが修理だと思いますので軽めの管理ツールを触ってみようかなと。
      kubernetesやrancherは個人で触るには思い気がします。
  • proxyサーバを立ててみる
    • 自宅のトラフィックログを取ってみたくなったので作ってみます。
      NW機器買ったりするよりお手軽にできるはず
  • VPSを契約する
    • このブログは技術用ブログで使いたいので他の話は別にwordpressとかで作ろうかなと考えてます。
      せっかくなのでサイトの運用経験もつけようでVPSでやるつもりです。 どこ使うかは検討中。

twitterで通勤中にブログかくと捗るよって言うツイートを見たので今日試してみました。
でもスマホだと書きづらいし画像やソースも張りづらいです。

PC持ち出して書くほどでもないのでやりたいことを思いとどめるだけにした方が良さそうです。
あと途中で一回公開ボタン押してしまいました(笑)

pythonで出力した通信要件を加工する

7月に入りました。2018年も折り返しです。
今年は本プログの記事を週一ペースで50本上げることが目標なのですが、ちょっと足りてないですね。 後半頑張れるか…


前回出力した通信要件をもう少し加工します。

(python3) masashi@PC-ubuntu:~/trafficsorting$ python traffic.py 
<Worksheet "通信一覧">
any 192.168.10.1/24 TCP 80
any 192.168.10.2/24 TCP 80
<Worksheet "通信一覧">
192.168.10.1/24 192.168.20.1/24 TCP 8009
192.168.10.1/24 192.168.20.2/24 TCP 8009
192.168.10.2/24 192.168.20.1/24 TCP 8009
192.168.10.2/24 192.168.20.2/24 TCP 8009
<Worksheet "通信一覧">
192.168.20.1/24 192.168.30.1/24 TCP 1521
192.168.20.2/24 192.168.30.1/24 TCP 1521
<Worksheet "通信一覧">
192.168.40.1/24 192.168.10.1/24 ICMP -
192.168.40.1/24 192.168.10.2/24 ICMP -
<Worksheet "通信一覧">
192.168.40.1/24 192.168.20.1/24 ICMP -
192.168.40.1/24 192.168.20.2/24 ICMP -
<Worksheet "通信一覧">
192.168.40.1/24 192.168.30.2/24 ICMP -
192.168.40.1/24 192.168.30.3/24 ICMP -

こんな感じでわっと出るのですがconfig等に利用したいのでもう少し加工します。

成形

シート名を出すようにしたのですが邪魔なので消します。
pythonだけで完結できたらいいのですが、未熟なものでshellの力を借ります。

(python3) masashi@PC-ubuntu:~/trafficsorting$ python traffic.py | grep -vE "Error|^<"
any 192.168.10.1/24 TCP 80
any 192.168.10.2/24 TCP 80
192.168.10.1/24 192.168.20.1/24 TCP 8009
192.168.10.1/24 192.168.20.2/24 TCP 8009
192.168.10.2/24 192.168.20.1/24 TCP 8009
192.168.10.2/24 192.168.20.2/24 TCP 8009
192.168.20.1/24 192.168.30.1/24 TCP 1521
192.168.20.2/24 192.168.30.1/24 TCP 1521
192.168.40.1/24 192.168.10.1/24 ICMP -
192.168.40.1/24 192.168.10.2/24 ICMP -
192.168.40.1/24 192.168.20.1/24 ICMP -
192.168.40.1/24 192.168.20.2/24 ICMP -
192.168.40.1/24 192.168.30.2/24 ICMP -
192.168.40.1/24 192.168.30.3/24 ICMP -

これで通信だけになりました。
出た結果をファイルにリダイレクトして、さらにネットワークに変換する処理を咬ませます。

ipaddressモジュール

ipaddressというモジュールを使います。

IPv4Interfaceというクラスがあり、
CIDR表記のIPアドレスをネットワークアドレスに変換してくれます。

ルーティング、ACLはネットワーク単位で書くことが多いのでこの変換は大変便利です。

さっきの結果をネットワークアドレスに変換するプログラムです。
文字列はエラー吐いてしまうのでこれもtryでハンドリングします。
(馬鹿の一つ覚えみたいにtry文を使ってしまいます)

いろんな本をちょろちょろ読んでるので、pythonの書き方がバラバラです。
そろそろ統一していかないと。

#!/usr/bin/env python3
import ipaddress

def main():
    with open('pattern.txt') as f:
        for row in f:
            try:
                column = row.strip().split()
                print(ipaddress.IPv4Interface(column[0]).network, ipaddress.IPv4Interface(column[1]).network, column[3])
            except:
                print('Error: ', column[0], column[1], column[3])


main()
  • さっきリダイレクトしたファイルをread
  • 列操作をしやすくするためにスペース区切りにする
  • 1列目、2列目をネットワークアドレスに変換して出力ついでにポート番号も入れておきます。
  • 文字列がある行はErrorの文字をつけて出力

動かしてみる

(python3) masashi@PC-ubuntu:~/trafficsorting$ python subnet.py 
Error:  any 192.168.10.1/24 80
Error:  any 192.168.10.2/24 80
192.168.10.0/24 192.168.20.0/24 8009
192.168.10.0/24 192.168.20.0/24 8009
192.168.10.0/24 192.168.20.0/24 8009
192.168.10.0/24 192.168.20.0/24 8009
192.168.20.0/24 192.168.30.0/24 1521
192.168.20.0/24 192.168.30.0/24 1521
192.168.40.0/24 192.168.10.0/24 -
192.168.40.0/24 192.168.10.0/24 -
192.168.40.0/24 192.168.20.0/24 -
192.168.40.0/24 192.168.20.0/24 -
192.168.40.0/24 192.168.30.0/24 -
192.168.40.0/24 192.168.30.0/24 -

サブネットに変換されましたね。
これだと重複行がでるのでここでもshellの力を借ります。

(python3) masashi@PC-ubuntu:~/trafficsorting$ python subnet.py | sort | uniq
192.168.10.0/24 192.168.20.0/24 8009
192.168.20.0/24 192.168.30.0/24 1521
192.168.40.0/24 192.168.10.0/24 -
192.168.40.0/24 192.168.20.0/24 -
192.168.40.0/24 192.168.30.0/24 -
Error:  any 192.168.10.1/24 80
Error:  any 192.168.10.2/24 80

このようにパターンがシンプルになりました。
サンプルなんで全部24ビットで書いてしまいましたが他のサブネットで書いてもちゃんと出力してくれます。

今回はここまでしか動かしていませんが、sedawkで処理すればそのままconfigに使えそうです。

Error行は処理をまるまるスキップさせたので手で変換しないといけないですが、
any -> 0.0.0.0/0みたいにIPアドレスに変換して綺麗にしてしまいたいですね。

まとめ

pythonファイルが分割していたり途中でshellを挟んだりとエレガントさに欠ける処理ですが、
目視で確認していくよりずっと早く落とし込みができそうです。

通信要件の資料って書く人によってばらつきがあるので、綺麗に出したければ自分で元ファイルを修正する必要がありますが、何とか使いやすい形に持ってくることができました。

このフローは日々の業務で発生するので、メンテして使いやすくしていきたいと思います。
本チャンの資料は上げられませんがコードはgithubにでもあげようかな。

ipaddressモジュール、IPアドレス用の処理がいろいろできそうでネットワークエンジニアとしていろいろ遊んでみたいですが、うまい使い道が思い浮かばないですね。
IPv6変換とかできたら使えるかな?

pythonで通信要件を一意に出力する

私はSIerのネットワークエンジニアとして働いているのですが、どこのシステムでも設計のために通信要件一覧というのがあると思います。
(Web系の業界は詳しくないので使っていないかも)

FWやルーティング設計のために、通信名, From, To, Portなど書かれることが多いと思います。

また、資料はExcelで作られているものが多いと思いますが、方眼紙とまではいかなくても使い勝手はよくありません。
正直私の現場では使いづらいです。

こんな感じ

サンプルなので適当に作りましたが、送信元、宛先、IPアドレス、ポートなどは最低限書いてあると思います。
(Ubuntuで検証したのでLibreOfficeです)

f:id:paloma69:20180629001724p:plain

ネットで調べてもこんな感じのが出てきます。

小規模システムなら良いですが、大規模で大量の種類の通信があるシステムもこの様に書かれると、
読むのもパラメータに落とすのも一苦労です。
書き方によっては重複の行がいくつか出てくることもあります。

対象のセルをコピーして他の資料に貼り付ければいいのですが、
セル内改行のものがあったりすると一気に使い勝手が悪くなります。

こういうのをいちいち転記するのも馬鹿らしいので、Configに落としていく際に簡単にできないかと思いpythonで書いてみました。

やりたいこと

  • 各Cellに書かれている値を抽出する
  • Cellに数行書かれている場合も1行ずつ出力する
  • Config作成用にIPアドレスとポートだけ出力する

Excelファイルを処理するのはopenpyxlモジュールでやります。

今回ファイルは同階層におきます。

(python3) masashi@PC-ubuntu:~/trafficsorting$ ls
traffic.py  通信要件.xlsx
  • IPとポートだけ出力できれば良いのでD,F,G,H列だけ処理します。
  • 処理が途中で止まらないように書き方が変なセルは行数をメモっときます。
    • まだハンドリングが不完全なので空白でも反応してしまいます。
  • 複数シートがある場合を想定して一応シート名も出力します。
  • セル内改行してあるものは改行コードで文字列を分割します。
  • 全パターン抽出するにはforをネストすることによってできるようです。
    (もっと綺麗な方法があるかも)
#!/usr/bin/env python3

import openpyxl

wb = openpyxl.load_workbook("通信要件.xlsx", data_only = True)

wsa = wb['通信一覧']

def Traffic(sheet, ret):
    try:
        # All pattern output for each cell value
        for src in sheet['D' + str(ret)].value.split():
            for dst in sheet['F' + str(ret)].value.split():
                    for ptc in sheet['G' + str(ret)].value.split():
                            for port in str(sheet['H' + str(ret)].value).split():
                                print(src, dst, ptc, port)
    except:
        print(str(ret) + ' row has Error!')
        print('Cell\'s value is "x.x.x.x/x" with numbers only.')
        pass

# Display sheet to last line
for a in range(3, wsa.max_row + 1):
    print(wsa)
    Traffic(wsa, a)

動かしてみる

(python3) masashi@PC-ubuntu:~/trafficsorting$ python traffic.py 
<Worksheet "通信一覧">
any 192.168.10.1/24 TCP 80
any 192.168.10.2/24 TCP 80
<Worksheet "通信一覧">
192.168.10.1/24 192.168.20.1/24 TCP 8009
192.168.10.1/24 192.168.20.2/24 TCP 8009
192.168.10.2/24 192.168.20.1/24 TCP 8009
192.168.10.2/24 192.168.20.2/24 TCP 8009
<Worksheet "通信一覧">
192.168.20.1/24 192.168.30.1/24 TCP 1521
192.168.20.2/24 192.168.30.1/24 TCP 1521
<Worksheet "通信一覧">
192.168.40.1/24 192.168.10.1/24 ICMP -
192.168.40.1/24 192.168.10.2/24 ICMP -
<Worksheet "通信一覧">
192.168.40.1/24 192.168.20.1/24 ICMP -
192.168.40.1/24 192.168.20.2/24 ICMP -
<Worksheet "通信一覧">
192.168.40.1/24 192.168.30.2/24 ICMP -
192.168.40.1/24 192.168.30.3/24 ICMP -

ちゃんと出ました!

全てのパターンに対し、一意な値で出力できました。
また、テキストで出力する事により検索等しやすくなりました。

シート名が都度出てしまうのがかっこ悪いのでもう少し綺麗にしたいですね。

改修は置いといて次回は出力結果をもう少し加工したいと思います。

その他課題

セルが結合してあると結合がある行がまるまるエラーとして出力されてしまったので、実はExcelを修正しました。
これはどう直すかな…

pythonのmain関数についてメモ

Baculaについて残課題はいろいろ残っていますが、いったんバックアップも取れたのでまたほかの事書きたいと思います。

というわけでまたpythonです。


今「Python Programming: An Introduction to Computer Science」という本を読んでいます。
その中にmain関数について説明している部分があったのでメモします。

  • pythonプログラムの実行について

    • 直接実行するもの
    • 他のプログラムからインポートされる
      • ライブラリと呼ばれる
  • これまで(書籍内のサンプルコード)はmain関数を呼び出す行が一番下にあった

こんなの

def main():
    print(’Hello’)

main()
  • Pythonはインポートプロセス中にモジュールの行を評価する
  • 一般にモジュールをimportする際はモジュールを実行させないほうが良い
  • インポートされたか、直接実行できるプログラムでは一番下のmainへの呼び出しを条件付きにする必要がある
if __name__=='__main__':
    main()
  • モジュールがインポートされるたびに、pythonはimportされたモジュールの名前にnameという名前のモジュール内の特別な変数を設定する。
>>> import math
>>> 
>>> math.__name__
'math'
>>> 
>>> __name__
'__main__'
  • mathをimportするとname変数にmathが割り当てられている
  • pythonコードが直接実行(not import)されている場合、pythonはnameの値をmainに設定する

つまりこの記載となっているモジュールをインポートしてもname変数がmainでないため、処理が実行されないということですね。
余計な動きをさせないようにってことでいいのかな?

いろんなブログとかでこの表記が出てきていまいちわからなかったけどなんとなく動きが理解できました。
name変数が何者なのかも調べたいな。