Как пинговать с определенного интерфейса
Перейти к содержимому

Как пинговать с определенного интерфейса

  • автор:

как сделать «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. Висит на нужном интерфейсе.

Судя по логу, идёт запрос на основной интерфейс, потом нат, потом на нужный.

В принципе меня такая схема устраивает, хотя у неё есть посредник.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *