Dydaktyka:
FeedbackTo jest stara wersja strony!
Warstwa łącza danych zapewnia komunikację między bezpośrednio połączonymi urządzeniami.
Warstwa sieci zapewnia komunikację między dowolnymi urządzeniami.
Wiadomości na warstwie sieci nazywa się pakietami.
Urządzenia warstwy sieci to trasowniki (routery).
IPv4 = Internet Protocol version 4
(RFC 791); czasami skracane do inet
IPv6 = Internet Protocol version 6
(RFC 82001));
czasami skracane do inet6
Pole opcje w IPv4 pozwala dodawać kolejne informacje do nagłówka IPv4.
W IPv6 zamiast tego po nagłówku IPv6 może znajdować się nagłówek z kolejnymi informacjami:
Pole protokół w nagłówku IPv4 lub następny nagłówek w ostatnim nagłówku
IPv6 wskazuje który protokół warstwy transportu jest w danych pakietu.
Numery protokołów są powszechnie znanie – patrz http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
lub less /etc/protocols
.
Rozmiar pakietów IP jest ograniczany przez MTU warstwy niższej. Żeby przesłać
porcję danych większą niż ten maksymalny rozmiar pakietu, dane trzeba podzielić
na fragmenty, przesłać każdy z nich w osobnym pakiecie i złożyć u odbiorcy.
Pakiety przenoszące fragmenty tej samej wiadomości warstwy transportu mają ten
sam identyfikator i odpowiednią pozycję fragmentu (offset).
Poza ostatnim, fragmenty mają we flagach ustawiony bit więcej fragmentów (MF).
W IPv4 fragmentację może wykonać każde urządzenie na drodze pakietu, w IPv6
tylko nadawca. IPv4 w polu flag ma bit zabraniający fragmentacji (DF)
Fragmentacji, o ile to możliwe, należy unikać – często prowadzi do
nieoptymalnego wykorzystania sieci.
Dla przetestowania fragmentacji można wykorzystać komendę ping
, dodając
przełącznik ping -s <rozmiar>
, np:
ping -s 5000 150.254.32.65
ping -s 5000 2001:808:201:100::1
Żeby w powstałej na skutek błędnej konfiguracji sieci pakiet nie krążył w nieskończoność, każde urządzenie warstwy sieci zmniejsza o jeden wartość pola TTL / hop limit. Gdy ta wartość spadnie do 0, pakiet nie jest dalej przekazywany.
Protokół IP nie przewiduje informowania nadawcy o problemach.
Funkcje diagnostyczne i kontrolne dla IP spełnia protokół ICMP (Internet Control
Message Protocol). ICMP różni się w szczegółach między wersją dla
IPv4 (ICMP)
i dla IPv6 (ICMPv6).
ICMPv6 spełnia też dodatkowe funkcje (o których będzie osobno później).
ICMP/v6 pozwala między innymi na:
Aby zaobserwować komunikaty ICMP, można wykonać:
ping <cel>
traceroute [-q 1] -T <cel>
(porównaj z traceroute -I <cel>
)ping -s 1440 2001:470:647b::1
(przed ponownym uruchomieniem wykonaj ip -6 r flush cache
)host pl. lab-net-1
(z lab-net)host pl. lab-sec-33
(z lab-net)
Do zarządzania przynależnością do grup multicastowych w IPv4 służy protokół
IGMP.
W IPv6 to samo zadanie włączono w protokół ICMPv6 (pod nazwą MLD).
Używając wiadomości protokołu IGMP/ICMPv6 urządzenie można ogłosić informację że
chce otrzymywać wiadomości wysłane na konkretne multicastowe adresy IP.
Odpowiednio ustawione routery mogą przekazywać dalej te informacje (i wybrane
pakiety multicastowe), a switche podsłuchują (IGMP snooping)
wymiany wiadomości IGMP/ICMPv6 żeby wiedzieć na które porty warto wysyłać
wiadomości multicastowe.
Wyświetlenie grup do których należy komputer [IP]: netstat -g
/ ip maddr
Wyświetlenie grup do których należy komputer [MAC]: cat /proc/net/igmp
i cat /proc/net/igmp6
/ ip maddr
Oczekiwanie na wiadomość multicastową na adresie IPv4 można zasymulować przez: socat udp4-recv:0,ip-add-membership=239.1.2.3:br0 -
Oczekiwanie na wiadomość multicastową na adresie IPv6 można zasymulować przez: socat udp6-recv:0,ipv6-join-group=[ff05::ace]:br0 -
# netstat -ng IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- br0 1 224.0.0.251 br0 1 224.0.0.1 # ip maddr 4: br0 link 01:00:5e:00:00:01 link 01:00:5e:00:00:fb inet 224.0.0.1 inet 224.0.0.251 # cat /proc/net/igmp Idx Device : Count Querier Group Users Timer Reporter 3 br0 : 2 V3 FB0000E0 1 0:00000000 0 010000E0 1 0:00000000 0
Zadaniem warstwy sieci jest dostarczenie danych do dowolnego wskazanego
urządzenia w sieci.
Jeśli cel nie jest bezpośrednio połączony, dane (pakiety) trzeba wysłać do
wybranego z bezpośrednich sąsiadów.
Zauważ że adres źródłowy i docelowy warstwy sieci (adres IP) zostaje bez zmian od źródła do celu, a adres źródłowy i docelowy warstwy łącza danych (adres MAC) jest ustawiany na nowo przez każde kolejne urządzenie.
Trasowanie (routing) to wyznaczenie następnego urządzenia do którego
zostanie wysłany pakiet.
Na każdym urządzeniu wyznaczany jest adres IP następnego skoku i interfejs
którym pakiet zostanie wysłany (nigdy cała trasa).
Urządzenia podejmują decyzję dokąd dalej wysłać pakiet na podstawie tablicy tras (routing table).
Tablicę tras można zbudować ręcznie (trasowanie statyczne), lub skonfigurować i uruchomić protokół trasowania dynamicznego który automatycznie zbuduje taką tablicę.
Tablica tras to lista wpisów na które składają się przynajmniej:
Przykład tablicy tras w Linuksie:
default via 150.254.32.65 dev br0 proto dhcp 10.0.0.0/8 via 150.254.32.126 dev br0 10.3.0.0/16 via 150.254.32.65 dev br0 10.8.0.0/16 via 172.16.0.1 dev enp1s0 metric 100 10.8.0.0/16 via 150.254.32.88 dev br0 metric 200 150.254.32.64/26 dev br0 proto kernel scope link src 150.254.32.75 172.16.0.0/16 dev enp1s0 proto kernel scope link src 172.16.0.10 172.18.0.0/16 dev enp1s0 scope link
Schemat wyboru trasy:
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/28 via 172.16.0.28 dev eth2
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
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
tu zawsze wybrana jest trasa przez 150.254.44.149, jako ta o niższym koszcie
default via 150.254.44.1 dev wlan0 default via 150.254.130.42 dev eth0
Zwykle definiuje się w tablicy tras trasę domyślną.
Czasami 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
Narzędzia route
(net-tools) i ip route
(iproute2)
Wypisanie trasy (uwaga, komendy wypisują zwykle osobno trasy do IPv4 i IPv6):
route [-6]
ip [-6] route [list|show]
ip route show table all
pokaże wszystkie trasy narazSprawdzenie adresu następnego skoku do podanego adresu docelowego:
ip route get <addr>
/ # ip route default via 10.0.1.2 dev br0 proto dhcp src 10.0.1.3 metric 3 10.0.0.0/24 via 10.0.1.1 dev br0 proto dhcp src 10.0.1.3 metric 3 10.0.1.0/24 dev br0 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 mtu 1480 blackhole 10.0.4.0/24 / # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.1.2 0.0.0.0 UG 3 0 0 br0 10.0.0.0 10.0.1.1 255.255.255.0 UG 3 0 0 br0 10.0.1.0 0.0.0.0 255.255.255.0 U 3 0 0 br0 10.0.2.0 10.0.1.254 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 * / # ip route get 10.0.1.2 10.0.1.2 dev br0 src 10.0.1.3 uid 1000 cache / # ip route get 10.0.0.1 10.0.0.1 via 10.0.1.1 dev br0 src 10.0.1.3 uid 1000 cache / # ip route get 150.254.32.129 150.254.32.129 via 10.0.1.2 dev br0 src 10.0.1.3 uid 1000 cache / # ip route get 10.0.3.3 10.0.3.3 via 10.0.1.254 dev br0 src 10.0.1.3 uid 1000 cache mtu 1480
Domyślnie Linux nie pozwala na przekazywanie pakietów (packet forwarding).
Aby zmienić to zachowanie, należy zmienić parametry jądra wykonując jedno z:
sysctl net.ipv4.conf.all.forwarding=1
sysctl -a -r 'ip.*\.forwarding'
man 8 sysctl
oraz man 7 ip
sysctl net.ipv4.ip_forward=1
Można też skorzystać z katalogu /proc:
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
Ponadto na większości produkcyjnych systemów firewall domyślnie zabrania na przepuszczanie ruchu
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 urządzenie | ip route add <addr>/<mask> dev <ifname> np.: ip r add 192.168.6.0/24 dev tun0 |
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 całej tablicy routinug | ip route flush Uwaga! Usuwa też trasy do bezpośrednio połączonych sieci. |
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 Uwaga! Starsze wersje nie znają słowa kluczowego default, trzeba ustawiać trasę do 0.0.0.0/0 |
Komendy ustawiające trasy IPv4 i IPv6 są identyczne, przykłady są tylko dla IPv4 dla zwięzłości materiałów.
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
) jak i też na sposób wysyłania nią pakietów (np. mtu
,
opcje TCP).
W Linuksie istnieją specjalne pseudo-trasy odrzucające pakiety –
throw
, unreachable
, prohibit
, blackhole
, np:
ip r a blackhole 10.0.0.0/8
ip r a unreachable 10.0.0.0/8
route
(uwaga, wsparcie tylko dla IPv4)route print
route add <SIEĆ> mask <MASKA> <NEXT_HOP>
route add 192.168.1.0 mask 255.255.255.0 10.0.0.1
route delete <SIEĆ>
tracert
1
typu DWORD do HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter