Здравствуйте, DjoBlakk, Вы писали:
DB>Необходимо программно проверять доступность сетевых интерфейсов путем удаленного сокет подключения к северу.
DB>В процессе работы возникло проблема, gateway существует только для активного на данный момент подключения.
Понятие gateway вообще трудноформализуемое.
Простейшее определение: gateway — это тот маршрутизатор, через который идёт весь трафик. Ну, кроме машин, непосредственно находящихся в нашем сегменте. То есть строчка с destination = 0.0.0.0/0 в таблице рутинга.
Но это никак не помогает в случае более чем одного интерфейса, и тут возникают сложности.
Пусть мы — домашний рутер с двумя интерфейсами. Один наружу, за ним провайдерский рутер, через него весь Интернет (и поэтому он — гейтвей внешнего интерфейса). Другой внутрь, за ним дешёвый 8-портовый свитч, в него воткнуто напрямую ещё два компа и телевизор. Кого из них считать гейтвеем и почему?
Теперь пусть мы на этом рутере ещё подняли openvpn до работы. Он нам даёт ещё один (виртуальный) интерфейс. За ним — vpn-сервер предприятия и через него мы ходим на конторские машины, скажем, это сеть 10.54.0.0/16. А вот на ютюб и вконтакт мы продолжаем ходить через своего провайдера, потому что фу нафиг перед админами с работы светиться, куда мы там ходим. В этой ситуации у нас провайдерский рутер продолжает быть гейтвеем. Также, по логике, гейтвеем является и vpn-сервер компании, несмотря на то, что ему в таблице рутинга отведена всего лишь небольшая подсетка /16.
А теперь воткнём ещё второго провайдера. Потому что у него, скажем, прямой пиринг с НГУ с отличными скоростями и бесплатно (а у НГУ отличное зеркало Ubuntu), а в остальном он так себе провайдер, так что основной трафик продолжает литься через первого провайдера. А через этого завернём только диапазоны IP-адресов НГУ. Теперь маршрутизатор второго провайдера тоже гейтвей.
Внезапно, друг из второй сетки решил поделиться с нами своим NAS’ом с тоннами вкусного контента, который мы с ним долго собирали. NAS у него за домашним же рутером, до которого у нас есть прямой пинг через сетку провайдера. (Ну повезло так, живём в соседних подъездах же, один сегмент.) Теперь, получается, за интерфейсом, торчащим в сеть второго провайдера, у нас… два гейтвея. Один — маршрутизатор провайдера, через него мы ходим на Яндекс. А второй — рутер друга, через него мы качаем фильмы.
TL;DR:
За интерфейсом может быть единственный гейтвей.
За интерфейсом может не быть ни одного гейтвея (случай дикого сегмента).
За интерфейсом может быть более одного гейтвея (особые случаи).
Re[2]: Как узнать адреса шлюзов всех интерфесов ubuntu
Здравствуйте, Centaur, Вы писали:
C>Понятие gateway вообще трудно формализуемое.
C>TL;DR: C>
За интерфейсом может быть единственный гейтвей.
C>За интерфейсом может не быть ни одного гейтвея (случай дикого сегмента). C>За интерфейсом может быть более одного гейтвея (особые случаи). C>
Мне необходимо определить шлюз каждого доступного сетевого интерфейса, чтобы добавить маршрут через этот интерфейс.
Когда маршрут добавится, то я смогу проверить соединение с сервером по этому интерфейсу.
А получается так, что gateway не пустой только для активного сетевого интерфейса, а для остальных gateways.Count = 0.
И добавить маршрут, чтобы сделать активным проверяемый интерфейс не получается.
Re[3]: Как узнать адреса шлюзов всех интерфесов ubuntu
Здравствуйте, DjoBlakk, Вы писали:
C>>Понятие gateway вообще трудно формализуемое.
DB>Мне необходимо определить шлюз каждого доступного сетевого интерфейса, чтобы добавить маршрут через этот интерфейс. DB>Когда маршрут добавится, то я смогу проверить соединение с сервером по этому интерфейсу. DB>А получается так, что gateway не пустой только для активного сетевого интерфейса, а для остальных gateways.Count = 0. DB>И добавить маршрут, чтобы сделать активным проверяемый интерфейс не получается.
А, ну так естественно. Раз маршрута нет, то и гейтвея как бы нет. И в некоторых ситуациях его нельзя определить, не спросив администратора.
Маршут добавляется при подъёме интерфейса, если в /etc/network/interfaces для этого интерфейса прописан метод static или tunnel и опция gateway.
Или если прописан метод dhcp и dhcp-сервер выдаст gateway.
Или метод ppp и ppp-сервер выдаст gateway.
Помимо классического /etc/network/interfaces, настройкой интерфейсов может заниматься новомодный, но еретический NetworkManager.
Какую конкретно задачу вы решаете, и зачем?
Re[4]: Как узнать адреса шлюзов всех интерфесов ubuntu
C>Маршут добавляется при подъёме интерфейса, если в /etc/network/interfaces для этого интерфейса прописан метод static или tunnel и опция gateway. C>Или если прописан метод dhcp и dhcp-сервер выдаст gateway. C>Или метод ppp и ppp-сервер выдаст gateway. C>Помимо классического /etc/network/interfaces, настройкой интерфейсов может заниматься новомодный, но еретический NetworkManager. C>
C>Какую конкретно задачу вы решаете, и зачем?
Необходимо передавать данные через активный интерфейс с наибольшим приоритетом (Ethernet_0 ... Ethernet_N > WiFi > GPRS > Спутниковый модем), так же необходимо отображать доступность других интерфейсов.
Если не доступны Ethernet и WiFi, то необходимо дозваниваться по GPRS, если недоступен GPRS, то дозваниваться по спутнику.
При подключении по спутнику, нужно периодически звонить по GPRS.
Есть панелька на которой должен отображаться статус каждого подключения: активный интерфейс, есть доступ к серверу, нет доступа, не активен.
В случае доступности сервера на более приоритетном интерфейсе, он должен стать активным.
А есть варианты как можно вытащить адреса gateway при выдачи их dhcp серверами ?
Re[5]: Как узнать адреса шлюзов всех интерфесов ubuntu
Здравствуйте, DjoBlakk, Вы писали:
C>>Какую конкретно задачу вы решаете, и зачем?
DB>Необходимо передавать данные через активный интерфейс с наибольшим приоритетом (Ethernet_0 ... Ethernet_N > WiFi > GPRS > Спутниковый модем), так же необходимо отображать доступность других интерфейсов.
Понятно. Такой многоступенчатый failover.
DB>В случае доступности сервера на более приоритетном интерфейсе, он должен стать активным.
DB>А есть варианты как можно вытащить адреса gateway при выдачи их dhcp серверами ?
Он будет в таблице маршрутизации, с сетью назначения 0.0.0.0/0.
А может, стоит пробовать просто установить tcp-соединение на интересующий нас сервер с каждого из наших IP’шников? По идее, при фиксированном source IP-адресе трафик должен пойти через соответствующий интерфейс… но это догадка, я сам не пробовал.
Re[5]: Как узнать адреса шлюзов всех интерфесов ubuntu
Здравствуйте, DjoBlakk, Вы писали:
DB>Необходимо передавать данные через активный интерфейс с наибольшим приоритетом (Ethernet_0 ... Ethernet_N > WiFi > GPRS > Спутниковый модем), так же необходимо отображать доступность других интерфейсов.
… DB>Если не доступны Ethernet и WiFi, то необходимо дозваниваться по GPRS, если недоступен GPRS, то дозваниваться по спутнику. DB>При подключении по спутнику, нужно периодически звонить по GPRS.
… DB>В случае доступности сервера на более приоритетном интерфейсе, он должен стать активным.