Hetzner

Aus Freifunk Franken
Version vom 9. September 2017, 15:58 Uhr von RedDog (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Vorab: Dies ist keine korrekte Lösung. Es ist lediglich ein sehr unschöner Hack. Eine Lösung kann für solche Situationen nur in Zusammenarbeit mit dem Host…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu:Navigation, Suche

Vorab: Dies ist keine korrekte Lösung. Es ist lediglich ein sehr unschöner Hack. Eine Lösung kann für solche Situationen nur in Zusammenarbeit mit dem Hoster erfolgen. Verweigert sich dieser, bleibt nur der Hack.

Hetzner monitored den Traffic, den die Gateways verursachen. Sollten Verbindungsversuche zu nicht gerouteten IPs dabei sein, generiert Hetzner Abuse und schickt es (Achtung!) nicht an die hinterlegte Abuse-Adresse. Was man dagegen tun kann ist hier beschrieben.

Man benötigt zunächst alle routbaren Adresse/Prefixe. Diese kann man sich z.B. bei routeviews.org runterladen. Diese Adressen können dann in die Routing-Tabelle eingepflegt werden. Am besten geht das, wenn das Gateway in einer VM ist, dann kann der Host die Filterung übernehmen.

In diesem Beispiel kommunizieren die Gateways, welche in VMs laufen, über das Interface "f3n". Normalerweise wird jeder Traffic von diesem Interface einfach weiter zum default Gateway geschickt. (Bei professionellen Hostern wird dann spätestens beim Border-Gateway jeglicher auf null geroutet). Der Mechanismus ist nun, per "ip rules" alle Verbindungen, die aus f3n (also von den VMs) kommen in eine eigene Routing Tabelle (hetzner1) zu sperren. In dieser werden alle routbaren Prefixe mit dem default gateway von Hetzner als next-hop eingetragen. Als default gateway in dieser Tabelle wird 127.0.0.1 über lo eingetragen. Alle x Stunden sollte die Tabelle aufgefrischt werden. Dazu wird eine neue (hetzner2) angelegt und anschließend die Regel umgebogen.

/etc/iproute2/rt_tables:

..
11 hetzner1
12 hetzner2

hetzner.sh:

cd /tmp

current=$(ip ru | grep hetzner | sed 's/.*hetzner//g' | tr -d '[:space:]')

if [ "$current" = "1" ]; then
	next="2"
else
	next="1"
fi

echo "Downloading routing snapshot"
wget -q http://archive.routeviews.org/oix-route-views/oix-full-snapshot-latest.dat.bz2 -O oix-full-snapshot-latest.dat.bz2
echo "Unpacking"
bzip2 -d -f oix-full-snapshot-latest.dat.bz2

echo "Parsing"
allIP=oix-full-snapshot-latest.uniq
tail -n+6 oix-full-snapshot-latest.dat | cut -d' ' -f3 | uniq | grep -v "0.0.0.0/0" > $allIP

echo "Aggregating the prefixes"
filterIP=oix-full-snapshot-latest.filtered
unlink $filterIP
for i in $(seq 0 255); do
       (grep "^$i\." $allIP | aggregate >> $filterIP) 2>&1 | grep -v "aggregate: maximum prefix length permitted will be 32" | grep -v "aggregate: no prefixes supplied"
done

echo "Cleaning up hetzner$next"
ip ro flush ta hetzner$next

echo "Inserting new valid routes to hetzner$next"
for prefix in $(cat $filterIP | grep -v "^#"); do
	ip ro add $prefix via 5.9.89.33 table hetzner$next
done
echo "Inserting null route to hetzner$next"
ip ro add default via 127.0.0.1 dev lo table hetzner$next

echo "Adding new rule for hetzner$next"
ip ru add from all iif f3n lookup hetzner$next

if [ -n "$current" ]; then
	echo "Removing old rule for hetzner$current"
	ip ru del from all iif f3n lookup hetzner$current
	echo "Cleaning up old hetzner$current"
	ip ro flush ta hetzner$current
fi