Страница 2 из 2

Re: Резервный канал интернета

Добавлено: 19 ноя 2009 13:55
VerstaK
Нет, правила не завязаны на интерфейсе. Получается, что этот скрипт не затронет правил файрвола?

Re: Резервный канал интернета

Добавлено: 19 ноя 2009 14:54
hatred
ну ты сам посмотри, или я тебе скажу сделать rm -rf / ты тоже сделаешь не подумав? :)

Re: Резервный канал интернета

Добавлено: 19 ноя 2009 15:16
VerstaK
Просто машина стоит не рядом и попробовать сразу не могу. А хочется прийти, вставить скрипт и учти, зная, что все работает

Re: Резервный канал интернета

Добавлено: 19 ноя 2009 15:19
hatred
при таком подходе я могу сделать работу платно :) но тестирование на месте один фиг нужно. хотя бы поочередным вытыканием шнурка.

Re: Резервный канал интернета

Добавлено: 19 ноя 2009 15:28
VerstaK
буду тестировать, может даже на выходных... Даст бог - получится. Спасибо за поддержку, не получится - дам ваши координаты, чтобы вас привлекли

Re: Резервный канал интернета

Добавлено: 19 ноя 2009 16:08
hatred
VerstaK писал(а):буду тестировать, может даже на выходных... Даст бог - получится. Спасибо за поддержку, не получится - дам ваши координаты, чтобы вас привлекли
ок, удачи! :)

Re: Резервный канал интернета

Добавлено: 19 ноя 2009 17:33
Лимон
нравится мне чужой код смотреть... к мелочам, типа, параметры iptables, не придираюсь, суть там видна, а на ошибки сама утилита укажет.
1. дергать NAT при переключении маршрута по умолчанию не надо. а зачем? настроил на обоих интерфейсах и все. потом пригодится для балансировки нагрузки. оба линка будут рабочими.
2. последний if - китайский код, copy-paste, сложен в отладке и поддержке.
3. при изменении маршрута надо рвать все соединения и чистить contrack таблицы, т.к. адрес отправителя меняется. если не делать, то в лучшем случае серваки сами быстро порвут соединения, в худшем - все замрет до таймаута, пользователи недовольны, а провайдеры запишут тебя в хакеры, э-э-э, нет, в кракеры.
4. по хорошему это надо цеплять
- на состояние DSL канала - все модемы поддерживают SNMP,
- на количество ошибок типа icmp host is unreachable.
в результате - максимальная скорость реакции и значительно меньшая нагрузка на оборудование.

Re: Резервный канал интернета

Добавлено: 19 ноя 2009 22:24
hatred
Про нат согласен. Затупилс.
Про китайский код... тебе процитировать ключевую фразу во моём посте?
Когда возникает необходимость чистить таблички и рвать коннекты - настает время задумываться на динамической маршрутизацией, и это решение уже не катируется.
Перечисли какие модемы, что ставит, к примеру дальсвязь или нтк поддерживают snmp? И на моей практике было как минимум несколько раз: несущая есть, устанавливается PPPoE соединение, шлюз провайдера недоступен. Так что состояние линка и связи тут как бе...

ну и... когда теория сталкивается с практикой, теория проигрывает. всегда. (с) угадай кто сказал? ;-) я к тому - мой вариант есть, твоего варианта нет :)))

Re: Резервный канал интернета

Добавлено: 30 ноя 2009 10:27
Лимон
hatred писал(а):мой вариант есть, твоего варианта нет :)))
это ключевая фраза, перед которой не устоит ни один самый веский аргумент.

Re: Резервный канал интернета

Добавлено: 30 ноя 2009 13:53
Лимон
hatred писал(а): Перечисли какие модемы, что ставит, к примеру дальсвязь или нтк поддерживают snmp? И на моей практике было как минимум несколько раз: несущая есть, устанавливается PPPoE соединение, шлюз провайдера недоступен. Так что состояние линка и связи тут как бе...
да любой модем с ethernet интерфейсом snmp умеет, вот, например, рядом валялся:
ADSL2110EHR V7.0+

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

# snmpwalk -v 1 -c public 192.168.1.1
SNMPv2-MIB::sysDescr = STRING: Linux (none) 2.4.17_mvl21-malta-mips_fp
...
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: usb0
IF-MIB::ifDescr.4 = STRING: nas0
...
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.3 = INTEGER: down(2)
IF-MIB::ifOperStatus.4 = INTEGER: down(2)
...
IP-MIB::icmpInMsgs = Counter32: 8
IP-MIB::icmpInErrors = Counter32: 0
IP-MIB::icmpInDestUnreachs = Counter32: 0
IP-MIB::icmpInTimeExcds = Counter32: 0
правда состояния dsl там я не нашел, но есть состояние nas интрефейсов. Можно их использовать.
ну а проблемы дальше dsl линка по счетчикам icmp пакетов определить, правда, я сам сомневаюсь, что это выгорит :)
но и затея с пингами, мне не по душе, техподдержку пинговать надо, а не серверы.

Re: Резервный канал интернета

Добавлено: 01 дек 2009 07:21
hatred
Техподдержку нужно пинговать когда уже тылы прикрыты, т.е. канал на резервный перещелкнулся :) дома свой проверю, что-то смущает меня факт наличия там snmp

Re: Резервный канал интернета

Добавлено: 24 дек 2009 17:01
Alex Carcass
Метрики в роутинге вопрос не решают?

Re: Резервный канал интернета

Добавлено: 24 дек 2009 22:08
hatred
Alex Carcass писал(а):Метрики в роутинге вопрос не решают?
если ты роутинг грохаешь или переключаешь метрику - да. ну пусть уже сам делает.

Re: Резервный канал интернета

Добавлено: 30 янв 2010 16:14
VerstaK
Добрался я-таки до той машины и с помощью найденного на просторах мнтернета скрипта сделал переключение канала.
Реализовано следующим образом:
в /usr/sbin положил скрипт

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

#!/bin/bash
# Time between checks in seconds
SLEEPTIME=10

#IP Address or domain name to ping. The script relies on the domain being 
#pingable and always available
TESTIP=www.yahoo.com

#Ping timeout in seconds
TIMEOUT=2

# External interfaces
EXTIF1=eth1
EXTIF2=eth2

#IP address of external interfaces. This is not the gateway address.
IP1=82.162.244.**
IP2=93.88.15.***

#Gateway IP addresses. This is the first (hop) gateway, could be your router IP 
#address if it has been configured as the gateway
GW1=82.162.244.**
GW2=93.88.15.***

# Relative weights of routes. Keep this to a low integer value. I am using 4
# for TATA connection because it is 4 times faster
W1=8
W2=1

# Broadband providers name; use your own names here.
NAME1=DSV
NAME2=NTC

#No of repeats of success or failure before changing status of connection
SUCCESSREPEATCOUNT=4
FAILUREREPEATCOUNT=1

# Do not change anything below this line

# Last link status indicates the macro status of the link we determined. This is down initially to force routing change upfront. Don't change these values.
LLS1=1
LLS2=1

# Last ping status. Don't change these values.
LPS1=1
LPS2=1

# Current ping status. Don't change these values.
CPS1=1
CPS2=1

# Change link status indicates that the link needs to be changed. Don't change these values.
CLS1=1
CLS2=1

# Count of repeated up status or down status. Don't change these values.
COUNT1=0
COUNT2=0

while : ; do
        ping -W $TIMEOUT -I $IP1 -c 1 $TESTIP > /dev/null  2>&1
        RETVAL=$?

        if [ $RETVAL -ne 0 ]; then
		echo $NAME1 Down
		CPS1=1
        else
		CPS1=0
        fi

	if [ $LPS1 -ne $CPS1 ]; then
		echo Ping status changed for $NAME1 from $LPS1 to $CPS1
		COUNT1=1
	else
		if [ $LPS1 -ne $LLS1 ]; then
			COUNT1=`expr $COUNT1 + 1`
		fi
	fi

        if [[ $COUNT1 -ge $SUCCESSREPEATCOUNT || ($LLS1 -eq 0 && $COUNT1 -ge $FAILUREREPEATCOUNT) ]]; then
		echo Uptime status will be changed for $NAME1 from $LLS1
		CLS1=0
		COUNT1=0
		if [ $LLS1 -eq 1 ]; then
			LLS1=0
		else
			LLS1=1
		fi
	else 
		CLS1=1
        fi

	LPS1=$CPS1

	ping -W $TIMEOUT -I $IP2 -c 1 $TESTIP > /dev/null  2>&1
       	RETVAL=$?

	if [ $RETVAL -ne 0 ]; then
		echo $NAME2 Down
                CPS2=1
        else
                CPS2=0
        fi

        if [ $LPS2 -ne $CPS2 ]; then
		echo Ping status changed for $NAME2 from $LPS2 to $CPS2
                COUNT2=1
        else
                if [ $LPS2 -ne $LLS2 ]; then
                        COUNT2=`expr $COUNT2 + 1`
                fi
        fi

        if [[ $COUNT2 -ge $SUCCESSREPEATCOUNT || ($LLS2 -eq 0 && $COUNT2 -ge $FAILUREREPEATCOUNT) ]]; then
		echo Uptime status will be changed for $NAME2 from $LLS2
		CLS2=0
		COUNT2=0
                if [ $LLS2 -eq 1 ]; then
                        LLS2=0
                else
                        LLS2=1
                fi
	else
		CLS2=1
        fi

	LPS2=$CPS2

	if [[ $CLS1 -eq 0 || $CLS2 -eq 0 ]]; then
		if [[ $LLS1 -eq 1 && $LLS2 -eq 0 ]]; then 
			echo Switching to $NAME2
                        ip route replace default scope global via $GW2 dev $EXTIF2
		elif [[ $LLS1 -eq 0 && $LLS2 -eq 1 ]]; then
			echo Switching to $NAME1
                        ip route replace default scope global via $GW1 dev $EXTIF1
		elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 ]]; then
			echo Restoring default load balancing
                        ip route replace default scope global nexthop via $GW1 dev $EXTIF1 weight $W1 nexthop via $GW2 dev $EXTIF2 weight $W2
		fi
	fi
        sleep $SLEEPTIME
done
вставил свои значения - адреса, шлюзы. Поставил вес больший у ДС, чем у НТК


В rc.local дописал строки

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

ip route add 192.168.1.0/24 dev eth1 src 192.168.1.10 table bsnl
ip route add default via 192.168.1.1 table bsnl
ip route add 192.168.0.0/24 dev eth2 src 192.168.0.10 table tata
ip route add default via 192.168.0.1 table tata
ip rule add from 192.168.1.10 table bsnl
ip rule add from 192.168.0.10 table tata
ip route add default scope global nexthop via 192.168.1.1 dev eth1 weight 1 nexthop via 192.168.0.1 dev eth2 weight 4

IPTABLES -t nat -a POSTROUTING -s 192.168.1.0/24 eth1 -j MASQUERADE
IPTABLES -t nat -a POSTROUTING -s 192.168.1.0/24 eth2 -j MASQUERADE
nohup /usr/sbin/gwping &
Тоже со своими значениями

Все работает, при пропадании пинга маршрут перекидывается на НТК, но на клиентах, которые ходят через этот шлюз, после переключения канала не все страницы открываются. Например, если был открыт яндекс, по нему получается посерфить, но на mail.ru уже не получится выйти.
Насколько я понял, нужен кэширующий днс. Хотя, в принципе, на шлюзе прописаны днс обоих провайдеров.
Можете подсказать, куда копать дальше?

почему-то не срабатывает маскарадинг, прописанный в rc.local

И еще. Поставил shorewall, прописал на оба интерфейса сразу маскарадинг, а из rc.local строки с маскарадингом удалил. Но тогда при падении основного канала и включения резервного клиенты не могуг гулять по интернету... Может, лучше вписать каждый набор правил в скрипт gwping? Т.е. если работает основной провайдер, подгружаются правила iptables_DS, а когда резервный - IPTABLES_NTC?

Re: Резервный канал интернета

Добавлено: 01 фев 2010 13:05
Лимон
VerstaK писал(а): Все работает, при пропадании пинга маршрут перекидывается на НТК, но на клиентах, которые ходят через этот шлюз, после переключения канала не все страницы открываются. Например, если был открыт яндекс, по нему получается посерфить, но на mail.ru уже не получится выйти.
Насколько я понял, нужен кэширующий днс. Хотя, в принципе, на шлюзе прописаны днс обоих провайдеров.
Можете подсказать, куда копать дальше?
шлюзу dns нужен. копай туда, где доменные имена надо преобразовывать в ip. на прокси или на клиенте.