2012-04-17 2 views
2

1つのネットワークアプリケーションをテストするPythonスクリプトを開発しています。テストの一環として、1つのインターフェイス(物理インターフェイス)から別のインターフェイス(ブリッジ)にネットワーク構成(IPアドレス、ルート...)を移動して、システムを元に戻す必要があります元の状態に戻します。 Pythonでこれを達成する最もエレガントなアプローチは何ですか?IP設定をあるインタフェースから別のインタフェースに移動する

私が考えているいくつかのアイデア:ルートが失われないように、テスト中に物理インターフェイスからIPアドレスの割り当てを解除しない場合は

  1. が。しかし、これは、試験中に同じIPアドレスがブリッジに共存することを意味します。特定のLinuxカーネルでこれが問題になるのでしょうか?しかし、それは私のシステムで正常に動作するようです...
  2. にブリッジを割り当て、物理インターフェイスから割り当てを解除します。 Pythonで簡単に実装するには、単純な呼び出しと解析を行うことが必要です(ifconfig)。しかし、デフォルトルートが物理インターフェイスを通過していた場合は、同じ時刻に、物理インターフェイスからIPアドレスを割り当て解除したときに消えてしまいます。
  3. ip route lsの出力を解析し、IP設定と一緒にルートを移動します。これは唯一合理的なアプローチだと思われますが、かなりのコーディングが必要になります。

  4. 多分もっとエレガントなものがありますか? iptables-save eth0>eth0_confのように、iptables-restore eth0_conf?その他の提案はありますか?

このテストツールは、移植可能で、別のLinuxカーネルで実行できる必要があります。

  1. ブリッジインタフェースがダウン
  2. 設定
  3. ifconfig eth0 down && ifconfig br0 up

実行し、復元するために、ブリッジインタフェースであることを確認します:

答えて

1

私は、次のようなアプローチを示唆し

  1. Execu te ifconfig br0 down && ifconfig eth0 up

ここでは、どのルートのルートを使用しているかによって異なります。明示的なインターフェイスで静的ルートを定義した場合、唯一の選択は、ip route lsの解析と新しいインターフェイスへの変換のようです。

ます。また、周りのアップ&の順序でおもちゃがダウンコマンドだけでなく、複数のルーティングテーブルができ

ip route add <whatever> table 2 
ip rule add from br0 table 2 

しかし、これはトリッキー得ることができますので、私の提案は、簡単な解決策に固執するだろう、たとえそれがもう少しコーディングを含んでいても。

# Usage: transfer_addrs src dst 
# Copy all IP addresses (including aliases) from device $src to device $dst. 
transfer_addrs() { 
    local src=$1 
    local dst=$2 
    # Don't bother if $dst already has IP addresses. 
    if ip addr show dev ${dst} | egrep -q '^ *inet ' ; then 
     return 
    fi 
    # Address lines start with 'inet' and have the device in them. 
    # Replace 'inet' with 'ip addr add' and change the device name $src 
    # to 'dev $src'. 
    ip addr show dev ${src} | egrep '^ *inet ' | sed -e " 
s/inet/ip addr add/ 
[email protected]\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\)@\[email protected] 
s/${src}/dev ${dst}/ 
" | sh -e 
    # Remove automatic routes on destination device 
    ip route list | sed -ne " 
/dev ${dst}\(\|$\)/ { 
    s/^/ip route del/
    p 
}" | sh -e 
} 

# Usage: transfer_routes src dst 
# Get all IP routes to device $src, delete them, and 
# add the same routes to device $dst. 
# The original routes have to be deleted, otherwise adding them 
# for $dst fails (duplicate routes). 
transfer_routes() { 
    local src=$1 
    local dst=$2 
    # List all routes and grep the ones with $src in. 
    # Stick 'ip route del' on the front to delete. 
    # Change $src to $dst and use 'ip route add' to add. 
    ip route list | sed -ne " 
/dev ${src}\(\|$\)/ { 
    h 
    s/^/ip route del/
    P 
    g 
    s/${src}/${dst}/ 
    s/^/ip route add/
    P 
    d 
}" | sh -e 
} 
+0

は私がルートを復元するためのインターフェースをアップ/ダウンさせあなたのアプローチを好む:ここ

は、これを達成するためにxendのnetwork-bridgeスクリプトから別の例です。私はこれが私のために働くかもしれないと思います。今の唯一の問題は、eth0-> br0からルートを移動する方法です(私は両方のインターフェースがテスト中に上がっているはずです)。 –

+0

@AnsisAttekaあなたはあなたの設定をさらに詳しく説明できますか? br0にはどのインタフェースが含まれていますか? eth0とbr0は同じ物理ネットワーク上にありますか?あなたは何を達成しようとしていますか? – mensi

+0

同じサブネット内に2つの物理インターフェースを持つことは、少なくとも私の経験では、痛みをすることができます。私は – mensi

関連する問題