2

我正在开发一个测试一个网络应用程序的 Python 脚本。作为测试的一部分,它需要将网络配置(IP 地址、路由...)从一个接口(物理接口)移动到另一个接口(网桥),测试完成后,将系统恢复到原始状态. 在 Python 中完成此任务的最优雅的方法是什么?

我想过的一些想法:

  1. 在测试过程中不要取消分配物理接口的IP地址,以免路由丢失。但这意味着在测试期间,相同的 IP 地址将在网桥上共存。这会是某些特定 Linux 内核的问题吗?虽然,它似乎在我的系统上工作得很好......
  2. 分配 IP 地址以桥接并从物理接口取消分配。易于在 python 中实现,因为这需要进行简单的ifconfig调用和解析。但是如果默认路由是通过物理接口,那么当我从物理接口取消分配IP地址时,它会同时消失。
  3. 解析ip route ls输出并将路由与 IP 配置一起移动。这似乎是唯一合理的方法,但需要大量编码。

  4. 也许有更优雅的东西?像iptables-save eth0>eth0_confiptables-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

但这可能会变得棘手,所以我的建议是坚持简单的解决方案,即使它包含更多编码。

这是另一个来自 xendnetwork-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/
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 回答