Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1043433
  • 博文数量: 244
  • 博客积分: 6820
  • 博客等级: 准将
  • 技术积分: 3020
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 21:33
文章分类

全部博文(244)

文章存档

2013年(1)

2012年(16)

2011年(132)

2010年(3)

2009年(12)

2008年(80)

我的朋友

分类: LINUX

2011-08-30 11:02:22

相信现在很多公司或网吧开始考虑双线接入,来实现网络的均衡负载或冗余(备份)线路,保持网络的不间断性。但是如何才能检测某条线路断了呢?有以下几种办法:

1. 物理连接中断(比如网线出现问题)

    这个可以通过SNMP来检测(需要现安装 net-snmp 包),如下:
  1.    先查看各网卡的设备描述编号:
  2.    # snmpwalk -v 1 -c public localhost|grep ifDescr
  3.    IF-MIB::ifDescr.1 = STRING: lo
  4.    IF-MIB::ifDescr.2 = STRING: dummy0
  5.    IF-MIB::ifDescr.3 = STRING: eth0
  6.    IF-MIB::ifDescr.4 = STRING: eth1
  7.    IF-MIB::ifDescr.5 = STRING: tunl0
  8.    IF-MIB::ifDescr.6 = STRING: gre

  9.    上面显示 eth0 的编号是3

  10.    查看 eth0 的状态:
  11.    # snmpwalk -v 1 -c public localhost IF-MIB::ifOperStatus.3
  12.    IF-MIB::ifOperStatus.3 = INTEGER: up(1)

  13.    如果显示 up 表示连接正常,显示 down 表示网络中断了。
复制代码


补充:(感谢 兄的建议)
   更简单的办法是利用 ethtool 工具,下载地址:


编译安装:
  1.   # ./configure && make && make install
复制代码


测试:
  1.   # ethtool eth0
  2.     ....
  3.     Link detected: yes
复制代码

如果最后一行显示 yes 表示连接正常,显示 no 表示网络中断了。

2. 逻辑连接中断(比如网关的线路出了问题等)

   可以通过每10s发送一个小的ping包到网关,看是否有回应,一般网关都是允许ping的。

    这个可以通过一个expect程序(netwatch.exp)来完成,下面这个脚本发送一个字节为1的ping包给网关,并分析ping的输出信息,如果为 0% packet loss,表示正常,以0退出。如果超时(1秒钟),以1退出。
  1. #!/usr/bin/expect

  2. set target [lindex $argv 0]
  3. set timeout 1
  4. spawn ping -c 1 -s 1 $target

  5. expect {
  6.     " 0% packet loss" {
  7.         exit 0
  8.     }
  9.     timeout {
  10.         exit 1
  11.     }
  12. }
复制代码


比如网关1为192.168.1.1,网关2为192.168.2.1,那么要监测这两个网关的话,可以这样:
  1. #!/bin/sh

  2. netwatch.exp 192.168.1.1
  3. result1=$?
  4. netwatch.exp 192.168.2.1
  5. result2=$?
  6. if [ "$result1" eq 0 ] && [ "$result2" eq 0 ] ; then

  7. # 如果上次检测时连接丢失,而此次恢复正常
  8.     if [ -e /var/run/lost-connection ] ; then
  9.        do some recovery action here ...
  10.        rm /var/run/lost-connection
  11.     fi

  12. # 如果网关1不可达
  13. elif [ "$result1" ne 0 ] ; then
  14.    change default route to 192.168.2.1
  15.    do some action here, such as iptables NAT

  16.    # 创建连接丢失标识
  17.    touch /var/run/lost-connection

  18. # 如果网关2不可达
  19. elif [ "$result2" ne 0 ] ; then
  20.    change default route to 192.168.1.1
  21.    do some action here, such as iptables NAT

  22.    # 创建连接丢失标识
  23.    touch /var/run/lost-connection
  24. fi
复制代码



虽然可以通过iptables的MASQUERADE来实现自动切换,但是如果加了策略路由,就不行了。


要在用户态来做,一个笨笨的办法以是,重写一个mii-tool中是否断线的代码,然后每隔一段时间检测一次

阅读(2290) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~