// Datei: ./werkzeuge/paketquellen-und-werkzeuge/automatisiertes-auswaehlen-von-paketquellen.adoc

// Baustelle: Rohtext
// TODO: cdn.debian.net ist tot, zeigt auf http.debian.net
// TODO: http.debian.net wurde zu httpredir.debian.org
// TODO: httpredir.debian.org wurde ersetzt durch statisches deb.debian.org

[[automatisiertes-auswaehlen-von-paketquellen]]
=== Automatisiertes Auswählen von Paketquellen ===

[[dns-round-robin]]
==== DNS Round Robin ====

In den meisten Fällen gibt es zu einem Servernamen genau eine
IP-Adresse (oder je eine IPv4- und eine IPv6-Adresse). Stärker in
Anspruch genommene Dienste verteilen die Last aber oftmals auf mehr als
eine Maschine. In solchen Fällen werden gerne mehr als eine IP-Adresse
pro Servernamen zurückgegeben. Daraufhin wählt das Programm, welches
eine Verbindung aufbauen möchte, willkürlich eine der zur Auswahl
stehenden IP-Adressen aus. Auf diese Weise kann die Last zwischen
mehreren (identisch konfigurierten) Servern aufgeteilt werden.

Ein bekanntes Beispiel eines solchen Falles im Kontext von Debian
Paketspiegeln ist `ftp.us.debian.org`. Aufgrund der Größe der USA wird
die Last des dortigen primären Debian-Paketmirrors auf drei Server
aufgeteilt.

.IP-Verteilung des primären Debian-Paketmirrors für die USA
----
$ host ftp.us.debian.org
ftp.us.debian.org has address 64.50.236.52
ftp.us.debian.org has address 128.61.240.89
ftp.us.debian.org has address 64.50.233.100
ftp.us.debian.org has IPv6 address 2610:148:1f10:3::89
$
----

Auch wenn es vier IP-Adressen sind, handelt es sich jedoch nur um drei
Server. Sowohl die IPv6-Adresse `2610:148:1f10:3::89`, als auch die
IPv4-Adresse `128.61.240.89` gehören zum Server `debian.gtisc.gatech.edu`.

[[paketquellen-ueber-geoip-auswaehlen]]
==== Paketquellen über GeoIP auswählen ====

Bei diesem Verfahren wird einer IP-Adresse ein geographischer Standort
zugeordnet. Die Genauigkeit dieser Funktion schwankt je nach
Internet-Anbieter, Datenbank und eingesetztem Verfahren. 

Zu beachten ist dabei, dass der angegebene Standort nicht
notwendigerweise dem tatsächlichen Standort des Rechners mit dieser
IP-Adresse entspricht. Meistens ist das der Standort des Providers, von
dem Sie diese IP-Adresse bezogen haben bzw. der diese IP-Adresse
vergeben hat.

.Standortlokalisierung über das GeoIP Tool <<geoiptool>>
image::werkzeuge/paketquellen-und-werkzeuge/geoiptool.png[id="fig.geoiptool", width="50%"]

Eine Offline-Zuordnung ermöglicht beispielsweise das Paket
'geoip-database' <<Debian-Paket-geoip-database>>. Es enthält eine
entsprechende Datenbank mit stets bestehenden, festen IP-Adressen.
Darüberhinaus existieren jedoch auch deutlich exaktere Alternativen.

Diese Funktionalitat lässt sich nutzen, um anhand der anfragenden
IP-Adresse automatisiert einen geographisch nahen Paketmirror zu
finden. Bei Debian ist dies an mehreren Stellen im Einsatz.

==== GeoIP per DNS ====

// TODO: cdn.debian.net ist tot, zeigt auf http.debian.net

Mit dem Hostnamen `cdn.debian.net`{empty}footnote:['CDN' steht für Content
Distribution Network] erreichen Sie seit vielen Jahren (fast) immer
einen offiziellen Debian-Spiegelserver in ihrer Nähe. `cdn.debian.net`
war daher für einige Jahre die Voreinstellung im Debian-Installer, wenn
Sie nicht explizit einen anderen Paketmirror ausgewählt haben.

Die Nähe wird bei diesem System über die Quell-IP der DNS-Anfrage
bestimmt und hängt somit auch davon ab, wo der zwischenspeichernde
DNS-Server steht, an den die DNS-Anfrage gesendet wurde.
Netzwerktechnisch betrachtet stehen diese DNS-Server im Normalfall
immer unweit des anfragenden Rechners.

Da hier die Auswahl des Paketmirrors bereits auf DNS-Ebene passiert,
funktioniert diese Methode nicht nur mit HTTP, sondern auch mit FTP
und theoretisch sogar auch mit `rsync`. Allerdings bieten nicht alle
Paketmirror den Inhalt auch per `rsync` an. Somit funktioniert
`cdn.debian.net` stets zuverlässig mit HTTP als auch mit FTP in der
`/etc/apt/sources.list`. Nachfolgendes Beispiel zeigt
Eintragungen für Debian 'Wheezy' mit HTTP wie auch FTP:

----
deb http://cdn.debian.net/debian/ wheezy main contrib non-free
deb ftp://cdn.debian.net/debian/ wheezy main contrib non-free
----

Eine tatsächliche Nähe zum zurückgegebenen Paketmirror ist jedoch nicht
immer gegeben. Zeitweise funktioniert dieser Dienst in manchen Ländern
auch weniger gut. Nachfolgend sehen Sie einige Beispiele für ausgewählte
Regionen. Das erste Beispiel stammt aus Deutschland:

.Erreichbarkeit des Paketmirrors `cdn.debian.net` von Deutschland aus
----
$ host cdn.debian.net
cdn.debian.net is an alias for deb.cdn.araki.net.
deb.cdn.araki.net has address 137.226.34.42
deb.cdn.araki.net has address 129.143.116.10
deb.cdn.araki.net has address 195.71.68.86
$
----

In Frankreich bekommen Sie ggf. die folgende Ausgabe:

.Erreichbarkeit des Paketmirrors `cdn.debian.net` von Frankreich aus
----
$ host cdn.debian.net
cdn.debian.net is an alias for deb.cdn.araki.net.
deb.cdn.araki.net has address 91.121.124.139
$
----

Ein Beispiel aus Schweden:

.Erreichbarkeit des Paketmirrors `cdn.debian.net` von Schweden aus
----
$ host cdn.debian.net
cdn.debian.net is an alias for deb.cdn.araki.net.
deb.cdn.araki.net has address 213.129.232.18
$
----

Machen Sie die Anfrage hingegen aus Großbritannien, kann es so aussehen:

// Interne Notiz: Getestet von abel.debian.org

.Erreichbarkeit des Paketmirrors `cdn.debian.net` von Großbritannien aus
----
$ host cdn.debian.net
cdn.debian.net is an alias for deb.cdn.araki.net.
deb.cdn.araki.net has address 83.142.228.128
$
----

Für die Schweiz sah es zum Zeitpunkt unserer Recherche leider etwas
enttäuschend aus. Der Dienst war nicht verfügbar -- wie man sieht,
funktionert der Dienst eben nicht überall perfekt.

.Erreichbarkeit des Paketmirrors `cdn.debian.net` von der Schweiz aus
----
$ host cdn.debian.net
Host cdn.debian.net not found: 3(NXDOMAIN)
$
----

==== Immer per CDN: Security-Updates ====

Security-Updates kommen bei Debian nicht über das normale
Spiegelnetzwerk, welches regulär nur alle sechs Stunden aktualisiert
wird. Stattdessen besteht ein separates Spiegelnetzwerk unter dem
Hostnamen `security.debian.org`, das nur nach Bedarf aktualisiert
wird.  Dieses Spiegelnetzwerk verwendet schon seit längerem ein CDN.

==== GeoIP per HTTP-Redirect ====

Raphael Geissert hat den Debian
Redirector <<Debian-Redirector>> entwickelt, der eine Alternative zu
`cdn.debian.net` darstellt. Ursprünglich lief dieser Dienst
unter der URL `http://http.debian.net/` außerhalb der Debian-internen
Infrastruktur. Seit Mai 2015 ist der Dienst auf Debian-eigene
Server umgezogen und dort unter `http://httpredir.debian.org/`
zu erreichen. Die ursprüngliche Adresse `http://http.debian.net/`
leitet seitdem automatisch auf `http://httpredir.debian.org/` um.
Tragen Sie als Paketquelle
`http://httpredir.debian.org/debian/` ein, sendet APT zuerst eine
HTTP-Anfrage an `httpredir.debian.org` und bekommt als Antwort eine
Weiterleitung an den eigentlichen Paketmirror. Die nachfolgende
Ausschnitt zeigt den Eintrag für Debian 7 'Wheezy' in der Datei
`/etc/apt/sources.list`:

----
deb http://httpredir.debian.org/debian/ wheezy main contrib non-free
----

Interessant ist auch die Netzwerkkommunikation, die (unbemerkt) im
Hintergrund abläuft. Wir zeigen das anhand eines Beispiels aus der
Schweiz genauer. Zur Analyse kommt das Kommando `GET` aus dem Paket
'libwww-perl' zum Einsatz. Zu sehen ist, dass die Anfrage an
`httpredir.debian.org` aufgelöst wird und eine Weiterleitung (Redirect) zum
Debian-Paketmirror an der ETH Zürich erfolgt.

.Auswertung der Netzwerkkommunikation bei der Auflösung der IP
----
$ GET -SUsed http://httpredir.debian.org/debian/
GET http://httpredir.debian.org/debian/
User-Agent: lwp-request/6.03 libwww-perl/6.04

302 Found
Connection: close
Date: Thu, 10 Jul 2014 00:32:59 GMT
Location: http://debian.ethz.ch/debian/
Vary: Accept-Encoding
Content-Length: 0
Content-Type: text/plain
Client-Date: Thu, 10 Jul 2014 00:32:59 GMT
Client-Peer: 46.4.205.44:80
Client-Response-Num: 1

GET http://debian.ethz.ch/debian/
User-Agent: lwp-request/6.03 libwww-perl/6.04

200 OK
Connection: close
Date: Thu, 10 Jul 2014 00:32:59 GMT
Server: Apache/2.2.22 (Debian)
Vary: Accept-Encoding
Content-Type: text/html;charset=UTF-8
Client-Date: Thu, 10 Jul 2014 00:32:59 GMT
Client-Peer: 129.132.53.171:80
Client-Response-Num: 1
Client-Transfer-Encoding: chunked
Title: Index of /debian
$
----

Von *Vorteil* ist hier die höhere Genauigkeit. Die GeoIP kann nicht nur
auf den zwischenspeichernden DNS-Servern, sondern auch auf den
anfragenden Rechner selbst angewendet werden. Dabei wird auch das
genutzte Netzwerkprotokoll berücksichtigt. Nutzen Sie IPv6, erhalten Sie
dann eine Empfehlung für einen passenden, IPv6-fähigen Paketmirror in
ihrer Nähe <<Debian-Mirror-Doku>>.

Desweiteren kann der Redirect auch in Abhängigkeit der angefragten Datei
passieren. So werden z.B. Anfragen nach Paketen aus dem Bereich
'Backports' nur an Paketmirrors weitergeleitet, die auch die Paketquellen
für 'Backports' spiegeln{empty}footnote:[Dies ist nur noch für Debian 6
'Squeeze' relevant. Ab Debian 7 'Wheezy' sind die Backports in den
normalen Debian-Paketquellen enthalten.]. Darüber hinaus muss die
Paketquelle nicht auf jeden Paketspiegel unter dem gleichen Pfad liegen.
Möglich sind z.B. statt der Empfehlung `/debian/` auch
`/pub/debian/` oder `/mirror/debian/`.

// TODO: Doppelt! Der Inhalt der Fußnote ist mehr oder weniger auch in praxis/debian-backports/backports-intro.adoc und praxis/debian-backports/einbindung-in-den-paketbestand.adoc

Das Verfahren mit HTTP-Weiterleitungen hat jedoch auch *Nachteile*.
Einerseits funktioniert es ausschließlich per HTTP (oder HTTPS), da FTP
keine Weiterleitungen kennt. Aus dieser Einschränkung leitet sich auch
der Hostname `httpredir.debian.org` ab. Andererseits werden pro Paketliste
sowie pro heruntergeladenem Paket stets zwei HTTP-Anfragen gesendet.

Da sich dieses Verfahren trotz der o.g. Einschränkung in der Praxis als
zuverlässiger, flexibler, genauer und leichter wartbar erwies{empty}footnote:[Es
ist wesentlich leichter installierbar als ein autoritativer
DNS-Server für eine bestimmte Zone und der Quellcode ist per Git
verfügbar.], setzt es sich gegenüber dem Dienst `cdn.debian.net` und
somit innerhalb von Debian immer mehr als Voreinstellung durch.

==== Automatische Paketmirror-Auswahl per Mirror-Liste ====

APT kann seit Version 0.8 (ca. Ende 2010, ab Debian 6 'Squeeze' und
Ubuntu 10.10 'Maverick Meerkat') über das Schlüsselwort `mirror` in der
Datei `/etc/apt/sources.list` seine Paketquelle aus einer Liste
von Paketspiegeln aussuchen <<Vogt-Apt-Mirror>>.

Offizielle Mirror-Listen im passenden Format gibt es bisher jedoch nur
von Ubuntu. Für Ubuntu 12.04 LTS 'Precise Pangolin' sieht der Eintrag
für generell gut erreichbare Paketmirrors wie folgt aus:

----
deb mirror://mirrors.ubuntu.com/mirrors.txt precise main restricted universe multiverse
----

In diesem Fall wird z.B. beim Aufruf von `apt-get update` zunächst die
Mirror-Liste unter `http://mirrors.ubuntu.com/mirrors.txt`
heruntergeladen. In dieser Datei stehen die Basis-URLs mehrerer
Paketquellen. Danach sucht sich APT per Zufall eine der dieser
Paketquellen aus und lädt von dort die spezifizierten Paketlisten
herunter.

Clientseitig nutzt dieses Verfahren keinerlei GeoIP-Informationen,
sondern wählt pro Maschine einen zufälligen Paketspiegel aus. Zunächst
deutet o.g. URL auf eine simple Textdatei hin. Diese Datei wird jedoch
bei jedem Aufruf automatisch neu generiert und -- ähnlich wie die Weiterleitungen
beim Debian Redirector -- je nach anfragender IP dynamisch mit URLs
anderer Spiegel gefüllt. Laden Sie diese Datei aus der Schweiz herunter,
kann sie z.B. so aussehen:

----
http://ubuntu.ethz.ch/ubuntu/
http://archive.ubuntu.csg.uzh.ch/ubuntu/
http://mirror.switch.ch/ftp/mirror/ubuntu/
http://archive.ubuntu.com/ubuntu/
----

Aus Österreich sieht die Liste dagegen z.B. so aus:

// Interne Notiz: Getestet von eder.debian.org

----
http://ubuntu.lagis.at/ubuntu/
http://ubuntu.inode.at/ubuntu/
http://ubuntu.uni-klu.ac.at/ubuntu/
http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive/
http://archive.ubuntu.com/ubuntu/
----

Erfragen Sie die Liste in Deutschland oder Frankreich, kommen sogar noch
deutlich mehr Paketspiegel zur Auswahl. Eine Abfrage von einem Server,
der bei dem deutschen Internetdienstleister Hetzner gehostet wird, ergab
34 aufgelistete Paketspiegel{empty}footnote:[Um keine unübersichtlich langen
Beispiele abzudrucken, wurden hier absichtlich die beiden Beispiele aus
dem deutschsprachigen Raum gewählt, die relativ kurze Listen ergeben.].

Auffällig ist allerdings, dass als letzter Paketmirror in dieser Liste
jeweils immer auch noch `archive.ubuntu.com` angegeben wird. Unter
diesem Hostnamen sind per DNS Round Robin wiederum zur Zeit sechs
verschiedene Server von Canonical erreichbar.

Alternativ zum dynamisch generierten `mirrors.txt` können Sie
bei Ubuntu auch eine Paketspiegel-Liste per Land angeben. Für
Deutschland gibt es eine Liste von deutschen Ubuntu-Paketspiegeln unter
`http://mirrors.ubuntu.com/DE.txt`. Diese verwenden Sie z.B. für Ubuntu
14.04 LTS 'Trusty Tahr' wie folgt in der `/etc/apt/sources.list`:

----
deb mirror://mirrors.ubuntu.com/DE.txt trusty main restricted universe multiverse
----

Wenn Sie möchten, können Sie dieses Feature von APT natürlich auch
nutzen, um eine Liste ihrer favorisierten Paketspiegel selbst
zusammenzustellen -- auch unter Debian.

Unter `https://www.debian-paketmanagement.de/hetzner-mirrors.txt` haben
wir z.B. eine Liste von Paketspiegeln für Debian erstellt, die alle bei
dem deutschen Internetdienstleister Hetzner gehostet sind (ohne Gewähr)
und somit für andere ebenfalls dort gehostete Server nicht mit ins
Trafficvolumen zählen. Der passende Eintrag in der
`/etc/apt/sources.list` sind dann so aus:

----
deb mirror://www.debian-paketmanagement.de/hetzner-mirrors.txt wheezy main contrib non-free
----

==== Welcher Paketmirror wird schlussendlich benutzt? ====

Egal, ob Sie eine der o.g. Methoden zur automatischen Auswahl des
Paketspiegels verwendet haben oder ob Sie einen bestimmten Hostnamen in
ihrer `/etc/apt/sources.list` eingetragen haben -- oft stellt
sich die Frage: Von welchem Paketspiegel bezieht APT denn nun die
Paketlisten und Pakete tatsächlich? APT gibt diese Information leider
nicht allzu leicht preis.

Falls einem der schlussendlich verwendeten Hostnamen mehr als eine IP
zugewiesen ist, wird eine davon zufällig ausgewählt. APT und
`aptitude` verwenden diese IP-Adresse intern, zeigen sie aber erst
dann an, wenn Sie eines der Programme zur Paketverwaltung benutzen und
die zusätzliche Option `-o Debug::pkgAcquire::Worker=true` verwenden.
Damit wird APT sehr gesprächig und zeigt en detail, welche Einstellungen
es benutzt. In dem nachfolgendem Beispiel sehen Sie das auszugsweise bei
der Installation des Pakets 'netselect-apt'.

.Informationen zum tatsächlich genutzten Paketmirror bei der Verwendung von `apt-get`
----
# apt-get -o Debug::pkgAcquire::Worker=true install netselect-apt
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  netselect
The following NEW packages will be installed:
  netselect netselect-apt
0 upgraded, 2 newly installed, 0 to remove and 4 not upgraded.
Starting method '/usr/lib/apt/methods/http'
...
  -> http:600%20URI%20Acquire%0aURI:%20http://ftp.ch.debian.org/debian/pool/main/n/netselect/netselect_0.3.ds1-25_amd64.deb%0aFilename:%20/var/cache/apt/archives/partial/netselect_0.3.ds1-25_amd64.deb%0a%0a
  <- http:102%20Status%0aURI:%20http://ftp.ch.debian.org/debian/pool/main/n/netselect/netselect_0.3.ds1-25_amd64.deb%0aMessage:%20Connecting%20to%20ftp.ch.debian.org%20(129.132.53.171)
...
#
----

Deutlich übersichtlicher ist jedoch die Demo-Seite des Debian
Redirectors <<Debian-Redirector>>. Neben dem aktuellen Standort -- hier
Berlin -- zeigt <<fig.debian-net-demo>> die ausgewählten Paketquellen
als Hostname an.

.Auswahl des Paketmirrors über den Debian Redirector <<Debian-Redirector>>
image::werkzeuge/paketquellen-und-werkzeuge/debian-net-demo.png[id="fig.debian-net-demo", width="50%"]

Weitere Ansatzpunkte zur Leistungsfähigkeit eines bestimmten Mirrors
liefern Ihnen die Werkzeuge `netselect` bzw. `netselect-apt`. Beide
Programme stellen wir unter Bandbreite zum Paketmirror testen in 
<<am-besten-erreichbaren-paketmirror-finden>> ausführlich vor.
// Datei (Ende): ./werkzeuge/paketquellen-und-werkzeuge/automatisiertes-auswaehlen-von-paketquellen.adoc
