Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk1:routing_wstep [2016/04/12 09:44] jkonczak [Routing] |
sk1:routing_wstep [2019/04/08 15:03] (aktualna) jkonczak [Tworzenie tablicy tras] |
||
---|---|---|---|
Linia 11: | Linia 11: | ||
* cel - sieć docelową (np. 1.2.0.0/16, 192.168.2.0/24) | * cel - sieć docelową (np. 1.2.0.0/16, 192.168.2.0/24) | ||
* trasę - adres następnego skoku (np. 3.4.5.6, 192.168.1.1) lub/i port wyjściowy (slo1, tun2) | * trasę - adres następnego skoku (np. 3.4.5.6, 192.168.1.1) lub/i port wyjściowy (slo1, tun2) | ||
- | * typowo podaje się tylko adres **następnego** skoku (czyli adres z bezpośrednio połączonej sieci) | + | * typowo podaje się tylko adres następnego skoku (czyli adres z bezpośrednio połączonej sieci) |
* dla sieci bezpośrednio podłączonych podaje się tylko urządzenie | * dla sieci bezpośrednio podłączonych podaje się tylko urządzenie | ||
* metrykę - koszt wysłania daną trasą pakietu, używany do porównywania tras, (np. 0, 1, 10, 679842) | * metrykę - koszt wysłania daną trasą pakietu, używany do porównywania tras, (np. 0, 1, 10, 679842) | ||
* <html><small></html> w routerach CISCO (na których będą kolejne zajęcia) dodatkowo parametr //administrative distance// (AD), który jest używany do rozstrzygania wyboru trasy jeśli więcej protokołów routingu poda trasę do tej samej sieci<html></small></html> | * <html><small></html> w routerach CISCO (na których będą kolejne zajęcia) dodatkowo parametr //administrative distance// (AD), który jest używany do rozstrzygania wyboru trasy jeśli więcej protokołów routingu poda trasę do tej samej sieci<html></small></html> | ||
+ | |||
+ | ==== Wybór trasy ==== | ||
Schemat wyboru trasy: | Schemat wyboru trasy: | ||
- | * wybiera się trasy do sieci w których znajduje się docelowy adres o najdłuższej masce, np.:<code>172.21.0.0/16 via 172.16.0.16 dev eth2 | + | * z tras do sieci w których znajduje się docelowy adres wybiera się trasy do sieci o najdłuższej masce, np.:<code>172.21.0.0/16 via 172.16.0.16 dev eth2 |
172.21.0.0/24 via 172.16.0.24 dev eth2 | 172.21.0.0/24 via 172.16.0.24 dev eth2 | ||
172.21.0.0/28 via 172.16.0.28 dev eth2</code> pakiet kierowany do 172.21.0.15 zostanie wysłany przez 172.16.0.28, a \\ pakiet kierowany do 172.21.0.55 zostanie wysłany przez 172.16.0.24 | 172.21.0.0/28 via 172.16.0.28 dev eth2</code> pakiet kierowany do 172.21.0.15 zostanie wysłany przez 172.16.0.28, a \\ pakiet kierowany do 172.21.0.55 zostanie wysłany przez 172.16.0.24 | ||
- | * jeśli wybór nie jest jednoznaczny - trasa o najmniejszym koszcie, np.:<code>150.254.44.0/23 dev wlan0 proto kernel scope link src 150.254.45.39 metric 2003 | + | * jeśli wybór nie jest jednoznaczny - trasa o najmniejszym koszcie, np.:<code>150.254.44.0/23 dev wlan0 proto kernel scope link src 150.254.45.39 metric 2003 |
150.254.44.0/23 dev wlan1 proto kernel scope link src 150.254.44.149 metric 1002</code>tu zawsze wybrana jest trasa przez 150.254.44.149, jako ta o niższym koszcie | 150.254.44.0/23 dev wlan1 proto kernel scope link src 150.254.44.149 metric 1002</code>tu zawsze wybrana jest trasa przez 150.254.44.149, jako ta o niższym koszcie | ||
* jeśli wybór nie jest jednoznaczny - pierwsza w tablicy.<code>default via 150.254.44.1 dev wlan0 | * jeśli wybór nie jest jednoznaczny - pierwsza w tablicy.<code>default via 150.254.44.1 dev wlan0 | ||
default via 150.254.130.42 dev eth0</code> | default via 150.254.130.42 dev eth0</code> | ||
- | Zwykle definiuje się w tablicy tras trasę domyślną. \\ | + | Zwykle definiuje się w tablicy tras **trasę domyślną**. \\ |
Czasam jest ona traktowana "specjalnie" – pokazywana w osobnym miejscu lub opisana jako //default// (zamiast adresu sieci). \\ | Czasam jest ona traktowana "specjalnie" – pokazywana w osobnym miejscu lub opisana jako //default// (zamiast adresu sieci). \\ | ||
Jeśli nie – do zdefiniowania trasy domyślnej używa się adresu 0.0.0.0/0 | Jeśli nie – do zdefiniowania trasy domyślnej używa się adresu 0.0.0.0/0 | ||
+ | |||
+ | ==== Tworzenie tablicy tras ==== | ||
Sposoby uzyskiwania informacji o trasach: | Sposoby uzyskiwania informacji o trasach: | ||
Linia 33: | Linia 37: | ||
* użycie protokołów routingu | * użycie protokołów routingu | ||
- | Protokoły trasowania można podzielić ze względu na obszar działania: | + | Protokoły trasowania można podzielić ze względu na obszar działania (w odniesieniu do obszarów autonomicznych (AS) [[https://en.wikipedia.org/wiki/Autonomous_system_(Internet)|[1]]]): |
* wewnętrzne (IGP - Interior Gateway Protocol), np. RIP, EIGRP, OSPF, IS-IS | * wewnętrzne (IGP - Interior Gateway Protocol), np. RIP, EIGRP, OSPF, IS-IS | ||
- | * zewnętrzna (EGP - Exterior Gateway Protocol) - obecnie (jedynym) używanym jest BGP | + | * zewnętrzne (EGP - Exterior Gateway Protocol) - obecnie (jedynym) używanym jest BGP |
albo ze względu na sposób działania: | albo ze względu na sposób działania: | ||
- | * wektora odległości (distance vector), np. RIP, IGRP – znają sąsiadów i koszt dotarcia do istniejących sieci | + | * wektora odległości (distance vector), np. RIP, IGRP – wymieniają się z sąsiadami informacjami o osiągalnych sieciach; wyznaczają tylko koszty dotarcia do sieci |
- | * stanu łącza (link state), np. OSPF, IS-IS – znają wszystkie połączenia w sieci | + | * stanu łącza (link state), np. OSPF, IS-IS – wymieniają się z sąsiadami informacjami o topologii sieci; budują pełną mapę sieci |
- | * wektora ścieżki (path-vector), np. BGP, używany tam gdzie sieć jest za duża by w/w działały – znają sąsiadów i ścieżki dotarcia do sieci sobie podległych | + | * wektora ścieżki (path-vector), np. BGP – wymieniają się z sąsiadami pełnymi ścieżkami do każdej sieci; zbierają listę dostępnych ścieżek; algorytm używany tam gdzie sieć jest za duża by działał algorytm stanu łącza; algorytm podobny do wektora odległości, ale dużo lepiej radzi sobie ze zmianami topologii |
http://en.wikipedia.org/wiki/Routing | http://en.wikipedia.org/wiki/Routing | ||
===== Wyświetlanie tablic routingu w systemie Linux ===== | ===== Wyświetlanie tablic routingu w systemie Linux ===== | ||
- | Wypisanie trasy - ''route'' / ''ip route [list/show]''\\ | + | Narzędzia ''route'' (net-tools) i ''ip route'' (iproute2) |
- | Sprawdzenie trasy do konkretnego adresu - ''ip route get [addr]'' | + | |
+ | Wypisanie trasy: | ||
+ | * ''route'' | ||
+ | * ''ip route [list/show]''\\ | ||
+ | Sprawdzenie adresu następnego skoku do podanego adresu docelowego: | ||
+ | * ''ip route get <addr>'' | ||
+ | |||
+ | ++++ Przykłady poleceń | | ||
+ | <html><pre> | ||
+ | <b>/ # ip route</b> | ||
+ | <span title="Trasa domyślna (trasa do 0.0.0.0/0)" style="background-color:rgba(0,255,0,0.2)">default</span> via 10.0.1.2 dev br0 proto dhcp src 10.0.1.3 metric 3 | ||
+ | <span title="Cel trasy - sieć 10.0.0.0/24" style="background-color:rgba(0,255,0,0.2)">10.0.0.0/24</span> <span title="Następny skok" style="background-color:rgba(255,0,0,0.2)">via 10.0.1.1</span> <span title="Urządzenie przez które dostępny jest adres następnego skoku" style="background-color:rgba(255,255,0,0.4)">dev br0</span> proto dhcp <span title="Adres używany jako źródłowy, ma znaczenie jeśli komputer ma wiele adresów IP" style="background-color:rgba(0,0,255,0.15)">src 10.0.1.3</span> <span title="Metryka (koszt) trasy" style="background-color:rgba(255,0,255,0.2)">metric 3</span> | ||
+ | <span title="Trasa bez adresu IP następnego skoku oznacza, że komputery z tej sieci są bezpośrednio połączone do podanego interfejsu" style="background-color:rgba(255,0,0,0.2)">10.0.1.0/24 dev br0</span> proto dhcp scope link src 10.0.1.3 metric 3 | ||
+ | 10.0.2.0/24 via 10.0.1.254 dev br0 | ||
+ | 10.0.3.0/24 via 10.0.1.254 dev br0 metric 200 <span title="Przykład dodatkowej opcji trasy" style="background-color:rgba(0,0,0,0.1)">mtu 1480</span> | ||
+ | <span title="Przykład specjalnego typu trasy (tutaj: zaznaczenie, że tych adresów nie ma w sieci)" style="background-color:rgba(0,0,0,0.1)">blackhole 10.0.4.0/24</span> | ||
+ | |||
+ | <b>/ # route -n</b> | ||
+ | Kernel IP routing table | ||
+ | Destination Gateway Genmask Flags Metric Ref Use Iface | ||
+ | <span title="Trasa domyślna" style="background-color:rgba(0,255,0,0.2)">0.0.0.0</span> 10.0.1.2 0.0.0.0 UG 3 0 0 br0 | ||
+ | <span title="Cel trasy - sieć lub komputer 10.0.0.0, w zależności od maski podanej dalej" style="background-color:rgba(0,255,0,0.2)">10.0.0.0</span> 10.0.1.1 <span title="Maska adresu docelowego – w tym przypadku /24, czyli jest to adres do sieci" style="background-color:rgba(0,255,0,0.2)">255.255.255.0</span> UG 3 0 0 br0 | ||
+ | 10.0.1.0 <span title="Brak adresu następnego skoku oznacza sieć bezpośrednio połączoną" style="background-color:rgba(255,0,0,0.2)">0.0.0.0</span> 255.255.255.0 U 3 0 0 br0 | ||
+ | 10.0.2.0 <span title="Adres następnego skoku" style="background-color:rgba(255,0,0,0.2)">10.0.1.254</span> 255.255.255.0 UG 0 0 0 br0 | ||
+ | 10.0.3.0 10.0.1.254 255.255.255.0 UG 200 0 0 br0 | ||
+ | 10.0.4.0 0.0.0.0 255.255.255.0 U 0 0 0 * | ||
+ | |||
+ | <b>/ # ip route get 10.0.1.2</b> | ||
+ | 10.0.1.2 dev br0 src 10.0.1.3 uid 1000 | ||
+ | cache | ||
+ | |||
+ | <b>/ # ip route get 10.0.0.1</b> | ||
+ | 10.0.0.1 via 10.0.1.1 dev br0 src 10.0.1.3 uid 1000 | ||
+ | cache | ||
+ | |||
+ | <b>/ # ip route get 150.254.32.129</b> | ||
+ | 150.254.32.129 via 10.0.1.2 dev br0 src 10.0.1.3 uid 1000 | ||
+ | cache | ||
+ | |||
+ | <b>/ # ip route get 10.0.3.3</b> | ||
+ | 10.0.3.3 via 10.0.1.254 dev br0 src 10.0.1.3 uid 1000 | ||
+ | cache mtu 1480 | ||
+ | </pre></html> | ||
+ | ++++ | ||
===== Polityka systemu względem ruchu przechodzącego ===== | ===== Polityka systemu względem ruchu przechodzącego ===== | ||
- | Domyślnie Linux nie pozwala na przekazywanie (forward) pakietów. Aby zmienić to zachowanie, należy wykonać:\\ | + | Domyślnie Linux **nie** pozwala na przekazywanie (forward) pakietów. \\ |
- | ''sysctl net.ipv4.conf.all.forwarding=1''\\ | + | Aby zmienić to zachowanie, należy zmienić parametry jądra wykonując jedno z: |
- | <html><small></html>lista dostępnych zmiennych - ''sysctl -a -r 'net\.ipv.\.conf\..*\.forwarding' '' \\ więcej informacji - ''man 8 sysctl'' i ''man 7 ip''<html></small></html>\\ | + | * ''sysctl net.ipv4.conf.all.forwarding=1'' \\ <html><small></html>lista dostępnych zmiennych: ''sysctl -a -r 'ip.*\.forwarding' '' \\ więcej informacji: ''man 8 sysctl'' oraz ''man 7 ip''<html></small></html> |
- | albo starsze ''sysctl net.ipv4.ip_forward=1'' | + | * albo starsze: \\ ''sysctl net.ipv4.ip_forward=1'' |
- | Można też skorzystać z katalogu /proc | + | Można też skorzystać z katalogu /proc: |
- | ''echo 1 > /proc/sys/net/ipv4/ip_forward'' | + | * ''echo 1 > /proc/sys/net/ipv4/conf/all/forwarding'' |
+ | * ''echo 1 > /proc/sys/net/ipv4/ip_forward'' | ||
- | <html><small>Dodatkowo na większości produkcyjnych systemów firewall domyślnie zabrania na przepuszczanie ruchu</small></html> | + | <html><small>Ponadto na większości produkcyjnych systemów firewall domyślnie zabrania na przepuszczanie ruchu</small></html> |
===== Narzędzia związane z trasowaniem w systemie Linux ===== | ===== Narzędzia związane z trasowaniem w systemie Linux ===== | ||
+ | iproute: | ||
| Dodanie trasy | ''ip route add <//addr//>/<//mask//> [via <//addr//>] [dev <//ifname//>]'' | | | Dodanie trasy | ''ip route add <//addr//>/<//mask//> [via <//addr//>] [dev <//ifname//>]'' | | ||
| Dodanie trasy przez następny skok | ''ip route add <//addr//>/<//mask//> via <//addr//>'' \\ np.: ''ip r add 192.168.5.0/24 via 192.168.0.254'' | | | Dodanie trasy przez następny skok | ''ip route add <//addr//>/<//mask//> via <//addr//>'' \\ np.: ''ip r add 192.168.5.0/24 via 192.168.0.254'' | | ||
- | | Dodanie trasy przez urządzenie | ''ip route add <//addr//>/<//mask//> dev <//ifname//>'' \\ np.: ''ip r add 192.168.6.0/24 dev tun0'' | | + | | <html><small></html> Dodanie trasy przez urządzenie <html></small></html>|<html><small></html> ''ip route add <//addr//>/<//mask//> dev <//ifname//>'' \\ np.: ''ip r add 192.168.6.0/24 dev tun0'' <html></small></html>| |
| Dodanie trasy domyślnej | ''ip route add default via <//następny skok//> [dev <//urządzenie//>]'' \\ np.: ''ip r add default via 192.168.0.1'' | | | Dodanie trasy domyślnej | ''ip route add default via <//następny skok//> [dev <//urządzenie//>]'' \\ np.: ''ip r add default via 192.168.0.1'' | | ||
| Usunięcie trasy | ''ip route del <//specyfkacja trasy//>'' \\ np.: ''ip r del 192.168.5.0/24 via 192.168.0.254'' | | | Usunięcie trasy | ''ip route del <//specyfkacja trasy//>'' \\ np.: ''ip r del 192.168.5.0/24 via 192.168.0.254'' | | ||
- | | Usunięcie całej tablicy routinug | ''ip route flush'' | | + | | Usunięcie całej tablicy routinug | ''ip route flush'' \\ <html><small>Uwaga! Usuwa też trasy do bezpośrednio połączonych sieci.</small></html> | |
- | Trasa może definiować zarówno urządzenie jak i adres następnego skoku. | + | route: |
+ | | Dodanie trasy | ''route add [-net|-host] <//cel//> [netmask <//maska//>] [gw <//brama//>] [dev <//ifname//>]'' , np. \\ ''route add -net 192.168.5.0 [netmask 255.255.255.0] gw 192.168.0.254'' | | ||
+ | | Usunięcie trasy | ''route del [-net|-host] <//cel//> [netmask <//maska//>] [gw <//brama//>] [dev <//ifname//>]'' , np. \\ ''route del -net 192.168.5.0 [netmask 255.255.255.0] gw 192.168.0.254'' | | ||
+ | | Dodanie trasy domyślnej | ''route add default [gw <//brama//>] [dev <//ifname//>]'', np: \\ ''route add default gw 192.168.0.1'' \\ <html><small>Uwaga! Starsze wersje nie znają słowa kluczowego default, trzeba ustawiać trasę do 0.0.0.0/0 </small></html> | | ||
- | Podanie samego urządzenia starczy tylko w specjalnych przypadkach, takich jak np. sieć bezpośrednio połączona. | + | Trasa może definiować jednocześnie adres następnego skoku i urządzenie. \\ |
+ | Podanie samego urządzenia starczy **tylko** w specjalnych przypadkach, takich jak np. sieć bezpośrednio połączona. | ||
- | Przy definiowaniu trasy można podać też inne opcje mające wpływ na wybór trasy (''metric, src, mtu'') jak i też na sposób wysyłania nią pakietów (np. opcje TCP). | + | Przy definiowaniu trasy można podać też inne opcje mające wpływ na wybór trasy (''metric, src'') jak i też na sposób wysyłania nią pakietów (np. ''mtu'', opcje TCP). |
- | Pomoc: ''man route '' / '' man ip-route'' | + | Pomoc: ''man route'' / '' man ip-route'' |
Narzędzia do sprawdzania trasy pakietu: | Narzędzia do sprawdzania trasy pakietu: | ||
Linia 85: | Linia 137: | ||
''ip r a blackhole 10.0.0.0/8'' \\ | ''ip r a blackhole 10.0.0.0/8'' \\ | ||
''ip r a unreachable 10.0.0.0/8'' \\ | ''ip r a unreachable 10.0.0.0/8'' \\ | ||
- | (zamiast takich tras zaleca się stosowanie firewalla) | ||
<html></small></html> | <html></small></html> | ||
**[[http://www.cs.put.poznan.pl/mlibuda/routing_stat_Linux.pdf|Slajdy]]** | **[[http://www.cs.put.poznan.pl/mlibuda/routing_stat_Linux.pdf|Slajdy]]** | ||
- | ===== Appendix: Komendy dla Windowsa ===== | + | ===== [Ekstra] Wybrane mechanizmy odrzucające nielogiczne pakiety w Linuksie ===== |
+ | |||
+ | Linux, widząc pakiet wysłany z adresu A i wchodzący na interfejs If sprawdza, czy zna trasę do nadawcy A (2) i czy trasa do A jest przez interfejs If (1). Jeśli nie jest spełnione (2) lub (1), to pakiet jest odrzucany o ile zmienna jądra ''rp_filter'' ma wartość odpowiednio 2 lub 1. | ||
+ | \\ | ||
+ | Aby wyłączyć to zachowanie, należy: | ||
+ | sysctl net.ipv4.conf.all.rp_filter=0 | ||
+ | sysctl net.ipv4.conf.p4p1.rp_filter=0 | ||
+ | sysctl net.ipv4.conf.p4p2.rp_filter=0 | ||
+ | |||
+ | Linux, widząc pakiet od adresu A wchodzący na interfejs I sprawdza, czy nie ma ustawionego adresu A na którymś ze swoich interfejsów (czyli: czy ktoś się pod niego nie podszywa). Jeśli tak jest, pakiet jest odrzucany o ile zmienna ''accept_local'' nie jest włączona.\\ | ||
+ | Aby wyłączyć to zachowanie, należy: | ||
+ | sysctl net.ipv4.conf.p4p1.accept_local=1 | ||
+ | sysctl net.ipv4.conf.p4p2.accept_local=1 | ||
+ | |||
+ | Dokładny opis: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt | ||
+ | ===== [Ekstra] Komendy dla Windowsa ===== | ||
* Obsługa tablicy routingu – polecenie ''route'' | * Obsługa tablicy routingu – polecenie ''route'' | ||
* Wyświetlenie tablicy tras ''route print'' | * Wyświetlenie tablicy tras ''route print'' |