Ciekawy problem z połączeniami do serwerów

Gdy zdecydowałem się na pisanie własnego bloga, postanowiłem na tym skorzystać w inny sposób -  nauczyć się czegoś nowego. Doświadczenie z serwerami na Debianie mam głównie dzięki pracy w PCLab.pl. Postanowiłem z niego skorzystać i w ramach hobby przez jakiś czas hostować bloga u siebie i przy okazji nauczyć się czegoś nowego (a nauczyłem się całkiem sporo).

Tak, wiem, że to nieprofesjonalne, aby hostować bloga na zwykłych pecetach na łączu internetowym od lokalnego dostawcy. Docelowo blog wyląduje na dedykowanym hostingu. Założenie było jednak takie, aby przy okazji się czegoś nauczyć. Nauczyłem się więcej niż sądziłem. Postawiłem dwie starsze maszyny (zwykłe PC-ty) na wystarczająco szybkim łączu. Nie będę tu wnikał w ich software-owe konfiguracje. Wspomnę na wstępie tylko, że każda z maszyn ma dwie karty sieciowe – jedną z zewnętrznym stałym IP od mojego dostawcy Internetu, drugą w sieci wewnętrznej. Zanim wystawiłem serwery na zewnątrz z Internetem komunikowały się przez router w mojej sieci. Na samym końcu dopiero podniosłem zewnętrzne interfejsy. Znajdują się tu zatem moje 3 zewnętrzne adresy IP (oba serwery i router przez który ja się łączę z Internetem) spięte siecią LAN dostawcy, oraz wewnętrzna sieć, którą spięte są serwery, router i mój komputer.

Problem

Od razu pojawił się dość interesujący problem – blog nie był dostępny z Internetu, co więcej serwery z zewnątrz nie dawały się spingować, ale mój router z zewnątrz pingował się bez problemu. Aby było ciekawiej, ja nadal mogłem ze swojego komputera przez router spingować oba serwery po zewnętrznym IP. Po sieci wewnętrznej wszystko działało przez cały czas.

Aby to nieco zobrazować:

Zielona linia – to połączenia przez sieć wewnętrzną
Niebieska linia – odpytanie przez router i zewnętrzne IP na zewnętrzne IP serwerów
Czerwona linia – połączenie z Internetu

W dwóch pierwszych przypadkach wszystko działało jak należy, ale w trzecim już nie. Gdy pingowałem zewnętrzne IP serwerów przez router oraz przez sieć dostawcy – ping wracał, gdy z Internetu na to samo IP – już nie.

Analiza

W przywróceniu dostępu do serwerów z zewnątrz pomagało /etc/init.d/networking restart lub ifdown/ipfup na zewnętrznym interfejsie.

Cały czas zastanawiającym dla mnie było, dlaczego ja wewnątrz sieci dostawcy mogę spingować serwery, ale z sieci Internet już nie. Odpowiedź była oczywista, zbyt oczywista, wręcz tak bardzo oczywista, że ją przeoczyłem (ale o tym za chwilę).

Aby znaleźć przyczynę problemów, kilkukrotnie zmieniałem konfigurację iptables, nawet zmieniałem konfigurację rsyslog-a tak, aby logował mi odrzucone połączenia do osobnych plików podzielonych na połączenia z sieci dostawcy i spoza niej, w celu łatwiejszej analizy. Przyczyny szukałem także w innych miejscach. Do tego Paweł (kolega) podrzucił mi prosty skrypt we bash-u, który odpalony na maszynie będącej w Internecie pingował mi serwer i zapisywał wynik w logu (skrypt zmodyfikowałem, aby dodatkowo wysyłał mi maila w przypadku gdy ping się nie powiódł). Cały czas po jakimś czasie dostawałem ponownie maile wysyłane ze skryptu.

Wczoraj (w niedzielę) rano, gdy wstałem, oczywiście na skrzynce ponownie miałem maile ze skryptu pingującego. Zalogowałem się na pierwszy z serwerów i gdy ponownie analizowałem m.in. logi (w których nic nie było o godzinie o której zacząłem dostawać maile, czyli wystąpił problem), serwer niespodziewanie i bez mojego udziału zaczął odpowiadać. No ale miałem jeszcze drugi, który też nie był dostępny z Internetu w tym czasie, choć w sieci dostawcy i sieci lokalnej mogłem cały czas oba pingować. W pewnym momencie zauważyłem ciekawą rzecz.

Przyczyna

Na switchu sieci lokalnej dioda drugiego serwera i routera pomigiwała z częstotliwością jednego razu na sekundę (na szczęście był mały ruch w sieci i to zauważyłem) w momencie, gdy puszczałem ping z zewnątrz – wtedy mnie olśniło. Serwer na pakiety przychodzące po interfejsie z zewnętrznym IP odpowiadał przez drugi interfejs i router – no tak – dwie domyślne bramy sieciowe, że też wcześniej na to nie wpadłem :) Jak pisałem, było to zbyt oczywiste. Możecie to też nazwać brakiem doświadczenia, nie zaprzeczę.

Jeśli serwer pracuje w dwóch sieciach i odpowiada na pakiet przychodzący, w domyślnej konfiguracji i ujmując w skrócie, jeśli źródłem jest host w tej samej sieci (w obrębie maski sieciowej), odpowie przez tą właśnie sieć. Jeśli nie, użyje bramy sieciowej. W moim przypadku, podczas próby odpowiedzi przez bramę (na pakiet z Internetu), jeśli nastąpił chwilowy problem w sieci dostawcy i pierwsza z bram sieciowych była nieosiągalna, serwer próbował wysłać pakiet przez drugą z bram, które miał skonfigurowane. Był nią router w mojej sieci. Host, który wysłał pakiet, otrzymywał pakiet z innego adresu IP (czego nie oczekiwał) wiec go ignorował (tu ponownie w skrócie). Dlatego pomimo, że ja cały czas po interfejsie z zewnętrznym IP miałem dostęp, połączenia z Internetu nie dochodziły do skutku.

Rozwiązanie

Potwierdził to też wyżej wspomniany skrypt w bashu – kolejna modyfikacja i skrypt wysyłał mi maile, gdy którykolwiek z zewnętrznych adresów IP nie odpowie na ping – do tej pory dostałem kilka maili, w których informacje z pinga potwierdziły, że wszystkie 3 adresy IP się nie pingują w chwili gdy wystąpi chwilowy problem z siecią.

Szybka konfiguracja i pozostawienie tylko jednej, właściwej, bramy domyślnej rozwiązały problem.

Konkluzja

Jak powiedział mi Paweł (swoją drogą świetny administrator, któremu dziękuję za pomoc), nie należy ustawiać w systemie dwóch bram domyślnych, o ile nie robi się tego celowo i nie skonfiguruje odpowiednio, bo zawsze to doprowadzi do takich skutków. Gdybym tylko od razu powiedział Pawłowi, że mam ustawione dwie domyślne bramy sieciowe w systemie (o czym nie pomyślałem aż do chwili gdy szukałem przyczyny problem)u, na Pewno zwrócił by mi na to od razu uwagę.

Ten wpis został opublikowany w kategorii Debian, Linux, Serwery, Sieci i oznaczony tagami , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Musisz się zalogować (także Facebook, Google+, Twitter), aby móc dodać komentarz.