2012-04-17 65 views
2

我開發,測試一個網絡應用的Python腳本。作爲測試的一部分,它需要將網絡配置(IP地址,路由...)從一個接口(物理接口)移動到另一個接口(網橋),並在測試完成後,將系統恢復到原來的狀態。什麼是在Python中完成這個最優雅的方法?移動IP配置到另一個

一些想法,我曾想過:

  1. 在測試期間不取消從物理接口的IP地址,這樣路由不會丟失。但是,這將意味着相同的IP地址將共存於在測試過程中。這會成爲某些特定Linux內核的問題嗎?雖然,它似乎在我的系統上工作得很好...
  2. 將IP地址分配給網橋並取消分配從物理接口。易於在python中實現,因爲這需要執行簡單的ifconfig調用和解析。但如果默認路由是通過物理接口,那麼它將在同一時間消失,當我從物理接口未分配IP地址。
  3. 解析ip route ls輸出和路由與IP配置一起移動。這似乎是唯一合理的方法,但需要相當多的編碼。

  4. 也許有一些更優雅?像iptables-save eth0>eth0_confiptables-restore eth0_conf?還有其他建議嗎?

該測試工具必須是可移植的,並且能夠在不同的Linux內核上運行。

回答

1

我建議以下方法:

  1. 確保橋接接口是向下
  2. 配置橋接接口
  3. 執行ifconfig eth0 down && ifconfig br0 up

,並恢復:

  1. 執行te ifconfig br0 down && ifconfig eth0 up

現在的路線取決於你有什麼樣的路線。如果您使用顯式接口定義靜態路由,您唯一的選擇似乎是解析ip route ls並將它們轉換爲新接口。

您也可以玩弄的了&順序圍繞下命令以及多個路由表:

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

但這可能很麻煩,所以我的建議是堅持簡單的解決方案,即使它包含更多的編碼。

下面是xend管的network-bridge腳本另一個例子來實現這一目標:

# 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

我喜歡你帶來向上/向下的接口,以恢復路線的方法。我想這可能適用於我。現在唯一的問題是 - 如何從eth0-> br0移動路由(我相信在測試過程中兩個接口都應該啓動)。 – 2012-04-17 17:09:56

+0

@AnsisAtteka你能詳細闡述一下你的設置嗎? br0包含哪些接口? eth0和br0在同一個物理網絡上嗎?你想達到什麼目的? – mensi 2012-04-17 17:31:59

+0

至少根據我的經驗,在同一子網中有兩個物理接口可能會很痛苦。我設法通過爲接口使用單獨的路由表來解決這些問題。 – mensi 2012-04-17 17:32:54