SSH Verbindungen nach Herkunftsland blockieren

In der heutigen Zeit, in der Angriffe aus dem Internet, oder zumindest die vorbereitenden Scans, an der Tagesordnung sind, kann es Sinn machen Verbindungen aus bestimmten Ländern selektiv zu verbieten. Selektiv bedeutet hierbei, dass man die Kontrolle über blockierte Ports behält.

Das folgende Beispiel geht von folgendem Szenario aus:

Als Betreiber eines Rootservers, auf dem auch Websites angeboten werden, sol die gesamte Welt Zugriff auf die Webseiten haben. Den Zugriff per SSH möchte man aber für Internet-User aus China verbieten.


Verwendung findet die "Standard"- Firewall von Ubuntu 14- iptables. Diese kann mit Addons modular und je nach den Anforderungen erweitert werden. Die Addons sind unter Ubuntu 14 im Paket xtables-addons-common verfügbar.

Der erste Schritt besteht darin diese Erweiterung, sowie ein für das Update- Script notweniges Paket zu installieren:

# apt-get install xtables-addons-common
# apt-get install libtext-csv-perl

Im zweiten Schritt wird ein Script /etc/cron.weekly/update-geoip erstellt, das die frei verfügbare GeoIP- Datenbank von Maxmind wöchentlich aktualisiert.
#!/bin/sh
GEOIP_MIRROR="http://geolite.maxmind.com/download/geoip/database"
TMPDIR=$(mktemp -d /tmp/geoipupdate.XXXXXXXXXX)

wget --no-verbose -t 3 -T 60 "${GEOIP_MIRROR}/GeoIPv6.csv.gz" -O "${TMPDIR}/GeoIPv6.csv.gz"
wget --no-verbose -t 3 -T 60 "${GEOIP_MIRROR}/GeoIPCountryCSV.zip" -O "${TMPDIR}/GeoIPCountryCSV.zip"
gunzip -fdc ${TMPDIR}/GeoIPv6.csv.gz >> ${TMPDIR}/GeoIPv6.csv
unzip -o -d ${TMPDIR} ${TMPDIR}/GeoIPCountryCSV.zip
mkdir -p /usr/share/xt_geoip
perl /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip ${TMPDIR}/GeoIP*.csv
[ -d "${TMPDIR}" ] && rm -rf $TMPDIR
Das eigentliche Blockieren geschieht wie folgt:

Verbindungen aus China an den Port 22 (SSH) verbieten:
# iptables -I INPUT 1 -m geoip --src-cc CN -p tcp --dport 22 -j DROP

Möchte man Verbindungen aus allen Ländern ausser Deutschland verbieten, so ist folgende Zeile die Lösung:
# iptables -I INPUT 1 -m geoip ! --src-cc DE -p tcp --dport 22 -j DROP

Die Regeln werden an die erste Stelle der INPUT Chain geschrieben was verhindert, dass sie durch weitere Regeln unter Umständen ausgehebelt werden. Zudem sorgt dies für ein zügiges Ablehnen der Verbindungen ohne unnötig Rechenleistung zu verschwenden.

Die Änderungen sind sofort wirksam, überleben jedoch keinen Neustart. Je nach Einrichtung des Systems kann es notwendig sein die Regel(n) in das entsprechende Startup- Script oder die Konfigurationsdatei auszunehmen.