TRT kann unter Linux mit Hilfe des TRT-Servers pTRTd (Portable Transport Relay Translator Daemon) sowie des DNS-Proxy totd (Trick or Treat Daemon), welcher als DNS-ALG agiert, realisiert werden. Als Grundlage für die Konfiguration dient das TRT-Howto (19).
Es wird ein ähnliches Netzwerk wie für den NAT-PT-Versuch aufgebaut, allerdings wird der Linux PC 1 als Router eingesetzt und der Windows 2003 PC dient als DNS-Server (Abb. 9.1). Auf dem Linux-Router laufen ausserdem der TRT-Server als auch der DNS-ALG.
Der DNS-ALG muss nicht zwingend auf der gleichen Maschine wie der TRT-Server laufen, er könnte auch auf einem IPv6-Only-Host im Subnetz B beheimatet sein. In diesem Fall müsste allerdings auch ein per IPv6 erreichbarer DNS-Server vorhanden sein, welcher auch Anfragen nach (IPv4-) A-Records beantwortet.
Im in Abbildung 9.1 gezeigten Setup stellt der DNS-ALG die umgesetzten DNS-Anfragen über IPv4 an den Windows 2003 DNS-Server.
Für den totd ist kein Debian-Paket verfügbar, dieser muss daher aus dem Quellpaket installiert werden. Dazu sind folgende Schritte vorzunehmen:
# tar xvzf totd-latest.tar.gz # cd totd-1.4 # ./configure # make # make install
Es kann sein, dass bei make install bei der Installation der man-Page ein Fehler invalid group `wheel' auftritt, dieser Fehler ist nicht kritisch und wirkt sich nicht auf die Funktionsfähigkeit des totd aus.
forwarder 10.0.1.30 prefix fec1::
Auch der pTRTd muss aus dem Quellpaket installiert werden, da kein fertiges Debian-Paket für Debian 3.0 existiert:
# tar xvzf ptrtd-0.5.2.tar.gz # cd ptrtd-0.5.2 # ./configure # make # make install
# /usr/local/sbin/ptrtd -p fec1:: -l 96 registering driver tun registering driver tap registering driver 802ip registering driver uml_sw using prefix fec1:0:0:0:0:0:0:0 \textbf{tuntap open: No such device}
In diesem Fall fehlt die Unterstützung und das tun-Modul muss erst kompiliert und installiert werden (siehe Kapitel 9.2.3). Andernfalls ist alles in Ordnung und es kann direkt zur Zebra-Konfiguration übergegangen werden (Kapitel 9.2.4).
Als erstes muss die Kernel-Konfiguration angepasst werden:
# cd /usr/src/usagi/kernel/linux24 # make menuconfig
Im Abschnitt Network device support muss der Universal TUN/TAP device driver support als Modul ausgewählt werden (vgl. Abb. 9.2). Anschliessend können die Module mit make modules && make modules_install kompiliert und installiert werden.
Schliesslich muss unter Umständen noch das tun-Device-File kreiert und mit den korrekten Berechtigungen versehen werden:
# mkdir /dev/net # mknod /dev/net/tun c 10 200 # chmod 0700 /dev/net/tun
In der Datei /etc/modules.conf muss eine Zeile alias char-major-10-200 tun vorhanden sein, damit das Modul bei Bedarf automatisch geladen wird.
In diesem Versuch übernimmt Zebra das Routing-Advertisement im IPv6-Netz und setzt beim Start die IP-Adressen und die Routing-Einträge. In /etc/zebra/daemons sollte nur der zebrad gestartet werden, alle anderen Einträge werden auf no geändert. Die zebra.conf sieht wie folgt aus:
interface eth0 ipv6 address fec0::1/64 ipv6 nd send-ra ipv6 nd prefix-advertisement fec0::/64 interface eth1 ip address 10.0.1.3/24
Auf dem zweiten Linux-PC muss der Linux-Router als DNS eingetragen werden:
nameserver fec0::1
Die IPv6-Adresse und die Routing-Information erhält er per Autokonfiguration.
Der DNS-Server muss den Namen des Webservers www.ipv6.local sowohl vorwärts (Abb. 9.3) als auch rückwärts (Abb. 9.4) auflösen. Diese Konfiguration erfolgt über die Management Konsole (mmc).
Auf dem Linux-Router müssen zebra, totd und pTRTd gestartet werden:
# /etc/init.d/zebra start # /usr/local/sbin/totd -c /etc/totd.conf -d2 # /usr/local/sbin/ptrtd -p fec1:: -l 96
Der pTRTd nimmt beim Start automatisch das tap0-Device in Betrieb, welches eine virtuelle Ethernet-Schnittstelle darstellt:
# ip addr show dev tap0 14: \textbf{tap0}: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 link/ether 00:ff:19:d9:7c:7a brd ff:ff:ff:ff:ff:ff inet6 fe80::1/64 scope link inet6 fe80::2ff:19ff:fed9:7c7a/64 scope link
Das Routing passt er ebenfalls an, so dass nun das Netz fec1::/96 über das tap0-Interface geroutet wird:
# ip -6 route show fe80::/64 dev eth1 proto kernel metric 256 mtu 1500 advmss 1440 fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 fe80::/64 dev tap0 proto kernel metric 256 mtu 1500 advmss 1440 fec0::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 \textbf{fec1::/96 via fe80::5 dev tap0 metric 1024 mtu 1500 advmss 1440} ff00::/8 dev eth1 proto kernel metric 256 mtu 1500 advmss 1440 ff00::/8 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 ff00::/8 dev tap0 proto kernel metric 256 mtu 1500 advmss 1440
Die Gateway-Adresse fe80::5 ist die Adresse des pTRTd am anderen Ende des virtuellen Interfaces und ist wie ein normaler Nachbar sichtbar:
# ip -6 neigh show dev tap0 \textbf{fe80::5} dev tap0 lladdr 02:00:12:34:56:78 nud reachable
Auf dem Windows 2003 PC muss der DNS aktiv sein und auf dem iBook der Webserver gestartet sein. Danach wird vom Linux PC 2 aus eine HTTP-Session zum Webserver www.ipv6.local aufgebaut.
Der Ablauf ist ähnlich wie bei NAT-PT (Abb. 9.5). Der Linux-Client sendet eine DNS-Anfrage nach einem AAAA-Record an den DNS-ALG. Der totd nimmt diese Anfrage entgegen und reicht sie an den IPv4-DNS weiter. Den A-Record, den er zurückerhält, ersetzt er durch einen AAAA-Record, der die IPv4-Adresse mit dem vorgegebenen TRT-Präfix fec1::/96 vorangestellt enthält, in diesem Fall also fec1::a00:11f.
Der TRT-Server kommt erst ins Spiel, wenn die TCP-Verbindung aufgebaut wird. Der Client macht einen Verbindungsaufbau zu fec1::10.0.1.31. Der TRT-Server nimmt diese Verbindung entgegen und baut seinerseits über IPv4 eine Verbindung zu 10.0.1.31 auf. Dass es sich tatsächlich um zwei verschiedene TCP-Verbindungen handelt, ist an den unterschiedlichen Sequenznummern und den verschiedenen TCP-Source-Ports zu erkennen.
Domain Name System (query) Transaction ID: 0x07f9 Flags: 0x0100 (Standard query) 0... .... .... .... = Response: Message is a query .000 0... .... .... = Opcode: Standard query (0) .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... ...0 .... = Non-authenticated data OK: Non-authenticated data is unacceptable Questions: 1 Answer RRs: 0 Authority RRs: 0 Additional RRs: 0 Queries www.ipv6.local: type AAAA, class inet Name: www.ipv6.local Type: IPv6 address Class: inet
Domain Name System (query) Transaction ID: 0xb23c Flags: 0x0100 (Standard query) 0... .... .... .... = Response: Message is a query .000 0... .... .... = Opcode: Standard query (0) .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... ...0 .... = Non-authenticated data OK: Non-authenticated data is unacceptable Questions: 1 Answer RRs: 0 Authority RRs: 0 Additional RRs: 0 Queries www.ipv6.local: type AAAA, class inet Name: www.ipv6.local Type: IPv6 address Class: inet
Domain Name System (response) Transaction ID: 0xb23c Flags: 0x8580 (Standard query response, No error) 1... .... .... .... = Response: Message is a response .000 0... .... .... = Opcode: Standard query (0) .... .1.. .... .... = Authoritative: Server is an authority for domain .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... 1... .... = Recursion available: Server can do recursive queries .... .... ..0. .... = Answer auth.: Answer/authority portion was not authenticated by the server .... .... .... 0000 = Reply code: No error (0) Questions: 1 Answer RRs: 0 Authority RRs: 1 Additional RRs: 0 Queries www.ipv6.local: type AAAA, class inet Name: www.ipv6.local Type: IPv6 address Class: inet Authoritative nameservers ipv6.local: type SOA, class inet, mname ipv6-4 Name: ipv6.local Type: Start of zone of authority Class: inet Time to live: 1 hour Data length: 40 Primary name server: ipv6-4 Responsible authority's mailbox: hostmaster Serial number: 2 Refresh interval: 15 minutes Retry interval: 10 minutes Expiration limit: 1 day Minimum TTL: 1 hour
Domain Name System (query) Transaction ID: 0xb33c Flags: 0x0100 (Standard query) 0... .... .... .... = Response: Message is a query .000 0... .... .... = Opcode: Standard query (0) .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... ...0 .... = Non-authenticated data OK: Non-authenticated data is unacceptable Questions: 1 Answer RRs: 0 Authority RRs: 0 Additional RRs: 0 Queries www.ipv6.local: type A, class inet Name: www.ipv6.local Type: Host address Class: inet
Domain Name System (response) Transaction ID: 0xb33c Flags: 0x8580 (Standard query response, No error) 1... .... .... .... = Response: Message is a response .000 0... .... .... = Opcode: Standard query (0) .... .1.. .... .... = Authoritative: Server is an authority for domain .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... 1... .... = Recursion available: Server can do recursive queries .... .... ..0. .... = Answer auth.: Answer/authority portion was not authenticated by the server .... .... .... 0000 = Reply code: No error (0) Questions: 1 Answer RRs: 1 Authority RRs: 0 Additional RRs: 0 Queries www.ipv6.local: type A, class inet Name: www.ipv6.local Type: Host address Class: inet Answers www.ipv6.local: type A, class inet, addr 10.0.1.31 Name: www.ipv6.local Type: Host address Class: inet Time to live: 1 hour Data length: 4 Addr: 10.0.1.31
Domain Name System (response) Transaction ID: 0x07f9 Flags: 0x8580 (Standard query response, No error) 1... .... .... .... = Response: Message is a response .000 0... .... .... = Opcode: Standard query (0) .... .1.. .... .... = Authoritative: Server is an authority for domain .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... 1... .... = Recursion available: Server can do recursive queries .... .... ..0. .... = Answer auth.: Answer/authority portion was not authenticated by the server .... .... .... 0000 = Reply code: No error (0) Questions: 1 Answer RRs: 1 Authority RRs: 0 Additional RRs: 0 Queries www.ipv6.local: type AAAA, class inet Name: www.ipv6.local Type: IPv6 address Class: inet Answers www.ipv6.local: type AAAA, class inet, addr fec1::a00:11f Name: www.ipv6.local Type: IPv6 address Class: inet Time to live: 1 hour Data length: 16 Addr: fec1::a00:11f
Domain Name System (query) Transaction ID: 0x07fb Flags: 0x0100 (Standard query) 0... .... .... .... = Response: Message is a query .000 0... .... .... = Opcode: Standard query (0) .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... ...0 .... = Non-authenticated data OK: Non-authenticated data is unacceptable Questions: 1 Answer RRs: 0 Authority RRs: 0 Additional RRs: 0 Queries f.1.1.0.0.0.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.c.e.f.ip6.int: type PTR, class inet Name: f.1.1.0.0.0.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.c.e.f.ip6.int Type: Domain name pointer Class: inet
Domain Name System (query) Transaction ID: 0xb53c Flags: 0x0100 (Standard query) 0... .... .... .... = Response: Message is a query .000 0... .... .... = Opcode: Standard query (0) .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... ...0 .... = Non-authenticated data OK: Non-authenticated data is unacceptable Questions: 1 Answer RRs: 0 Authority RRs: 0 Additional RRs: 0 Queries 31.1.0.10.in-addr.arpa: type PTR, class inet Name: 31.1.0.10.in-addr.arpa Type: Domain name pointer Class: inet
Domain Name System (response) Transaction ID: 0xb53c Flags: 0x8580 (Standard query response, No error) 1... .... .... .... = Response: Message is a response .000 0... .... .... = Opcode: Standard query (0) .... .1.. .... .... = Authoritative: Server is an authority for domain .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... 1... .... = Recursion available: Server can do recursive queries .... .... ..0. .... = Answer auth.: Answer/authority portion was not authenticated by the server .... .... .... 0000 = Reply code: No error (0) Questions: 1 Answer RRs: 1 Authority RRs: 0 Additional RRs: 0 Queries 31.1.0.10.in-addr.arpa: type PTR, class inet Name: 31.1.0.10.in-addr.arpa Type: Domain name pointer Class: inet Answers 31.1.0.10.in-addr.arpa: type PTR, class inet, ptr www.ipv6.local Name: 31.1.0.10.in-addr.arpa Type: Domain name pointer Class: inet Time to live: 1 hour Data length: 16 Domain name: www.ipv6.local
Domain Name System (response) Transaction ID: 0x07fb Flags: 0x8580 (Standard query response, No error) 1... .... .... .... = Response: Message is a response .000 0... .... .... = Opcode: Standard query (0) .... .1.. .... .... = Authoritative: Server is an authority for domain .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... 1... .... = Recursion available: Server can do recursive queries .... .... ..0. .... = Answer auth.: Answer/authority portion was not authenticated by the server .... .... .... 0000 = Reply code: No error (0) Questions: 1 Answer RRs: 1 Authority RRs: 0 Additional RRs: 0 Queries f.1.1.0.0.0.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.c.e.f.ip6.int: type PTR, class inet Name: f.1.1.0.0.0.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.c.e.f.ip6.int Type: Domain name pointer Class: inet Answers f.1.1.0.0.0.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.c.e.f.ip6.int: type PTR, class inet, ptr www.ipv6.local Name: f.1.1.0.0.0.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.c.e.f.ip6.int Type: Domain name pointer Class: inet Time to live: 1 hour Data length: 16 Domain name: www.ipv6.local
Anhand der verschiedenen Sequenznummern und der unterschiedlichen Source-Ports ist gut zu erkennen, dass es sich hier um zwei eigenständige TCP-Verbindungen handelt, eine im IPv4- und eine im IPv6-Netz.
Transmission Control Protocol, Src Port: 52686 (52686), Dst Port: www (80), Seq: 2354797643, Ack: 0, Len: 0 \textbf{Source port: 52686 (52686)} Destination port: www (80) \textbf{Sequence number: 2354797643} Header length: 40 bytes Flags: 0x0002 (SYN) 0... .... = Congestion Window Reduced (CWR): Not set .0.. .... = ECN-Echo: Not set ..0. .... = Urgent: Not set ...0 .... = Acknowledgment: Not set .... 0... = Push: Not set .... .0.. = Reset: Not set .... ..1. = Syn: Set .... ...0 = Fin: Not set Window size: 5760 Checksum: 0x61e9 (correct) Options: (20 bytes) Maximum segment size: 1440 bytes SACK permitted Time stamp: tsval 69202183, tsecr 0 NOP Window scale: 0 bytes
Transmission Control Protocol, Src Port: 33693 (33693), Dst Port: www (80), Seq: 1415605631, Ack: 0, Len: 0 \textbf{Source port: 33693 (33693)} Destination port: www (80) \textbf{Sequence number: 1415605631} Header length: 40 bytes Flags: 0x0002 (SYN) 0... .... = Congestion Window Reduced (CWR): Not set .0.. .... = ECN-Echo: Not set ..0. .... = Urgent: Not set ...0 .... = Acknowledgment: Not set .... 0... = Push: Not set .... .0.. = Reset: Not set .... ..1. = Syn: Set .... ...0 = Fin: Not set Window size: 5840 Checksum: 0x1e29 (correct) Options: (20 bytes) Maximum segment size: 1460 bytes SACK permitted Time stamp: tsval 8763034, tsecr 0 NOP Window scale: 0 bytes
Transmission Control Protocol, Src Port: www (80), Dst Port: 33693 (33693), Seq: 3192154803, Ack: 1415605632, Len: 0 Source port: www (80) Destination port: 33693 (33693) \textbf{Sequence number: 3192154803} \textbf{Acknowledgement number: 1415605632} Header length: 40 bytes Flags: 0x0012 (SYN, ACK) 0... .... = Congestion Window Reduced (CWR): Not set .0.. .... = ECN-Echo: Not set ..0. .... = Urgent: Not set ...1 .... = Acknowledgment: Set .... 0... = Push: Not set .... .0.. = Reset: Not set .... ..1. = Syn: Set .... ...0 = Fin: Not set Window size: 33304 Checksum: 0xeb05 (correct) Options: (20 bytes) Maximum segment size: 1460 bytes NOP Window scale: 0 bytes NOP NOP Time stamp: tsval 3160991081, tsecr 8763034
Transmission Control Protocol, Src Port: www (80), Dst Port: 52686 (52686), Seq: 65536, Ack: 2354797644, Len: 0 Source port: www (80) \textbf{Destination port: 52686 (52686)} \textbf{Sequence number: 65536} Acknowledgement number: 2354797644 Header length: 24 bytes Flags: 0x0012 (SYN, ACK) 0... .... = Congestion Window Reduced (CWR): Not set .0.. .... = ECN-Echo: Not set ..0. .... = Urgent: Not set ...1 .... = Acknowledgment: Set .... 0... = Push: Not set .... .0.. = Reset: Not set .... ..1. = Syn: Set .... ...0 = Fin: Not set Window size: 65535 Checksum: 0xbe7d (correct) Options: (4 bytes) Maximum segment size: 1216 bytes