как сделать «ping -I eth1 ya.ru» если default via eth4
Приветствую, Уважаемые!
Пишу (переделываю) скрипт на переключение между провайдерами (одновременный доступ). Все примеры в инете идут с проверкой на доступность шлюзов провайдеров, а если инет лежит у самого провайдера, то мне совсем такой провайдер не нужен в multipath-маршруте (через nexthop). Значит нужно проверить доступность адресов интернета. Сначала думал пинг на ya.ru, потом решил, что наверное лучше обойтись без DNS и решил делать пинги на DNS-сервера гугла 8.8.8.8 и 8.8.4.4 (можно и другие предложения рассмотреть — это, то что в голову пришло, больше ничего не пришло) Замечательно, но если уже лежит первый провайдер (eth1) и default gateway сделан через второго (eth4), то ping -I eth1 8.8.8.8 — не знает куда слать пакет — или знает? И это я ничего не понимаю? При этом ping -I 192.168.20.2 8.8.8.8 — работает но пакеты идут через eth4. Я и правда не всё понимаю, т.к. не всё разжёвано в «Linux Advanced Routing & Traffic Control HOWTO».
Короче вот скрипт:
#!/bin/bash GW1="192.168.20.1" GW2="192.168.30.1" IPADDR1="8.8.8.8" # DNS google IPADDR2="8.8.4.4" # DNS google IF1="eth1" IF2="eth4" PROV1="/home/ssv/scripts/rc.prov1.sh" PROV2="/home/ssv/scripts/rc.prov2.sh" ROUTING2GW="/home/ssv/scripts/rc.routing.sh" check_real_gates() < if ping -I $IF1 -c5 -l5 -W2 $GW1 2>&1 | grep "100% packet loss" > /dev/null && ping -I $IF2 -c5 -l5 -W2 $GW2 2>&1 | grep "100% packet loss" > /dev/null ; # Если оба провайдера лежат then echo WARNING TWO GATEWAYS Is DOWN. ; logger WARNING TWO GATEWAYS Is DOWN. ; elif ping -I $IF1 -c5 -l5 -W2 $GW1 2>&1 | grep "100% packet loss" > /dev/null ; # иначе если лежит первый then $PROV2 ; # запускаем скрипт на второго провайдера elif ping -I $IF2 -c5 -l5 -W2 $GW2 2>&1 | grep "100% packet loss" > /dev/null ; # иначе если жив первый then $PROV1 ; # то запускаем скрипт на первого провайдера else $ROUTING2GW ; fi > change_GW1_GW2() < if ping -I $IF1 -c5 -l5 -W2 $IPADDR1 2>&1 | grep "64 bytes from" > /dev/null || ping -I $IF2 -c5 -l5 -W2 $IPADDR1 2>&1 | grep "64 bytes from" > /dev/null ; then GW1=$IPADDR1 ; GW2=$IPADDR1 ; elif ping -I $IF1 -c5 -l5 -W2 $IPADDR2 2>&1 | grep "64 bytes from" > /dev/null || ping -I $IF2 -c5 -l5 -W2 $IPADDR2 2>&1 | grep "64 bytes from" > /dev/null ; then GW1=$IPADDR1 ; GW2=$IPADDR1 ; else : ; # т.е. google не пингуется, тогда ничего не меняем, пингуем шлюзы провайдеров. fi > while : ; do change_GW1_GW2 check_real_gates sleep 3 done
————————- rc.routing.sh ————————-
#!/bin/bash # Определим некоторые переменные. Пусть $IF1 будет именем первого интерфейса (if1 на рисунке), а $IF2 -- именем второго. # Тогда $IP1 будет IP адресом $IF1 , а $IP2 -- IP адресом $IF2 . # Далее, $GW1 это IP-адрес шлюза провайдера 1, а GW2 -- IP адрес шлюза провайдера 2. # Наконец, $GW1_NET это IP сеть, к которой принадлежит $GW1 , а GW2_NET -- сеть, к которой принадлежит GW2 . IF0="eth0" IF1="eth1" IF2="eth4" #IP0= "192.168.0.26" IP1="192.168.20.2" IP2="192.168.30.2" GW1="192.168.20.1" GW2="192.168.30.1" GW1_NET="192.168.20.0/24" GW2_NET="192.168.30.0/24" LAN_NET="192.168.0.0/24" ip route flush table T1 #обнуляем первую таблицу маршрутов ip route flush table T2 #обнуляем вторую таблицу маршрутов ip route add $GW1_NET dev $IF1 src $IP1 table T1 #закидываем в первую таблицу инфу о сети первого провайдера ip route add default via $GW1 table T1 #закидываем в первую таблицу дефолтный гейт на первого провайдера ip route add $GW2_NET dev $IF2 src $IP2 table T2 #закидываем во вторую таблицу инфу о сети второго провайдера ip route add default via $GW2 table T2 #закидываем во вторую таблицу дефолтный гейт на второго провайдера ip route add $GW1_NET dev $IF1 src $IP1 &> /dev/null #заполняем основную таблицу адресов. сеть на первого провайдера ip route add $GW2_NET dev $IF2 src $IP2 &> /dev/null #заполняем основную таблицу адресов. сеть на второго провайдера ip rule add from $IP1 table T1 #все пакеты с нашего IP-адреса первого провайдера маршрутизировать по таблице T1 ip rule add from $IP2 table T2 #все пакеты с нашего IP-адреса второго провайдера маршрутизировать по таблице T2 ip route add $LAN_NET dev $IF0 table T1 #закидываем в первую таблицу инфу о том, что у нас существует локальная сеть ip route add $GW2_NET dev $IF2 table T1 #закидываем в первую таблицу инфу о том, что у нас существует еще одна сеть ip route add 127.0.0.0/8 dev lo table T1 #закидываем в первую таблицу инфу о существовании лупбека ip route add $LAN_NET dev $IF0 table T2 #закидываем во вторую таблицу инфу о том, что у нас существует локальная с ip route add $GW1_NET dev $IF1 table T2 #закидываем во вторую таблицу инфу о том, что у нас существует еще одна се ip route add 127.0.0.0/8 dev lo table T2 #закидываем во вторую таблицу инфу о существовании лупбека. ip route del default ip route add default scope global nexthop via $GW1 dev $IF1 weight 1 nexthop via $GW2 dev $IF2 weight 1 ip route flush cache #сбросить кеш маршрутизации
#!/bin/bash IF0="eth0" IF1="eth1" IF2="eth4" #IP0= "192.168.0.26" IP1="192.168.20.2" IP2="192.168.30.2" GW1="192.168.20.1" GW2="192.168.30.1" GW1_NET="192.168.20.0/24" GW2_NET="192.168.30.0/24" LAN_NET="192.168.0.0/24" ip route flush table T1 #обнуляем первую таблицу маршрутов ip route flush table T2 #обнуляем вторую таблицу маршрутов ip route del default ip route add default via $GW2 &> /dev/null #заполняем основную таблицу адресов. дефолтный гейт. ip route flush cache #сбросить кеш маршрутизации
Команды iptables не стал приводить — итак дофига всего написано. В целом основной вопрос как сделать пинг в инет через «неактивного» провайдера (узнать активен он или нет). Ну и попутно лучше понять linux routing или найти более понятное и детальное руководство или учебник (на русском, английский знаю — но нюансы плохо понимаю).
Как пинговать с определенного интерфейса
На машине стоит несколько сетевых карт, и есть возможность выходить в интернет через несколько провайдеров.
Как можно программно произвести Ping через заданный сетевой интерфейс? Хочу добавить в программу функциональность определения непрерывности наличия интернета у различных провайдеров.
Re: Ping через заданный интерфейс
От: | Roman Odaisky |
Дата: | 02.11.07 16:33 |
Оценка: |
Здравствуйте, Kimus, Вы писали:
K>На машине стоит несколько сетевых карт, и есть возможность выходить в интернет через несколько провайдеров.
K>Как можно программно произвести Ping через заданный сетевой интерфейс? Хочу добавить в программу функциональность определения непрерывности наличия интернета у различных провайдеров.
ping -I интерфейс
До последнего не верил в пирамиду Лебедева.
Re[2]: Ping через заданный интерфейс
От: | Аноним |
Дата: | 02.11.07 22:51 |
Оценка: |
Здравствуйте, Roman Odaisky, Вы писали:
RO>ping -I интерфейс
Я пытался изучить команду Ping на предмет возможности указать интерфейс.
Вот что она умеет делать на моей машине:
Параметры:
-t Отправка пакетов на указанный узел, пока вы не прекратите
опрос узла вручную. Для вывода статистики и продолжения
опроса нажмите +, для прекращения опроса
нажмите +.
-a Определение имени узла по адресу.
-n Число отправляемых запросов.
-l Размер буфера отправки.
-f Установка флага, запрещающего фрагментацию пакета
(только IPv4).
-i Задание срока жизни пакета («Time To Live»).
-v Задание типа службы («Type Of Service») (только IPv4).
-r Запись маршрута для указанного числа прыжков
(только IPv4).
-s Штамп времени для указанного числа прыжков (только IPv4).
-j Свободный выбор маршрута по списку узлов (только IPv4).
-k Жесткий выбор маршрута по списку узлов (только IPv4).
-w Таймаут для каждого ответа в миллисекундах.
-R Трассировка кругового пути (только IPv6).
-S Используемый адрес источника (только IPv6).
-4 Обязательное использование протокола IPv4.
-6 Обязательное использование протокола IPv6.
У меня Windows 2003. В каких операционных системах допустима опция -I?
Re[3]: Ping через заданный интерфейс
От: | Michael Chelnokov |
Дата: | 03.11.07 10:26 |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А> -j Свободный выбор маршрута по списку узлов (только IPv4).
А> -k Жесткий выбор маршрута по списку узлов (только IPv4).
Одна из этих, видимо.
Re[2]: Ping через заданный интерфейс
От: | Michael Chelnokov |
Дата: | 03.11.07 10:35 |
Оценка: |
Здравствуйте, Roman Odaisky, Вы писали:
RO>ping -I интерфейс
$ man ping
.
-I iface
Source multicast packets with the given interface address. This
flag only applies if the ping destination is a multicast address.
.
$ uname -srp
FreeBSD 6.2-STABLE i386
Re[3]: Ping через заданный интерфейс
От: | Kimus |
Дата: | 03.11.07 13:09 |
Оценка: |
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, Roman Odaisky, Вы писали:
RO>>ping -I интерфейс
MC>$ man ping
MC>.
MC> -I iface
MC> Source multicast packets with the given interface address. This
MC> flag only applies if the ping destination is a multicast address.
MC>.
MC>$ uname -srp
MC>FreeBSD 6.2-STABLE i386
Ну да, во FreeBsd я эту команду видел . И с радостью бы использовал, но приложение под Windows и переориентировать его не представляется возможным (требование заказчика). Желательно что-то, что будет работать под Windows и займет минимум усилий по реализации, чтобы не изобретать велосипед.
Re[4]: Ping через заданный интерфейс
От: | Michael Chelnokov |
Дата: | 03.11.07 16:54 |
Оценка: |
Здравствуйте, Kimus, Вы писали:
K>Желательно что-то, что будет работать под Windows и займет минимум усилий по реализации, чтобы не изобретать велосипед.
Я не помню как там в IPHelper, но вообще-то достаточно сокет забиндить на нужный интерфейс.
Re[4]: Ping через заданный интерфейс
От: | DOOM |
Дата: | 05.11.07 10:00 |
Оценка: |
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, Аноним, Вы писали:
А>> -j Свободный выбор маршрута по списку узлов (только IPv4).
А>> -k Жесткий выбор маршрута по списку узлов (только IPv4).
MC>Одна из этих, видимо.
Не верно. Это совсем другая сказка.
Re[3]: Ping через заданный интерфейс
От: | DOOM |
Дата: | 05.11.07 10:29 |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>У меня Windows 2003. В каких операционных системах допустима опция -I?
Как ни странно, во всех, кроме винды.
Если хочешь пытаться сделать пинг программно, то научись определять как-нибудь связь IP-интерфейс, а потом попробуй биндиться на конкретный адрес — должно по логике помочь.
Re: Ping через заданный интерфейс
От: | Cruser | |
Дата: | 08.11.07 12:16 | |
Оценка: | -1 |
Здравствуйте, Kimus, Вы писали:
K>Здравствуйте!
K>На машине стоит несколько сетевых карт, и есть возможность выходить в интернет через несколько провайдеров.
K>Как можно программно произвести Ping через заданный сетевой интерфейс? Хочу добавить в программу функциональность определения непрерывности наличия интернета у различных провайдеров.
Перед пингом нужно задавать default маршрут через этот интерфейс:
route add 0.0.0.0 mask 0.0.0.0
ping .
route add 0.0.0.0 mask 0.0.0.0
ping .
Как пингануть с конкретного интерфейса, если интерфейсов несколько?
Как пингануть с конкретного интерфейса, если интерфейсов несколько?
стоит Linux ubuntu server и после настройки isc dhcp сервера, пинговаться почему-то начал с другого интерфейса.
то есть eth0 смотрит на локальную сеть, а eth1 на роутер.
хочу пингануть комп в локалке, но Destination Host Unreachable, так как icmp посылается с eth1
Как можно поменять? какой файл сконфигурировать? или что?
- Вопрос задан более трёх лет назад
- 15674 просмотра
1 комментарий
Простой 1 комментарий
MikroTik.by
For every complex problem, there is a solution that is simple, neat, and wrong.
- Список форумовФорум по операционной системе MikroTik RouterOSМаршрутизация, коммутация
- Поиск
Сделать запрос через определённый интерфейс
RIP, OSFP, BGP, MPLS/VPLS
12 сообщений • Страница 1 из 1
Sir_Prikol Сообщения: 556 Зарегистрирован: 14 апр 2018, 15:21 Откуда: СССР Контактная информация:
Сделать запрос через определённый интерфейс
Сообщение Sir_Prikol » 02 май 2018, 18:25
Добрый день.
Есть микротик RB3011.
На сегодня подключено уже 4 провайдера.
Требуется, чтоб в том-же Netwatch, запрос вида /tool fetch url=»blahblahblah» шёл через определённого провайдера, а не ломился на все подряд.
Балансировка каналов настроена, файловер настроен. Работает всё, кроме этого.
Пробовал через mangle отправлять на определённый маршрут, в результяте все, кто за этим микротиком — спокойно фильтруются, отрабатывают и идут на нужный маршрут, сам микротик — не хочет.
Дома: CCR2004 (7-ISP(GPON)белый IP)
Chupaka Сообщения: 3758 Зарегистрирован: 29 фев 2016, 15:26 Откуда: Минск Контактная информация:
Re: Сделать запрос через определённый интерфейс
Сообщение Chupaka » 02 май 2018, 18:47
Через mangle, правильно. Только в chain=output надо метить, а не prerouting
Или просто в таблице маршрутизации main создать маршрут через нужный интерфейс для нужного адреса. Там явно у вас ходит только роутер, а клиенты — в созданных для балансировки таблицах.
Sir_Prikol Сообщения: 556 Зарегистрирован: 14 апр 2018, 15:21 Откуда: СССР Контактная информация:
Re: Сделать запрос через определённый интерфейс
Сообщение Sir_Prikol » 02 май 2018, 19:56
mangle
второе спокойно отрабатывает для клиентов
/ip firewall mangle add action=mark-routing chain=output dst-address-list=lv-traff log-prefix=lv new-routing-mark=to_lv passthrough=no (стоит первым в цепочке) add action=mark-routing chain=prerouting dst-address-list=lv-traff log-prefix=lv new-routing-mark=to_lv passthrough=no (второе в цепочке) дальше правилв балансировки
route rule
/ip route rule add action=lookup-only-in-table routing-mark=ISP1 table=ISP1 add action=lookup-only-in-table routing-mark=ISP2 table=ISP2 add dst-address=214.14.163.20/32 interface=00.to-lv routing-mark=to_lv table=main
/ip route add distance=1 gateway=00.to-lv routing-mark=to_lv
Не работает, хоть тресни.
интервейс указан из-за того, что поднят vpn, но это не важно, так как не ходит только с самого рутера. За ним всё в норме
Дома: CCR2004 (7-ISP(GPON)белый IP)
Sir_Prikol Сообщения: 556 Зарегистрирован: 14 апр 2018, 15:21 Откуда: СССР Контактная информация:
Re: Сделать запрос через определённый интерфейс
Сообщение Sir_Prikol » 02 май 2018, 20:19
Странно, через минут 15 правила начали отрабатывать
Даже не знаю, что сработало
Будем наблюдать
Дома: CCR2004 (7-ISP(GPON)белый IP)
Sir_Prikol Сообщения: 556 Зарегистрирован: 14 апр 2018, 15:21 Откуда: СССР Контактная информация:
Re: Сделать запрос через определённый интерфейс
Сообщение Sir_Prikol » 02 май 2018, 20:30
Странно как-то, работало около 5-ти минут. Потом опять по таймауту молчал, потом (через пару минут) заного заработало.
Ничего не понимаю
Дома: CCR2004 (7-ISP(GPON)белый IP)
Chupaka Сообщения: 3758 Зарегистрирован: 29 фев 2016, 15:26 Откуда: Минск Контактная информация:
Re: Сделать запрос через определённый интерфейс
Сообщение Chupaka » 02 май 2018, 20:59
Правила в prerouting не играют роли, поскольку пакеты самого роутера туда не попадают: https://wiki.mikrotik.com/wiki/Manual:P . ow#Diagram
Route rule для IP-адреса отрабатывать не будет, поскольку interface — это интерфейс, с которого пакет пришёл, а не куда он должен уйти.
Ping на ресурс, для которого делается fetch, вообще ходит?
Ну и уже надо смотреть /ip route print detail (например, для той таблицы, в которую попадают маркированные в output пакеты; не забыть, что в main должен быть активный маршрут для данного адреса (любой) — без этого будет просто dst-unreachable).
Sir_Prikol Сообщения: 556 Зарегистрирован: 14 апр 2018, 15:21 Откуда: СССР Контактная информация:
Re: Сделать запрос через определённый интерфейс
Сообщение Sir_Prikol » 02 май 2018, 21:24
May/02/2018 20:17:31 firewall,info lv output: in:(unknown 0) out:00.pppoe-ISP01, proto TCP (ACK), 123.123.123.123:59580->214.14.163.20:443, NAT (123.123.123.123:59580->10.8.0.6:59580)->214.14.163.20:443, len 52 May/02/2018 20:17:31 firewall,info lv output: in:(unknown 0) out:00.pppoe-ISP01, proto TCP (ACK), 123.123.123.123:59580->214.14.163.20:443, NAT (123.123.123.123:59580->10.8.0.6:59580)->214.14.163.20:443, len 52 May/02/2018 20:17:31 firewall,info lv output: in:(unknown 0) out:00.pppoe-ISP01, proto TCP (ACK,PSH), 123.123.123.123:59580->214.14.163.20:443, NAT (123.123.123.123:59580->10.8.0.6:59580)->214.14.163.20:443, len 178
10.8.0.6 — нужный ip. Висит на нужном интерфейсе.
Судя по логу, идёт запрос на основной интерфейс, потом нат, потом на нужный.
В принципе меня такая схема устраивает, хотя у неё есть посредник.
Понаблюдаю день, может не будет сбрасываться. Хотя логика в таком варианте тоже присутствует.