sysops.it

Outsourcing IT pozwoli ci prowadzić biznes taniej

info@sysops.it
+48 666 930 111

Nowości z bloga

TCP Fast Open

Opis modyfikacji stosu TCP, która może przyspieszyć prędkość ładowania popularnych stron od 4% do 41%.

Wyszukiwarki i Sphinx

Słowo wstępu o Sphinksie - silniku wspierającym wyszukiwanie pełnotekstowe.

Kwestia IPv6 NAT w Linuksie

IPv6 NAT w Linuksie - walka ideologii z rzeczywistością.

IPv6 i wybór adresu źródłowego

Adres źródłowy

W przypadku IPv4 sytuacja wyboru adresu źródłowego (SRC) wydaje się dość jasna. Natomiast w przypadku IPv6, gdy dopuszczalne jest przypisywanie do interfejsu wielu adresów różnego typu z „zachodzącymi” na siebie prefiksami bez oznaczania ich jako „primary” czy „secondary”, sprawy się komplikują. Generalnie wybór adresu źródłowego został zdefiniowany w RFC 3484 (Default Address Selection for Internet Protocol version 6) i jego implementacje realizuje kernel linuksa.

Czasami zachodzi jednak potrzeba ścisłego określenia adresu źródłowego IPv6, więc jak można na to wpłynąć?

Metoda nr 1

Algorytm wyboru SRC adresu IPv6 zakłada budowanie listy potencjalnych kandydatów, a następnie sprawdzenie kolejnych reguł:

  1. Prefer same address. (i.e. destination is local machine)
  2. Prefer appropriate scope. (i.e. smallest scope shared with the destination)
  3. Avoid deprecated addresses.
  4. Prefer home addresses.
  5. Prefer outgoing interface. (i.e. prefer an address on the interface we're sending out of).
  6. Prefer matching label.
  7. Prefer public addresses.
  8. Use longest matching prefix.

Jeżeli żadna z reguł nie zostanie przypasowana, kernel linuksa jako SRC adres wybierze ostatni z dodanych adresów.

Żeby wpłynąć na wybór SRC adresu należy więc sprawić, by zadziałała któraś z ww. reguł. Rozwiązaniem może być oznaczenie „niechcianego” SRC adresu jako „deprecated”, powodując zadziałanie reguly nr 3.

Oznaczenie adresu jako „deprecated” w linuksie mozliwe jest poprzez ustawienie flagi preferred_lft na 0. Oznaczenie adresu jako „deprecated” nie oznacza, że jest niepoprawny, tj. cały czas możliwe jest odbieranie pakietów zaadresowanych do tego adresu.

Zmiana flagi preferred_lft dla adresu, który jest już przypisany do interfejsu.

user@testhost:~# ip -6 address show dev eth0 7: eth0: mtu 1500 qlen 1000 inet6 2a02:25a8::59a1:fd62/128 scope global valid_lft forever preferred_lft forever inet6 2a02:25a8::59a1:fd61/128 scope global valid_lft forever preferred_lft forever inet6 2a02:25a8:1::11:333/64 scope global valid_lft forever preferred_lft forever inet6 fe80::a8ad:7bff:feaf:c01/64 scope link valid_lft forever preferred_lft forever

user@testhost:~# curl -s http://www.my-ip6.com/ | grep 'Your IP address is' Your IP address is: 2a02:25a8::59a1:fd62 and you are using IPv6

user@testhost:~# ip -6 addr change 2a02:25a8::59a1:fd62 dev eth0 preferred_lft 0

user@testhost:~# curl -s http://www.my-ip6.com/ | grep 'Your IP address is' Your IP address is: 2a02:25a8::59a1:fd61 and you are using IPv6

user@testhost:~# ip -6 address show dev eth0 7: eth0: mtu 1500 qlen 1000 inet6 2a02:25a8::59a1:fd62/128 scope global deprecated valid_lft forever preferred_lft forever inet6 2a02:25a8::59a1:fd61/128 scope global valid_lft forever preferred_lft forever inet6 2a02:25a8:1::11:333/64 scope global valid_lft forever preferred_lft forever inet6 fe80::a8ad:7bff:feaf:c01/64 scope link valid_lft forever preferred_lft forever

Metoda nr 2

Istnieje możliwość wykorzystania konfigurowalnej tabeli preferencji SRC adresów. W linuksie dostępna jest po wydaniu polecenia:

user@testhost:~# ip addrlabel show prefix ::1/128 label 0 prefix ::/96 label 3 prefix ::ffff:0.0.0.0/96 label 4 prefix 2001::/32 label 6 prefix 2001:10::/28 label 7 prefix 2002::/16 label 2 prefix fc00::/7 label 5 prefix ::/0 label 1

Kluczowym elementem tej tabeli jest parametr label. Prefiksy z niższą wartością label mają wyższą preferencję podczas wyboru SRC adresu. Dla przykładu prefiks ::1 jest najbardziej preferowany, gdy tylko zostanie dopasowany do adresu.

user@testhost:~# ip -6 address show dev eth0 7: eth0: mtu 1500 qlen 1000 inet6 2a02:25a8::59a1:fd61/128 scope global valid_lft forever preferred_lft forever inet6 2a02:25a8:1::11:333/64 scope global valid_lft forever preferred_lft forever inet6 fe80::a8ad:7bff:feaf:c01/64 scope link valid_lft forever preferred_lft forever

user@testhost:~# curl -s http://www.my-ip6.com/ | grep 'Your IP address is' Your IP address is: 2a02:25a8::59a1:fd61 and you are using IPv6

user@testhost:~# ip addrlabel add prefix 2a02:25a8::59a1:fd61/128 label 8

user@testhost:~# curl -s http://www.my-ip6.com/ | grep 'Your IP address is' Your IP address is: 2a02:25a8:1::11:333 and you are using IPv6

user@testhost:~# ip addrlabel show prefix 2a02:25a8::59a1:fd61/128 label 8 prefix ::1/128 label 0 prefix ::/96 label 3 prefix ::ffff:0.0.0.0/96 label 4 prefix 2001::/32 label 6 prefix 2001:10::/28 label 7 prefix 2002::/16 label 2 prefix fc00::/7 label 5 prefix ::/0 label 1

Nadanie wartości label 8 dla adresu, który wcześniej wybrany został na SRC, spowodowało, że jego preferencja została obniżona, co w efekcie doprowadziło do wyboru innego adresu.

IPv6
Dodano dn. 13 września 2012 roku przez rob.