Wyszukiwanie w witrynie

Jak zamienić serwer Linux w router do obsługi ruchu statycznego i dynamicznego — część 10


Jak przewidywaliśmy w poprzednich tutorialach z tej serii LFCE (Certyfikowany inżynier Linux Foundation), w tym artykule omówimy statyczne i dynamiczne routing ruchu IP z określonymi aplikacjami.

Przedstawiamy program certyfikacji Linux Foundation

Na początek ustalmy kilka definicji:

  1. Krótko mówiąc, pakiet to podstawowa jednostka używana do przesyłania informacji w sieci. Sieci używające protokołu TCP/IP jako protokołu sieciowego kierują się tymi samymi zasadami transmisji danych: faktyczna informacja jest dzielona na pakiety składające się zarówno z danych, jak i adresu, na który powinny zostać wysłane.
  2. Routing to proces „prowadzenia” danych od źródła do miejsca docelowego w sieci.
  3. Routing statyczny wymaga ręcznie skonfigurowanego zestawu reguł zdefiniowanych w tabeli routingu. Reguły te są stałe i służą do definiowania drogi, jaką musi przejść pakiet podczas podróży z jednej maszyny na drugą.
  4. Routing dynamiczny lub routing inteligentny (jeśli chcesz) oznacza, że system może automatycznie zmieniać w razie potrzeby trasę, którą podąża pakiet.

Zaawansowana konfiguracja IP i urządzeń sieciowych

Pakiet iproute zapewnia zestaw narzędzi do zarządzania siecią i kontrolą ruchu, z których będziemy korzystać w tym artykule, ponieważ zastępują one starsze narzędzia, takie jak ifconfig i route.

Centralne narzędzie pakietu iproute nazywa się po prostu ip. Jego podstawowa składnia jest następująca:

ip object command

Gdzie obiekt może być tylko jednym z poniższych (wyświetlane są tylko najczęściej występujące obiekty – pełną listę można znaleźć w man ip):

  1. link: urządzenie sieciowe.
  2. addr: adres protokołu (IP lub IPv6) na urządzeniu.
  3. trasa: wpis w tablicy routingu.
  4. reguła: reguła w bazie danych zasad routingu.

Natomiast polecenie reprezentuje konkretną akcję, którą można wykonać na obiekcie. Możesz uruchomić następujące polecenie, aby wyświetlić pełną listę poleceń, które można zastosować do konkretnego obiektu:

ip object help

Na przykład,

ip link help

Na powyższym obrazku widać przykładowo, że stan interfejsu sieciowego można zmienić za pomocą polecenia:

ip link set interface {up | down}

Więcej przykładów polecenia „ip” znajdziesz w artykule 10 przydatnych poleceń „ip” do konfiguracji adresu IP

Przykład 1: Wyłączanie i włączanie interfejsu sieciowego

W tym przykładzie wyłączymy i włączymy eth1:

ip link show
ip link set eth1 down
ip link show

Jeśli chcesz ponownie włączyć eth1,

ip link set eth1 up

Zamiast wyświetlać wszystkie interfejsy sieciowe, możemy określić jeden z nich:

ip link show eth1

Który zwróci wszystkie informacje dla eth1.

Przykład 2: Wyświetlanie głównej tablicy routingu

Możesz wyświetlić bieżącą główną tablicę routingu za pomocą jednego z 3 następujących poleceń:

ip route show
route -n
netstat -rn

Pierwsza kolumna w wynikach trzech poleceń wskazuje sieć docelową. Wyniki polecenia ip Route show (po słowie kluczowym dev) przedstawiają także urządzenia sieciowe, które służą jako fizyczna brama do tych sieci.

Chociaż obecnie preferowane jest polecenie ip zamiast Route, nadal możesz odwołać się do man ip-route i man Route, aby uzyskać szczegółowe wyjaśnienie pozostałych z kolumn.

Przykład 3: Używanie serwera Linux do trasowania pakietów pomiędzy dwiema sieciami prywatnymi

Chcemy kierować pakiety icmp (ping) z dev2 do dev4 i odwrotnie (zwróć uwagę, że oba komputery klienckie znajdują się w różnych sieciach). Nazwa każdej karty sieciowej wraz z odpowiadającym jej adresem IPv4 jest podana w nawiasach kwadratowych.

Nasze środowisko testowe wygląda następująco:

Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1
Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2
Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

Przyjrzyjmy się tabeli routingu w dev1 (CentOS):

ip route show

a następnie zmodyfikuj go, aby używać karty sieciowej enp0s3 i połączenia z adresem 192.168.0.15 w celu uzyskania dostępu do hostów w sieci 10.0.0.0/24:

ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

Co zasadniczo brzmi: „Dodaj trasę do sieci 10.0.0.0/24 przez interfejs sieciowy enp0s3, używając adresu 192.168.0.15 jako bramy”.

Podobnie w dev4 (openSUSE box) do pingowania hostów w sieci 192.168.0.0/24:

ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

Na koniec musimy włączyć przekazywanie w naszym routerze Debiana:

echo 1 > /proc/sys/net/ipv4/ip_forward

Teraz pingujmy:

I,

Aby te ustawienia były trwałe przy każdym uruchomieniu, edytuj plik /etc/sysctl.conf na routerze i upewnij się, że zmienna net.ipv4.ip_forward jest ustawiona na true w następujący sposób:

net.ipv4.ip_forward = 1

Ponadto skonfiguruj karty sieciowe na obu klientach (poszukaj pliku konfiguracyjnego w /etc/sysconfig/network w openSUSE i /etc/sysconfig/network-scripts w CentOS – w obu przypadkach nazywa się to ifcfg-enp0s3).

Oto plik konfiguracyjny z pudełka openSUSE:

BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.18
NETMASK=255.255.255.0
GATEWAY=10.0.0.15
NAME=enp0s3
NETWORK=10.0.0.0
ONBOOT=yes
Przykład 4: Używanie serwera Linux do trasowania pakietów pomiędzy sieciami prywatnymi a Internetem

Innym scenariuszem, w którym komputer z systemem Linux może służyć jako router, jest sytuacja, w której musisz udostępnić swoje połączenie internetowe prywatnej sieci LAN.

Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2
Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

Oprócz skonfigurowania przekazywania pakietów i statycznej tablicy routingu w kliencie, jak w poprzednim przykładzie, musimy dodać kilka reguł iptables na routerze:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Pierwsze polecenie dodaje regułę do łańcucha POSTROUTING w tabeli nat (translacja adresów sieciowych), wskazując, że karta sieciowa eth0 powinna być używana dla pakietów wychodzących.

MASQUERADE wskazuje, że ta karta sieciowa ma dynamiczny adres IP i że przed wysłaniem pakietu do „dzikiego świata” Internetu prywatny adres źródłowy pakietu musi zostać zmieniony na publiczny adres IP routera.

W sieci LAN z wieloma hostami router śledzi nawiązane połączenia w pliku /proc/net/ip_conntrack, dzięki czemu wie, dokąd zwrócić odpowiedź z Internetu.

Tylko część wyników:

cat /proc/net/ip_conntrack

jest pokazany na poniższym zrzucie ekranu.

Gdzie podświetlone jest źródło (prywatny adres IP skrzynki openSUSE) i miejsce docelowe (Google DNS) pakietów. Oto efekt biegania:

curl linux-console.net

na polu openSUSE.

Jestem pewien, że już się domyślasz, router używa Google 8.8.8.8 jako serwera nazw, co wyjaśnia, dlaczego miejsce docelowe pakietów wychodzących wskazuje na ten adres.

Uwaga: Pakiety przychodzące z Internetu są akceptowane tylko wtedy, gdy stanowią część już nawiązanego połączenia (polecenie nr 2), natomiast pakiety wychodzące są dozwolone „wolne wyjście ” (polecenie nr 3).

Nie zapomnij o utrwaleniu reguł iptables, wykonując kroki opisane w Części 8 – Konfigurowanie zapory Iptables z tej serii.

Dynamiczny routing z Quaggą

Obecnie najczęściej używanym narzędziem do dynamicznego routingu w systemie Linux jest quagga. Umożliwia administratorom systemów wdrożenie na stosunkowo niedrogim serwerze z systemem Linux tej samej funkcjonalności, jaką zapewniają wydajne (i drogie) routery Cisco.

Samo narzędzie nie obsługuje routingu, ale raczej modyfikuje tablicę routingu jądra, ucząc się nowych najlepszych tras do obsługi pakietów.

Ponieważ jest to widelec zebry, program, którego rozwój zakończył się jakiś czas temu, ze względów historycznych zachowuje te same polecenia i strukturę co zebra. Dlatego od tego momentu zobaczysz wiele odniesień do zebry.

Należy pamiętać, że nie jest możliwe omówienie routingu dynamicznego i wszystkich powiązanych protokołów w jednym artykule, ale jestem pewien, że przedstawiona tutaj treść będzie dla Ciebie punktem wyjścia do dalszych prac.

Instalowanie Quaggi w systemie Linux

Aby zainstalować Quaggę w wybranej dystrybucji:

aptitude update && aptitude install quagga 				[On Ubuntu]
yum update && yum install quagga 					[CentOS/RHEL]
zypper refresh && zypper install quagga 				[openSUSE]

Będziemy używać tego samego środowiska, co w przykładzie nr 3, z tą tylko różnicą, że eth0 jest podłączony do routera głównej bramy o adresie IP 192.168.0.1.

Następnie edytuj /etc/quagga/daemons za pomocą:

zebra=1
ripd=1

Teraz utwórz następujące pliki konfiguracyjne.

/etc/quagga/zebra.conf
/etc/quagga/ripd.conf

i dodaj te linie (zastąp wybraną nazwę hosta i hasło):

service quagga restart
hostname    	dev2
password    	quagga
service quagga restart

Uwaga: ripd.conf to plik konfiguracyjny protokołu Routing Information Protocol, który dostarcza routerowi informacji o tym, które sieci mogą być osiągnięte i jak daleko (pod względem liczby przeskoków) się znajdują.

Należy pamiętać, że jest to tylko jeden z protokołów, których można używać razem z quaggą i wybrałem go do tego samouczka ze względu na łatwość użycia i fakt, że obsługuje go większość urządzeń sieciowych, chociaż ma tę wadę, że przekazuje dane uwierzytelniające zwykłym tekstem. Z tego powodu należy nadać odpowiednie uprawnienia do pliku konfiguracyjnego:

chown quagga:quaggavty /etc/quagga/*.conf
chmod 640 /etc/quagga/*.conf 
Przykład 5: Konfigurowanie kwaggi do dynamicznego kierowania ruchu IP

W tym przykładzie użyjemy następującej konfiguracji z dwoma routerami (pamiętaj o utworzeniu plików konfiguracyjnych dla routera nr 2, jak wyjaśniono wcześniej):

Ważne: nie zapomnij powtórzyć poniższej konfiguracji dla obu routerów.

Połącz się z zebrą (nasłuchując na porcie 2601), która jest logicznym pośrednikiem pomiędzy routerem a jądrem:

telnet localhost 2601

Wpisz hasło, które zostało ustawione w pliku /etc/quagga/zebra.conf, a następnie włącz konfigurację:

enable
configure terminal

Wprowadź adres IP i maskę sieci każdej karty sieciowej:

inter eth0
ip addr 192.168.0.15
inter eth1
ip addr 10.0.0.15
exit
exit
write

Teraz musimy połączyć się z terminalem demona RIP (port 2602):

telnet localhost 2602

Wpisz nazwę użytkownika i hasło skonfigurowane w pliku /etc/quagga/ripd.conf, a następnie wpisz następujące polecenia pogrubioną czcionką (komentarze dodano w celu wyjaśnienia):

enable turns on privileged mode command.
configure terminal changes to configuration mode. This command is the first step to configuration
router rip enables RIP.
network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. 
exit
exit
write writes current configuration to configuration file.

Uwaga: w obu przypadkach konfiguracja jest dołączona do linii, które dodaliśmy wcześniej (/etc/quagga/zebra.conf i < b>/etc/quagga/ripd.conf).

Na koniec połącz się ponownie z usługą zebra na obu routerach i zanotuj, jak każdy z nich „nauczył się” trasy do sieci znajdującej się za drugim i jaki jest następny przeskok, aby się do niej dostać sieci, uruchamiając polecenie show ip Route:

show ip route

Jeśli chcesz wypróbować różne protokoły lub konfiguracje, możesz zapoznać się z witryną projektu Quagga w celu uzyskania dalszej dokumentacji.

Wniosek

W tym artykule wyjaśniliśmy, jak skonfigurować routing statyczny i dynamiczny za pomocą routera(ów) z systemem Linux. Możesz dodawać dowolną liczbę routerów i eksperymentować, ile chcesz. Jeśli masz jakieś uwagi lub pytania, nie wahaj się z nami skontaktować, korzystając z poniższego formularza kontaktowego.