Резервние интерфейсы с одинм IP для сервера (Поднять резерв, если основной упал)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Delfer
Сообщения: 11
ОС: Debian, Mandriva, WinXP

Резервние интерфейсы с одинм IP для сервера

Сообщение Delfer »

Ответа сам не нашел, поиск не дал ничего. Если вдруг что просмотрел - каюсь, ткните носом.

Есть сервак на RedHat, обслуживает локалку.
В локалку смотрят три его интерфейса:
eth0 Гигабит - 192.168.0.2
eth1 100 мегабит - 192.168.0.4
wlan0 Wi-Fi - 192.168.0.6

Ест-но предпочтительно работать на гигабите, но свитч бывает падает, eth1 надежнее, и на крайняк Wi-Fi
Нужно чтобы на сервер можно было добиться по 0.2 независимо от используемого интерфейса.
Я вижу скрипт, цикл, пинг 0.1 (роутер), пинг пропадает, опускаем eth0, меняем его IP, меняем IP у eth1, поднимаем eth1, пингуем, пропадает, пробуем Wi-Fi, возможно с отсылкой уведомления администратору на мыло, хотя это не самое важное.

Скрипт реализовать не получилось, незнаю как условия писать( Может есть примеры?

Возможно есть уже готовые програмные решения?
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение nesk »

можно сделать bonding
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Delfer
Сообщения: 11
ОС: Debian, Mandriva, WinXP

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение Delfer »

nesk писал(а):
08.07.2009 17:48
можно сделать bonding


Я понимаю что-то типа

Код: Выделить всё

ifconfig bond0 192.168.0.2 netmask 255.255.255.0 broadcast 192.18.0.255 up
ifenslave bond0 eth0
ifenslave bond0 eth1
ifenslave bond0 wlan0
Спасибо сказали:
Delfer
Сообщения: 11
ОС: Debian, Mandriva, WinXP

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение Delfer »

Итак, что сделал:

/etc/modprobe.conf

Код: Выделить всё

alias bond0 bonding
options bond0 mode=1 arp_interval=60 arp_ip_target=192.168.0.1 primary=eth0


/etc/sysconfig/network-scripts/ifcfg-bond0

Код: Выделить всё

DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.0.2
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
ONBOOT=yes
METRIC=5
MII_NOT_SUPPORTED=no
USERCTL=no
DNS1=192.168.0.1
RESOLV_MODS=no
IPV6INIT=no
IPV6TO4INIT=no


/etc/sysconfig/network-scripts/ifcfg-ath0

Код: Выделить всё

DEVICE=ath0
MASTER=bond0
SLAVE=yes
ONBOOT=yes
METRIC=35
MII_NOT_SUPPORTED=no
USERCTL=no
RESOLV_MODS=no
WIRELESS_MODE=Managed
WIRELESS_ESSID=Smth
WIRELESS_ENC_KEY=s:smth
WIRELESS_WPA_DRIVER=madwifi
WIRELESS_WPA_REASSOCIATE=no
IPV6INIT=no
IPV6TO4INIT=no
DHCP_CLIENT=dhclient
NEEDHOSTNAME=no
PEERDNS=yes
PEERYP=yes
PEERNTPD=no


/etc/sysconfig/network-scripts/ifcfg-eth0

Код: Выделить всё

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no


/etc/sysconfig/network-scripts/ifcfg-eth1

Код: Выделить всё

DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no


При загрузке рукется(Warning) на то, что не может получить скорость и дуплекс с ath0. Если вытащить провод из eth0 то еще и на скорость и дуплекс eth0 будет ругаться.

Если в работе вытащить кабель из eth0, то ядро выдаст "bad page state in process 'ifdown-eth'". После чего отваливаются все интерфейсы и восстанавливаются только после ребута.

В режиме 0 (rr) теряются 70% пакетов. Все интерфейсы без соединения в bond0 работают нормально...

В догонку. Содержимое /etc/sysconfig/network-scripts/ifdown-eth

Код: Выделить всё

#!/bin/bash
# Network Interface Configuration System
# Copyright (c) 1996-2005 Red Hat, Inc. all rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA

. /etc/init.d/functions

cd /etc/sysconfig/network-scripts
. ./network-functions

[ -f ../network ] && . ../network

CONFIG=${1}
boot=$2
daemon=
[ "foo${boot}" = "fooboot" -o "foo${boot}" = "foodaemon" ] && daemon=1

source_config

if [ -n "${BRIDGE}" -a -x /usr/sbin/brctl ]; then
      /sbin/ip link set dev ${DEVICE} down
      /usr/sbin/brctl delif ${BRIDGE} ${DEVICE}
      # Upon removing a device from a bridge,
      # it's necessary to make radvd reload its config
      [ -r /var/run/radvd/radvd.pid ] && kill -HUP `cat /var/run/radvd/radvd.pid`
      if LC_ALL=C /usr/sbin/brctl show | LC_ALL=C grep -q "^${BRIDGE}    .*can't get port info"; then
      /usr/sbin/brctl delbr ${BRIDGE}
      fi
      exit 0
fi

. /etc/sysconfig/network

# Check to make sure the device is actually up
check_device_down ${DEVICE} && [ "$BOOTPROTO" != "dhcp" -a "$BOOTPROTO" != "bootp" ] && [ -n "$VLAN" -a "$VLAN" != "yes" ] && exit 0

if [ "${SLAVE}" != "yes" -o -z "${MASTER}" ]; then
if [ -n "${HWADDR}" -a -z "${MACADDR}" ]; then
    FOUNDMACADDR=`get_hwaddr ${REALDEVICE}`
    if [ -n "${FOUNDMACADDR}" -a "${FOUNDMACADDR}" != "${HWADDR}" ]; then
        NEWCONFIG=`get_config_by_hwaddr ${FOUNDMACADDR}`
    if [ -n "${NEWCONFIG}" ]; then
       eval $(LANG=C fgrep "DEVICE=" $NEWCONFIG)
    else
       echo $"Device ${DEVICE} has MAC address ${FOUNDMACADDR}, instead of configured address ${HWADDR}. Ignoring."
       exit 1
    fi
    if [ -n "${NEWCONFIG}" -a "${NEWCONFIG##*/}" != "${CONFIG##*/}" -a "${DEVICE}" = "${REALDEVICE}" ]; then
       exec /sbin/ifdown ${NEWCONFIG}
    else
       echo $"Device ${DEVICE} has MAC address ${FOUNDMACADDR}, instead of configured address ${HWADDR}. Ignoring."
       exit 1
    fi
    fi
fi
fi

if is_bonding_device ${DEVICE}; then
    for device in `LANG=C grep -l "^[[:space:]]*MASTER=${DEVICE}" /etc/sysconfig/network-scripts/ifcfg-*`; do
    is_ignored_file "$device" && continue
    /sbin/ifdown ${device##*/}
    done

fi

/etc/sysconfig/network-scripts/ifdown-ipv6 ${CONFIG}
if [[ "${DHCPV6C}" = [Yy1]* ]] && [ -f /var/run/dhcp6c_${DEVICE}.pid ]; then
    kill `cat /var/run/dhcp6c_${DEVICE}.pid`;
    rm -f /var/run/dhcp6c_${DEVICE}.pid;
fi

# Kill running dhcp client if present
dhcp_client_pids() {
    CLIENTS='dhcpcd|pump|dhcpxd|dhclient|zcip|xsupplicant'
    [ -n "${daemon}" -o "$MII_NOT_SUPPORTED" = "yes" ] && CLIENTS="${CLIENTS}|wpa_supplicant"
    ps xw | egrep "${CLIENTS}" | grep ${DEVICE} | awk '{print $1;}'
}

if [ -n "${daemon}" -a "$MII_NOT_SUPPORTED" != "yes" ]; then
    # use ifplugd -k -W to wait for it to be killed
    /sbin/ifplugd -k -W -i ${DEVICE}
fi

retcode=0
pids=`dhcp_client_pids`
if [ -n "$pids" ]; then
    kill $pids
    retcode=$?
    waited=0
    while ! dhcp_client_pids > /dev/null && [ "$waited" -lt 50 ]; do
    usleep 10000
    waited=$(($waited+1))
    done
fi

# we can't just delete the configured address because that address
# may have been changed in the config file since the device was
# brought up.  Flush all addresses associated with this
# instance instead.
if [ -d "/sys/class/net/${REALDEVICE}" ]; then
    if [ "${REALDEVICE}" = "${DEVICE}" ]; then
        ip addr flush dev ${REALDEVICE} 2>/dev/null
    else
        ip addr flush dev ${REALDEVICE} label ${DEVICE} 2>/dev/null
    fi

    if [ "${SLAVE}" = "yes" -a -n "${MASTER}" ]; then
        echo "-${DEVICE}" > /sys/class/net/${MASTER}/bonding/slaves 2>/dev/null
    fi

    # Remove ip addresses from kernel
    for ip in `ip addr show | egrep ${DEVICE}\$ | grep inet | awk '{print $2;}'`; do
        ip addr del $ip dev ${DEVICE}
    done

    if [ "${REALDEVICE}" = "${DEVICE}" ]; then
          ip link set dev ${DEVICE} down 2>/dev/null
    fi
fi
[ "$retcode" = "0" ] && retcode=$?

# wait up to 5 seconds for device to actually come down...
waited=0
while ! check_device_down ${DEVICE} && [ "$waited" -lt 50 ]; do
    usleep 10000
    waited=$(($waited+1))
done

# don't leave an outdated key sitting around
if [ -z "$IN_HOTPLUG" -a -n "${WIRELESS_ENC_KEY}" -a -x /sbin/iwconfig ]; then
    /sbin/iwconfig ${DEVICE} enc 0 >/dev/null 2>&1
fi

if [ "$retcode" = 0 ]; then
    /etc/sysconfig/network-scripts/ifdown-post $CONFIG
    # do NOT use $? because ifdown should return whether or not
    # the interface went down.
fi

if [ -n "$VLAN" -a -x /sbin/vconfig ]; then
    # 802.1q VLAN
    if echo ${DEVICE} | LANG=C egrep -v '(:)' | LANG=C egrep -q '(eth|bond)[0-9][0-9]*\.[0-9][0-9]?[0-9]?[0-9]?' \
    || echo ${DEVICE} | LANG=C egrep -q 'vlan[0-9][0-9]?[0-9]?[0-9]?'; then
    [ -f /proc/net/vlan/${DEVICE} ] && {
        /sbin/vconfig rem ${DEVICE}
    }
    fi
fi

exit $retcode
Спасибо сказали:
Delfer
Сообщения: 11
ОС: Debian, Mandriva, WinXP

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение Delfer »

А bridege сделать не вариант? Или у нас будет зацикливание пакетов?
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение sim1 »

Delfer писал(а):
11.07.2009 21:25
А bridege сделать не вариант? Или у нас будет зацикливание пакетов?

мост в вашем случае не прокатит
назначение моста - тупо транслировать все что есть на одном интерфейсе на другой
Спасибо сказали:
Аватара пользователя
oxd
Сообщения: 165

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение oxd »

Сеть 192.168.0.0 а маска какая? Если все три интерфейса в одно сети, то зачем???

Бридж с STP здесь лучшее решение, имхо.
Для любителей извращений посмотрите в сторону VRRP, он не совсем для этого, но в данном случае поможет.


sim1 писал(а):
11.07.2009 22:29
Delfer писал(а):
11.07.2009 21:25
А bridege сделать не вариант? Или у нас будет зацикливание пакетов?

мост в вашем случае не прокатит
назначение моста - тупо транслировать все что есть на одном интерфейсе на другой


Ерунду полную говорите. Невнимательно читали спецификацию 802.1d?
Товарищ стой! Сожми покрепче маузер!
Не дай предателю мимо пройти!
Он променял консоль на браузер.
Таким не место в сфере IT!
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение sim1 »

oxd писал(а):
13.07.2009 10:31
Сеть 192.168.0.0 а маска какая? Если все три интерфейса в одно сети, то зачем???

Бридж с STP здесь лучшее решение, имхо.
Для любителей извращений посмотрите в сторону VRRP, он не совсем для этого, но в данном случае поможет.


sim1 писал(а):
11.07.2009 22:29
Delfer писал(а):
11.07.2009 21:25
А bridege сделать не вариант? Или у нас будет зацикливание пакетов?

мост в вашем случае не прокатит
назначение моста - тупо транслировать все что есть на одном интерфейсе на другой


Ерунду полную говорите. Невнимательно читали спецификацию 802.1d?

Невнимательно читали постановку вопроса ? У ТС, как я понял (пусть он меня поправит если я не прав), все три ин-са смотрят в один сегмент, но только eth0 включен в L2 устройство, и нужно сделать гарантированную связь сервака с данным сегментом. Бридж с STP для резервирования каналов применим при использовании в паре с L2 устройствами, поддерживающими STP, для объединения разных сегментов сети. Т.е в случае ТС зачем на серваке поднимать мост с STP на три интерфейса и тупа пихать все три хвоста в одно L2 ? Какое же это резервирования каналов ? L2 устройство "упало" и все каналы накрылись .... Кроме этого, насколько я помню, приоритеты каналов рассчитываются на "стоимости пути", определяемых алгоритмом построения STP, и самому ee изменить нельзя, а у ТС задача приоритета должна решаться на основе пинга ...

Другими словами, на мой взгляд, резервирование каналов с использованием L2 устройств с STP применимо только тогда, когда у вас минимум три таких устройства (аппаратных, или программных - объединяющих интерфейсы на серваке), имеющих м/у собой избыточные связи. Одно упало связь идет через другое . Ну или через два устройства у которых помимо проводного канала, есть радио канал, в этом случае проводной канал не работает - работает радио канал ну и наоборот.

C определением "тупая трансляция" конечно погорячился, но все-таки задача моста транслировать пакеты 2-го уровня OSI с одного сегмента сети в другой, при этом:
- если включен STP, построение графа сети, отслеживание состояние резервных каналов их блокировка, активация и т.д.
- сверяясь с таблицей МАС-ов на интерфейсах.

Конечно же я не знаю всех обстоятельств, которые побудили ТС-а, решать задачу подобным способом, но я бы в подобной ситуации пытался решить задачу с помощью дополнительных устройств L2. Однако, если все-таки нужно решать программно то тогда бы использовал демон devd и на события каждого инт-са LINK_UP/LINK_DOWN повесил бы скрипты обработки.
Спасибо сказали:
Аватара пользователя
oxd
Сообщения: 165

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение oxd »

Вы как раз описали работу хаба (ну или совсем тупого свича), поэтому я и отправил в ман :)
STP здесь прекрасно будет работать. Цель заключается в отключении гигабитного интерфейса когда он перестает работать, например, при помощи админских рук уборщицы, опять же не вижу проблемы, он заблокируется СТП. Кстати даже автоматический расчет метрик стоимости подходит к задаче, просто сдесь BPDU будут летать по кругу, один девайс и отправляет и принимает и сам себе root bridge. Это обычная схема для малых офисов и небольших локалок.

Я кстати тоже не совсем понял зачем автору 3 интерфейса в одну сеть и куда воткнуты эти интерфейсы, не удивлюсь если в одну "мыльницу". Если оно упадет конечно все накроется, но ведь есть еще вайфай в той же сети. Может я чего-то не понял, конечно.

Афтар пиши есчо! Схему сети в студию!!!
Товарищ стой! Сожми покрепче маузер!
Не дай предателю мимо пройти!
Он променял консоль на браузер.
Таким не место в сфере IT!
Спасибо сказали:
Delfer
Сообщения: 11
ОС: Debian, Mandriva, WinXP

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение Delfer »

oxd писал(а):
13.07.2009 18:06
Афтар пиши есчо! Схему сети в студию!!!


Мне очень лестно, что обсуждение ведется на довольно профессиональном уровне. Сказать честно, я сам больше теоретик, нежели практик...

Сеть 192.168.0.0/24 маска 255.255.255.0 (простите за избыточность). Железный шлюз и днс - 192.168.0.1

С вашего разрешения позволю себе немного абстрагировать задачу, но не отходя от изначальной постановки задачи.
Итак, у нас есть некоторое надежное устройство - "не умный" свитч (чтобы не было предложений работать на уровне железа). К нему подключены:
1. Несколько клиентов, которым не требуется высокая скорость, но требуется высокая надежность. IP/MAC адреса не фиксированы.
2. Шлюз 192.168.0.1
3. Wi-Fi ap к которой подключается ath0
4. eth1 нашего сервера
5. Гигабитная "мыльница", к которой подключено соотв.:
\ 1. Несколько клиентов, которым важна скорость, а не надежность. Только при наличии технических проблем они готовы перейти на на более медленный свитч (да, переткнуть кабели). IP/MAC адреса не фиксированы.
\ 2. eth0 нашего сервера

Вопрос все еще рассматривается на уровне программной реализации на сервере. Предложения по замене оборудования не рассматриваются, их я и сам знаю.

- Проблемы с бондингом думаю решаться при переустановки системы.
- Все же я не понял, как настроить приоритеты у моста.

И еще раз, приведу интересующий меня алгоритм,
1. Работать на eth0 до потери связи
2. При разрыве eth0 переключится на eth1
3. При возобновлении работы eth0 вернуться к нему
4. При разрыве и eth0 и eth1 перейти на ath0 и сообщить администратору (не обязательно, это я и сам додумаю).

ИБП вмонтирован в корпус сервера (самоделка). Так что он, даже если вcе провода перерубить и вынести на улицу, должен оставаться на связи :-D

В догонку...
Изначально была немного другая задумка.
Сервер тихо мирно стоит в сервачной на 100 мегабитах eth1. Его отрубают и по дороге он работает через Wi-Fi ath0. Его приносят в админскую и подрубают к гагабитному свитчу eth0.

Применение чуть разное, но алгоритм один.
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD

Re: Резервние интерфейсы с одинм IP для сервера

Сообщение sim1 »

Лень вдаваться в схему вашей сети и возможность применения в ней моста. К тому же лично у меня был негативный опыт попытки поднять мост с помощью brctl + stp на серваке для двух каналов WiFi + Ethernet. Убил как-то два дня и понял что мост Ethernet + WiFi c помощью brctl можно поднять только для весьма ограниченного набора WiFi карточек. В чем проблема была сейчас конкретно не помню, что-то связанное с ARP запросами, размерами Ethernet кадра и какими-то преобразованиями, которые выполняет (или не выполняет) brctl. Может в тек. версии brctl этого не наблюдается. Тем более расставить приоритеты нужным для вас образом скорее всего не получится ...

Советую все-таки использовать демон devd. У меня на одном из серверов с помощью него настроено логирование пропадание LINK-a на интерфейсах. Вот кусок его конфига.

Код: Выделить всё

...
notify 10 { match "type" "LINK_DOWN"; action "logger -s alert: LINK_DOWN on device: $device-name subsystem: $subsystem"; };
notify 10 { match "type" "LINK_UP"; action "logger -s alert: LINK_UP on device: $device-name subsystem: $subsystem"; };
...

При пропадании(появлении) связи делается запись через syslog.
В вашем случае на action можно повесить какой-нибудь скрипт и обрабатывать в соответствии с вашим алгоритмом.
Спасибо сказали: