Как узнать адреса шлюзов всех интерфесов ubuntu
От: DjoBlakk  
Дата: 19.07.12 10:51
Оценка:
Необходимо программно проверять доступность сетевых интерфейсов путем удаленного сокет подключения к северу.

В функцию передаются IPInterfaceProperties каждого интерфейса.

В процессе работы возникло проблема, gateway существует только для активного на данный момент подключения.

Узнать шлюзы остальных сетевых интерфейсов мне не удалось.

Может кто сталкивался?

Или подскажет альтернативный путь.

private static bool TestConnection(IPInterfaceProperties properties, IPAddress remoteAddress,int remotePort)
        {
            bool result = false;

            try
            {
                if (remoteAddress != null)
                {
                    GatewayIPAddressInformationCollection gateways = properties.GatewayAddresses;
                    UnicastIPAddressInformationCollection addresses = properties.UnicastAddresses;

                    for (int i = 0; i < addresses.Count; i++)
                    {
                        IPAddress addr = addresses[i].Address;
                        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                        for (int j = 0; j < gateways.Count; j++)
                        {
                            GatewayIPAddressInformation gateway = gateways[j];

                            try
                            {
                                // Add the route entry to the route table to solve the Windows XP issue.
                                AddRoute(gateway.Address.ToString(), remoteAddress.ToString());

                                // Bind the address to access the remote server.
                                IPEndPoint local = new IPEndPoint(addr, 0);
                                socket.Bind(local);
                                socket.Connect(remoteAddress, remotePort);
                                result = true;
                                socket.Disconnect(true);
                                socket.Shutdown(SocketShutdown.Both);
                            }
                            catch
                            {
                                result |= false;
                            }
                            finally
                            {
                                socket.Close();

                                // Remove the route entry from the route table.
                                RemoveRoute(remoteAddress.ToString());
                            }
                        }
                    }
                }
            }

            catch (Exception ex)
            {
               
            }

            return result;
        }
Re: Как узнать адреса шлюзов всех интерфесов ubuntu
От: Centaur Россия  
Дата: 19.07.12 15:23
Оценка:
Здравствуйте, 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
От: DjoBlakk  
Дата: 20.07.12 05:37
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Понятие gateway вообще трудно формализуемое.


C>TL;DR:

C>
Мне необходимо определить шлюз каждого доступного сетевого интерфейса, чтобы добавить маршрут через этот интерфейс.

Когда маршрут добавится, то я смогу проверить соединение с сервером по этому интерфейсу.

А получается так, что gateway не пустой только для активного сетевого интерфейса, а для остальных gateways.Count = 0.

И добавить маршрут, чтобы сделать активным проверяемый интерфейс не получается.
Re[3]: Как узнать адреса шлюзов всех интерфесов ubuntu
От: Centaur Россия  
Дата: 20.07.12 07:18
Оценка:
Здравствуйте, DjoBlakk, Вы писали:

C>>Понятие gateway вообще трудно формализуемое.


DB>Мне необходимо определить шлюз каждого доступного сетевого интерфейса, чтобы добавить маршрут через этот интерфейс.

DB>Когда маршрут добавится, то я смогу проверить соединение с сервером по этому интерфейсу.
DB>А получается так, что gateway не пустой только для активного сетевого интерфейса, а для остальных gateways.Count = 0.
DB>И добавить маршрут, чтобы сделать активным проверяемый интерфейс не получается.

А, ну так естественно. Раз маршрута нет, то и гейтвея как бы нет. И в некоторых ситуациях его нельзя определить, не спросив администратора.


Какую конкретно задачу вы решаете, и зачем?
Re[4]: Как узнать адреса шлюзов всех интерфесов ubuntu
От: DjoBlakk  
Дата: 20.07.12 07:43
Оценка:
Здравствуйте, Centaur, Вы писали:

C>

C>Какую конкретно задачу вы решаете, и зачем?


Необходимо передавать данные через активный интерфейс с наибольшим приоритетом (Ethernet_0 ... Ethernet_N > WiFi > GPRS > Спутниковый модем), так же необходимо отображать доступность других интерфейсов.

Если не доступны Ethernet и WiFi, то необходимо дозваниваться по GPRS, если недоступен GPRS, то дозваниваться по спутнику.

При подключении по спутнику, нужно периодически звонить по GPRS.

Есть панелька на которой должен отображаться статус каждого подключения: активный интерфейс, есть доступ к серверу, нет доступа, не активен.

В случае доступности сервера на более приоритетном интерфейсе, он должен стать активным.

А есть варианты как можно вытащить адреса gateway при выдачи их dhcp серверами ?
Re[5]: Как узнать адреса шлюзов всех интерфесов ubuntu
От: Centaur Россия  
Дата: 20.07.12 14:13
Оценка:
Здравствуйте, 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
От: ДимДимыч Украина http://klug.org.ua
Дата: 22.07.12 18:39
Оценка:
Здравствуйте, DjoBlakk, Вы писали:

DB>Необходимо передавать данные через активный интерфейс с наибольшим приоритетом (Ethernet_0 ... Ethernet_N > WiFi > GPRS > Спутниковый модем), так же необходимо отображать доступность других интерфейсов.


DB>Если не доступны Ethernet и WiFi, то необходимо дозваниваться по GPRS, если недоступен GPRS, то дозваниваться по спутнику.
DB>При подключении по спутнику, нужно периодически звонить по GPRS.

DB>В случае доступности сервера на более приоритетном интерфейсе, он должен стать активным.

Может вам BGP подойдет?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.