Bash 如何防止频繁切换具有多个接口的机器的默认源ip

Bash 如何防止频繁切换具有多个接口的机器的默认源ip,bash,routing,tcp-ip,iproute,Bash,Routing,Tcp Ip,Iproute,目标是在具有多个接口和实时ip的机器上频繁更改默认传出源ip 我根据文档使用ip路由替换默认值,并让脚本在循环中运行一段时间。它会暂时更改源ip,但随后会丢失对计算机的所有internet访问。它必须从web界面远程重新启动才能正常工作 是否有任何东西可能会阻止它稳定工作。我已经在多台服务器上尝试过了 下面是一个最起码的例子 # extract all currently active source ips except loopback IPs="$(ifconfig | grep 'ine

目标是在具有多个接口和实时ip的机器上频繁更改默认传出源ip

我根据文档使用ip路由替换默认值,并让脚本在循环中运行一段时间。它会暂时更改源ip,但随后会丢失对计算机的所有internet访问。它必须从web界面远程重新启动才能正常工作

是否有任何东西可能会阻止它稳定工作。我已经在多台服务器上尝试过了

下面是一个最起码的例子

# extract all currently active source ips except loopback
IPs="$(ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 |
awk '{ print $1}')"

read -a ip_arr <<<$IPs

# extract all currently active mac / ethernet addresses
Int="$(ifconfig  | grep 'eth'| grep -v 'lo' | awk '{print $1}')"
read -a eth_arr <<<$Int

ip_len=${#ip_arr[@]}
eth_len=${#eth_arr[@]}

i=0;
e=0;

while(true); do

    #ip route replace 0.0.0.0 dev eth0:1 src 192.168.1.18
    route_cmd="ip route replace 0.0.0.0 dev ${eth_arr[e]} src ${ip_arr[i]}"
    echo $route_cmd
    eval $route_cmd

    sleep 300

    (i++)
    (e++)

    if [ $i -eq $ip_len ]; then
        i=0;
        e=0;
        echo "all ips exhausted - starting from first again"
    #   break;
    fi

done
#提取除环回之外的所有当前活动源IP
IPs=“$(ifconfig | grep”inet addr:'| grep-v'127.0.0.1'| cut-d:-f2|
awk'{print$1}')”

read-a ip_arr我想发表评论,但由于我没有足够的分数,它不会让我发表评论

考虑:

  • 在再次运行之前改变延迟时间是否会改变失败之前的迭代次数
  • 每次更改ifconfig&routes时,都会导出它,以查看随着时间的推移是否存在有意义的变化。也许对它进行一些基本测试(ping、nslookup等),基本上找出它到底出了什么问题。还将您发送的命令导出到日志文件(每次更改的文本文件?),以查看其中的更改,并查看在x次迭代后是否有不同的命令
  • 什么连接丢失了?新当选的外向的?具体应用
  • 您说您在其他服务器上使用/执行此操作没有问题
  • IP是静态的(/etc/network/interfaces)、bootp/DHCP、半静态的(基于MAC地址的bootp/DHCP服务器服务),如果由bootp/DHCP服务,租约期限是多长
关于最后一句话: bootp/dhcp将提供x个持续时间的IP。说是60分钟。在这一半时间后,它将与bootp/dhcp服务器“检查”是否可以保留IP,并再次将租约延长到60分钟,这可能意味着在ifconfig上进行一次小的重新配置(甚至可能在脚本的同一时间?)


hth

(true)
是一个错误(无害但仍然是一个错误),它生成了一个无意义的子shell。您缺少了一个开头
i++
行上的
(我认为这是一个抄写错误。如果您不需要(也不需要在这里)的话,请不要搞乱
eval
)。如果您想查看正在运行的命令,可以使用
set-x
/
set+x
set-v
/
set+v
围绕
ip路由
行,让shell打印出它运行的命令(
-x
)或它读取的行(
-v
)在你那里。在这个过程中,事情会在哪里中断?第一次传递的结束?随机?发生时路由的状态是什么?所有的接口都在同一个LAN上(例如,192.168.1.0/24?)谢谢大家,是的,请原谅输入错误“脚本即使在后台运行几天也可以正常工作。对于前10-15次迭代(其中ip基本上改变了15次左右)一切正常。在那之后,随机地,这台机器失去了访问internet的能力。因为它是一台远程服务器,我也不能ping任何接口-所以我必须从基于http的控制面板重新启动它,它才能恢复ssh访问。是的,它们都在同一个LAN上。但是在它断开路由ta时,它们都是活动的ble看起来完全正常,即最后设置的源ip显示为默认ip。这是internet访问能力的问题。我的直觉是,频繁更改来自同一子网的源ip对中间路由器上的路由表条目是否有任何可能的影响机器是否仍能在以下位置到达其网关它崩溃了?它能通过环回与自己对话吗?接口是否充满了冲突?网络缓冲区是否充满了未发送/未读的数据包?当它崩溃时,你还能让脚本向你倾诉什么关于系统的一般网络状态?谢谢。我已经尝试了大多数建议。a)否b)我已经实际记录到一个文件中。路由表等都是每次更改后的完美状态。c)主连接丢失正在传出。但由于机器是远程的,我正在对其进行ssh,这也导致我的ssh连接冻结。d)不,我实际上在两个不同的服务器上尝试了这一点,每个服务器都有4-5个接口和不同的live ip,结果是相同的。e) IP是基于DHCP的,但租赁期限要长得多。如果我错过了一些东西,包括你的最后一点,我会重新评估每一个。谢谢。嗯,外向不工作意味着两件事。1.内部无法找到“退出”或2的方法。外部设备/软件正在变得混乱。@fayyazkl我会寻找独立的方法来检查连接,比如ping到某个远程主机。如果ping可以工作,但(填写应用程序,可以使用例如wget进行测试)不能工作,那么ping是通过ICMP协议进行的,而不是通过TCP或UDP。这意味着它通常不会被防火墙或w/e触及。您与SSH失去连接是可以理解的,因为脚本基本上告诉服务器使用不同的IP来推出数据包。如果路由返回不知道连接将被转移到不同的源IP,这可能是一个问题。此外,DNS中是否列出了所有IP?嗯,如果更改后的配置良好,在我看来似乎存在一些奇怪的错误,数据包的返回变得不对称,这可能会混淆顶部的应用程序/服务。我会先在主机上进行一分钟的nfdump,然后再进行一分钟的nfdump,以查看实际的数据包源/目的地信息以及返回的接口等,并从中诊断到底出了什么问题。(可能会得到Riverbed的SteelCentral数据包分析器个人版的试用版进行分析,它是Wireshark的增强版,Windows应用程序tho)