猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

RAWソケットプログラミング

RAWソケットプログラミング(イーサフレーム基本編) RAWソケットプログラミング(イーサフレーム応用編) RAWソケットプログラミング(L3編)

ネットワークプログラミング

ソケットプログラム 自学用のトイプログラム(練習用の小さなおもちゃプログラム)です。 Pythonでソケットプログラミング その1 Pythonでソケットプログラミング その2 Pythonでソケットプログラミング その3 RAWソケットプログラミング 任意のパケットを作成…

Pythonでマルチスレッド

Pythonでマルチスレッドのプログラムを書いてみました。 マルチスレッドの基本 5つのスレッドを起動して、Hello,worldと各スレッドの名前を出力するプログラムです。 import threading def Hello(): print "Hello,world" return threads = [] for num in ra…

Python

Python標準ライブラリ Python2.7の標準ライブラリです。 Python基本文法関連 カプセル化 可変個の引数の取り扱い lambd式 ジェネレータ式 デコレータ HTTP関連 urllibモジュールの使い方 requestsモジュールの使い方 Mapperモジュールの使い方 ログ関連 ログ…

Pythonでソケットプログラミング

https://bitbucket.org/pypy/pypy/src/9d88b4875d6e/lib-python/2.7/SocketServer.py

Pythonでマルチプロセス

ここを参照して簡単なマルチプロセスのプログラムを書いてみました。 シングルプロセス まずは練習として多重度1のマルチプロセス(つまりただのシングルプロセス)を実行してみました。 from multiprocessing import Process def f(name): print 'hello', nam…

Pythonでソケットプログラミング その2

エコーサーバ クライアントからの入力をそのままクライアントに送信するエコーサーバのプログラムです。前回との違いはサーバ側とクライアント側それぞれでwhile文でループにしていることです。 サーバ側 import socket class EchoServer: def __init__(self…

Pythonでソケットプログラミング その1

Hello,worldサーバ サーバではクライアントのIPアドレスを表示します。クライアントに対してはHello,worldというメッセージを送信します。 最低限の機能しかもたないプログラムですが、サーバとしての基本的な機能はすべて含まれています。 サーバ側 #server…

ブラウザ側でキャッシュを無効化

FirefoxおよびChromeでキャッシュを無効化した際に、パケットの中身がどう変わっているのかを確認しました。 こちらがキャッシュを無効化した際のパケットです。 こちらがキャッシュを無効化していないデフォルト設定のパケットです。 両者を見比べると、「I…

Python 独自モジュールの作成 その1

Python標準モジュールにない独自関数を作成して、複数のプログラムから呼び出すにはモジュールを作成する必要があります。作成したモジュールを利用するためにはいくつか方法があるのですが、ここでは比較的シンプルなプログラム中でパスを設定する方法を記…

デコレータの具体例

デコレータの使い方 関数の実行前と実行後にデバッグ目的に関数名をログに出力させるのが目的です。プログラムが使用するすべての関数の、呼び出し時と終了時にログ表示の実行は大変です。そのためデコレータを利用しています。 #log.py import logging logg…

vimのコマンド

本当にいまさらですが、vimのよく使用するコマンドに関してまとめました。 カーソルの移動 上の行に移動 gk 下の行に移動 gj

OpenFlowコントローラRyuを用いてのフローエントリの設定

Ryu3.4でルールおよびアクションの実装をまとめました。スイッチはOpenvSwitchを利用しています。 ソースコードにはマッチとアクションのみを記載しました。実際にスイッチにフローエントリを書き込むには、Ryuのフローエントリ書き込みAPIであるparser.OFPF…

クラスに対してアトリビュートの動的な追加

クラスからインスタンスを作成後に、動的に新しくアトリビュートを追加することができます。 以下の例ではTestクラスのインスタンスtestに、関数add_funcを追加しました。dir()でアトリビュートの一覧を表示させた場合に、add_funcが追加されているのが見て…

デコレータ その3

デコレータに引数がある場合の処理です。以下のようにデコレータの引数を処理するために、ネストをもう一段深くします。 実効結果からデコレータの引数の?が末尾に追加されているのが見て取れます。 #deco4.py def print_is_a_(arg): def _add_string(functi…

文法の基本

lambd式

labmda式を用いることで、無記名関数を利用することができます。 lambda arguments: expression 以下のコードで定義される関数と同様に動作します。 def name(arguments): return expression 使用例 >>> def add(x, y): ... return x*y ... >>> add(2, 3) 6 …

__call__メソッドについて

__call__()メソッドを定義した場合、関数が呼び出せるのと同じようにクラスのインスタンスを呼び出せるようになります。 __call__()メソッド定義時 >>> class Test(object): ... def __init__(self): ... print "__init__" ... def __call__(self): ... prin…

デコレータ その2

デコレータを用いた関数の動作変更 次にデコレータにデコレートしたい関数を引き渡すことで、関数実行時の動作を変更させてみます。そのために、デコレータの中で関数を引数として受け取ったときの動作の処理に関して記述します。 以下の例では、デコレータ…

Ryuのソースコードリーディング その6 Hello worldアプリケーションの作成

OpenflowのHelloメッセージを受信したら、画面にHello worldと出力するだけのもっとも単純なアプリケーションです。 from ryu.base import app_manager from ryu.controller import ofp_event from ryu.controller.handler import MAIN_DISPATCHER from ryu.…

Ryuのソースコードリーディング Ryuの基本的なクラス

Ryuの中で基本的なクラスに関してまとめてみました。ソースコードを読む際の参考にしてください。 アプリケーションクラス ryu.base.app_manager.RyuAppを継承したクラスです。 ユーザはryu.controller.handler.set_ev_clsデコレータで修飾されたイベントハ…

Ryuのソースコードリーディング  その4 Ryuの起動プロセス

下書き TODO コンテクストとかサービスとかの概念がまだよくわかっていないのが問題だ。 ryu-manager実行時の処理 ryu.cmd.managerのmain関数が実行されます。 ryu.cmd.managerでのmain関数の処理 from oslo.config import cfg CONF = cfg.CONF CONF.registe…

iptablesを用いた透過型FWの設定

+--------+ +--------+ +--------+ | eth0 | -----> | br0 | ------> | eth1 | +--------+ +--------+ +--------+ 上の図のようにbr0を介して2枚のNIC(eth0,eth1)がブリッジされている状態を仮定します。eth0からeth1の向きに流れるパケットを遮断するための…

Ryuのソースコードリーディング その3 パケットの送信

Ryu

パケットを作成して、NICからの送信を行います。 パケットの作成 パケットを作成したのちに、add_protocolでL2、L3各レイヤーのヘッダを入れていきます。ここではL3までのパケットを作成しました。引数に指定していないので、デフォルトで設定されている値が…

Ryuのソースコードリーディング その2 パケットの解析

Ryu

Packetクラス packet.pyのソースコードを読むと以下のことがわかります。 パケットクラスは、パケットのデコード/エンコードを行う パケットクラスは、バイナリデータを引数に持つ 各インスタンスは、protocolsというリストがあり、リストの各要素はプロトコ…

Ryuのソースコードリーディング その1 プロトコル

Ryu

前置き Ryu-bookも出たので、そろそろ本格的にRyuのソースコードリーディングをやってみます。まずはRyuのパケットに関するライブラリに関連するコードから読み始めてみます。 プロトコル Ryu/lib/packet以下の[arp/bgp/bpdu/dhcp/ethernet/icmp/icmpv6/igmp…

OpenVSwitch上でのOpenFlowの手動設定

OpenVSwitchはOpenFlowコントローラと接続することでOpenFlowスイッチとして動作させられます。しかしコントローラと接続せずに手動でフローエントリを設定することも可能です。以下に手動でフローエントリを設定するまでの流れをまとめました。 1.「ブリッ…

Ubuntu12.04でssh利用時にrootユーザでのログイン

Ubuntuでもルートのユーザを以下の手順で作成することができます。起動時のログイン画面やsshからルートとしてsudoコマンドを使用せずにログインできます。 ルート用のパスワードの設定 以下のコマンド実行後に、パスワード入力を要求されるので設定をしてく…

ネットワーク関連の関数

IPアドレスをプログラム中のデータとして取り扱うには、文字列として扱うのが一番自然です。しかしパケットヘッダにIPアドレスを含めるには、文字列をバイナリデータに変換する必要があります。 netaddrライブラリを使えば済むのですが、勉強として自作して…

OpenvSwitch上でコマンド経由でのフローエントリの書込み

公式ページに設定可能なルールやアクションに関して記載がされています。これでARPのリクエストの場合のみ…というようにより詳細にアクションの設定ができます。 ARP関連 公式ページに記載はされていませんが、ARPのOpcode(リクエスト/リプライ)までルールに…