2

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

私が考えたいくつかのアイデア:

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

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

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

4

1 に答える 1

1

次のアプローチをお勧めします。

  1. ブリッジインターフェイスがダウンしていることを確認します
  2. ブリッジインターフェイスを構成します
  3. 実行するifconfig eth0 down && ifconfig br0 up

そして復元するには:

  1. 実行するifconfig br0 down && ifconfig eth0 up

さて、ルートについては、あなたが持っているルートの種類に依存します。明示的なインターフェイスを使用して静的ルートを定義した場合、唯一の選択肢は、ip route lsそれらを解析して新しいインターフェイスに変換することです。

また、upコマンドとdownコマンドの順序、および複数のルーティングテーブルをいじることもできます。

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

ただし、これには注意が必要な場合があるため、コーディングがさらに含まれている場合でも、単純なソリューションに固執することをお勧めします。

network-bridgeこれを実現するためのxendのスクリプトの別の例を次に示します。

# 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/
s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\)@\1@
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
}
于 2012-04-17T11:38:21.273 に答える