router bgp 64123
! nasza podsiec
network 3ffe:902:100::/48
! będziemy wysyłać wyłącznie zagregowane trasy (w tym
! wypadku będziemy wysyłać informację o routingu do całej
10Border Gateway Protocol z rozszerzeniami dla innych protokołów w tym IPv6
7
7
DNS
! naszej sieci, bez dzielenia tras na mniejsze - zmniejsza
! to obciążenie routerów BGP4+)
aggregate-address 3ffe:902:100::/48 summary-only as-set
! będziemy informować o naszych statycznych trasach
redistribute static
! 3ffe:902::1 - adres IPv6 na którym działa daemon
!
dynamicznego routingu naszego sąsiada
! 8664
- to numer ASN naszego sąsiada
neighbor 3ffe:902::1 remote-as 8664
! ICM
- symbol naszego sąsiada (będzie używany
!
m.in. w logach mrt)
neighbor 3ffe:902::1 description ICM
! bgp4+ 1
- będziemy używali BGP4+
neighbor 3ffe:902::1 bgp4+ 1
!
! Trasy statyczne, których mrt sam nie będzie zmieniał
route 3ffe:902:100::/48 :: eth0
route 3ffe:902::1/128 fe80::167.34.22.76 tunel
Informacje o aktualnych trasach, które nasz mrt otrzymuje i rozgłasza możemy zo-baczyć łącząc się przez telent z portem 5674 naszego serwera i wydając odpowiednią komendę. Mrt ma zaimplementowane kilkanaście komend wzorowanych na routerach Ci-sco opisanych w dokumentacji. Jedna z nas interesujących komend jest „show bgp”
7
DNS
Do obsługi adresów IPv6 wprowadzono nowy rekord 11 DNS jakim jest „AAAA”.
Jako przykład podam linijkę jaką należy dopisać do pliku opisującego naszą przykładową domenę:
host-ipv6 IN AAAA 3ffe:902:100::1
Dla odwrotnego DNSu sprawa nieco się komplikuje. Należy utworzyć delegację pri-mary dla domeny 0.0.1.0.2.0.9.0.e.f.f.3.ip6.int, i podać adres naszego hosta: 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN
PTR host-ipv6.nasza.domena.pl.
Ponieważ prefiks naszej podsieci składa się z 48 bitów (48/4=12 cyfr) to adres hosta musi sie składać z (128-48)/4=20 cyfr. Po delegację odwrotnego DNSu również musimy się zgłosić do osoby, która przydzieliła nam podsieć.
11Stare wersje bind-a nie obsługują tych rekordów w związku z czym konieczne staje się zak-tualizowanie serwera DNS do nowszej wersji.
8
8
APLIKACJE
Sprawdzanie DNSu jest czynnością prostą - wystarczy wykonać polecenie „host -t AAAA host-ipv6.nasza.domena.pl”:
# host -t AAAA host-ipv6.nasza.domena.pl
host-ipv6.nasza.domena.pl IPv6 address 3ffe:902:100::1
#
Sprawdzanie rDNSu jest czynnością równie prostą - tym razem użyjemy narzędzia „nslookup”:
# nslookup -query=any 1.0.0.0.0.0.0.0.0.0.0.0.0.0\
.0.0.0.0.0.0.0.0.1.0.2.0.9.0.e.f.f.3.ip6.int
[...]
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.
2.0.9.0.e.f.f.3.ip6.int name = host-ipv6.nasza.domena.pl
[...]
Uwagi: 12
8
Aplikacje
Mimo iż IPv6 nadal znajduje się w fazie eksperymentalnej to powstają aplikacje oraz łaty na już istniejące aplikacje umożliwiające im pracę z wykorzystaniem protokołu IPv6. W naszym kraju powstaje dystrybucja PLD ( Polish Linux Distribution), ma-jąca dostarczać użytkownikom aplikacje przystosowane do pracy w sieci IPv6. Aktualnie wszelkie podstawowe serwery usług w PLD wspierają IPv6 (www, e-poczta (MTA), ftp, ssh, telnet itd). Pełną listę aplikacji wspierających IPv6 w PLD znajdziesz na stronie http://www.pld.org.pl/
Osoby
chcące pisać swe programy tak, by działały z IPv6 powinny:
unikać stosowania struktur odnoszących się jedynie do określonej rodziny (czy to AF_INET czy AF_INET6) np. in_addr i in6_addr
używać getaddrinfo() i getnameinfo() gdzie tylko to możliwe
używać struktury sockaddr_storage mogącej przechowywać dane o adresach IPv4
i IPv6
Przystosowywanie aplikacji typu „finger” czy „telnet” jest proste, gdyż nie wymaga mo-dyfikacji samego protokołu aplikacji. Sprawa się komplikuje jeżeli chcemy przystosować np. klienta „ftp”. W przypadku „ftp” zostały stworzone dodatkowe rozszerzenia opisane w RFC2428 ([10]), które musielibyśmy zaimplementować.
Poniżej zamieszczam przykładowy fragment kodu programu obsługujący połączenia 12[...] - nieistotne w tym artykule informacje o nameserwerach itp.
9
8
APLIKACJE
wyłącznie IPv4 (pierwsza wersja) oraz obsługujący połączenia IPv4 oraz IPv6 (druga wersja).
Tak wygląda typowy kod obsługujący wyłącznie IPv4:
const char *conhostname;
struct hostent *conhost;
struct sockaddr_in name;
int addr_len, mysock, port;
conhost = gethostbyname(conhostname);
name.sin_port = htons(port);
name.sin_family = AF_INET;
bcopy((char *)conhost->h_addr,
(char *)&name.sin_addr,
conhost->h_length);
mysock = socket(AF_INET, SOCK_STREAM, 0);
|