adminForge

free | no tracking | no logging | no advertising

Das ist unser Motto. Mit adminForge bieten wir kostenlose Dienste an. Unser Ziel ist es, eine freie und datensparsame Alternative zu bekannten Diensten bereitzustellen. Seit 2014 betreiben wir adminForge gemeinsam mit Spaß an der Technik und an Open-Source.

Eigenen IP-Info Dienst betreiben

Ich beschreibe euch wie ihr einen eigenen IP-Info oder auch „wie-ist-meine-ip“ Dienst nur mit NGINX und GeoIP2 betreiben könnt.

So wurde auch der adminForge Service: ipwho.de konfiguriert.

Aufbau des Setups:

  • Ubuntu 18.04 LTS als Betriebssystem
  • NGINX Webserver: HTTP Port 80, HTTPS Port 443
  • MaxMind GeoIP: GeoLite2-City und GeoLite2-ASN Datenbanken

Punkt 1: NGINX Repository hinzufügen

Als ersten Schritt installieren wir unter Ubuntu 18.04 LTS das PPA Repo von Ondřej Surý.
Es kann auch jedes andere NGINX Repo verwendet werden, es sollte nur libnginx-mod-http-geoip2 enthalten sein!

add-apt-repository ppa:ondrej/nginx
apt-get update

Punkt 2: NGINX mit GeoIP2 installieren

Jetzt kann nginx installiert werden, dabei wir automatisch libnginx-mod-http-geoip2 mit installiert und geladen.

apt-get install nginx

Punkt 3: NGINX vHost erstellen

Wir erstellen den vHost. Passt bitte den server_name sowie ssl_certificate und ssl_certificate_key an! Den Footer könnt ihr natürlich auch anpassen.

Wie ihr ein SSL Zertifikat erstellt beschreibe ich im Let’s Encrypt via acme.sh für Apache und Nginx Tutorial.

real_ip_header   X-Real-IP;
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;

geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
    auto_reload 1d;
    $ip_country_code source=$remote_addr country iso_code;
    $ip_country_name source=$remote_addr country names en;
    $ip_city_name source=$remote_addr city names en;
}

geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb {
    auto_reload 1d;
    $ip_asn      source=$remote_addr autonomous_system_number;
    $ip_aso      source=$remote_addr autonomous_system_organization;
}

server {
    listen 80;
    listen [::]:80;
    server_name DOMAIN.de;
    access_log off;
    error_log  off;
    default_type text/plain;
    add_header Cache-Control no-cache;
    expires off;

    # Let's Encrypt
    location /.well-known/acme-challenge {
      root /var/www/letsencrypt;
      default_type text/plain;
      try_files $uri =404;
    }

    add_header      X-Powered-By              "adminForge.de" always;

    add_header      X-Frame-Options                 "SAMEORIGIN" always;
    add_header      X-XSS-Protection             "1; mode=block" always;
    add_header      X-Content-Type-Options             "nosniff" always;
    add_header      Referrer-Policy "no-referrer-when-downgrade" always;
    add_header      Content-Security-Policy "default-src 'none'; img-src 'self'" always;

    set $ip_country "$ip_country_code / $ip_country_name / $ip_city_name";
    set $ip_as      "AS$ip_asn / $ip_aso";
    set $footer     "--- help ---\ncurl 4.ipwho.de/ip --> 8.8.8.8\ncurl 6.ipwho.de/ip --> 2001:4860:4860::8888\ncurl ipwho.de/json\n\nipwho.de proudly presented by adminForge.de. GeoLite2 data created by MaxMind.com.";

    location /ip {
        return 200      "$remote_addr\n";
    }
    location / {
        return 200      "$remote_addr\n$ip_country\n$ip_as\n\n$http_user_agent\n\n$footer\n";
    }
    location /json {
        default_type application/json;
        return 200 "{\"ip\":\"$remote_addr\",\"country_code\":\"$ip_country_code\",\"country_name\":\"$ip_country_name\",\"city_name\":\"$ip_city_name\",\"asn\":\"$ip_asn\",\"as_desc\":\"$ip_aso\",\"user_agent\":\"$http_user_agent\"}\n";
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name DOMAIN.de;
    access_log  off;
    error_log off;
    default_type    text/plain;
    add_header Cache-Control no-cache;
    expires off;

    ssl_certificate /etc/ssl/private/DOMAIN.de_ecc/fullchain.cer;
    ssl_certificate_key /etc/ssl/private/DOMAIN.de_ecc/ipwho.de.key;

    add_header      X-Powered-By              "adminForge.de" always;

    add_header      X-Frame-Options                 "SAMEORIGIN" always;
    add_header      X-XSS-Protection             "1; mode=block" always;
    add_header      X-Content-Type-Options             "nosniff" always;
    add_header      Referrer-Policy "no-referrer-when-downgrade" always;
    add_header      Content-Security-Policy "default-src 'none'; img-src 'self'" always;

    set $ip_country "$ip_country_code / $ip_country_name / $ip_city_name";
    set $ip_as      "AS$ip_asn / $ip_aso";
    set $footer     "--- help ---\ncurl 4.ipwho.de/ip --> 8.8.8.8\ncurl 6.ipwho.de/ip --> 2001:4860:4860::8888\ncurl ipwho.de/json\n\nipwho.de proudly presented by adminForge.de. GeoLite2 data created by MaxMind.com.";

    location /ip {
        return 200      "$remote_addr\n";
    }
    location / {
        return 200      "$remote_addr\n$ip_country\n$ip_as\n\n$http_user_agent\n\n$footer\n";
    }
    location /json {
        default_type application/json;
        return 200 "{\"ip\":\"$remote_addr\",\"country_code\":\"$ip_country_code\",\"country_name\":\"$ip_country_name\",\"city_name\":\"$ip_city_name\",\"asn\":\"$ip_asn\",\"as_desc\":\"$ip_aso\",\"user_agent\":\"$http_user_agent\"}\n";
    }
}

Wir aktivieren den vHost. Starten NGINX aber noch nicht neu!

cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/ip.conf

Punkt 4: Installation der MaxMind Datenbank

Ich fasse mich gewohnt kurz, es kann auch gerne nach der offiziellen Anleitung von MaxMind vorgegangen werden.

Wir aktivieren das Repository und installieren geoipupdate.

add-apt-repository ppa:maxmind/ppa
apt update
apt install geoipupdate

Punkt 5: MaxMind Account erstellen und Lizenzkey

Um die MaxMind GeoLite2 Datenbanken nutzen zu können benötigen wir einen Account. Wir erstellen uns hier einen MaxMind Account. Wer sein Postfach sauber halten möchte, darf gerne unseren Trash Mailer verwenden.

Anschließend können wir uns hier einen Lizenzkey generieren.

Die Account/User ID und den License key fügen wir in diese Datei ein. Die EditionIDs Zeile kann so übernommen werden.

[..]
AccountID 123456
LicenseKey xxxxxxxxxxxxx
[..]
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country
[..]

Punkt 6: geoipupdate

Wir lassen geoipupdate einmalig laufen und legen uns einen Cronjob an.

# geoipupdate
# crontab -e
18 7 * * 6 /usr/bin/geoipupdate

Punkt 7: NGINX Config prüfen

Wir prüfen ob unsere NGINX Konfiguration korrekt ist.

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Sollte alles passen starten wir NGINX neu.

systemctl restart nginx.service

Punkt 8: Testen

Wenn alles richtig verlaufen ist sollte nun eine Ausgabe wie diese kommen.

% curl DOMAIN.de                   
87.78.xxx.xx
DE / Germany / Troisdorf
AS8422 / NetCologne Gesellschaft fur Telekommunikation mbH

curl/7.69.0

--- help ---
curl 4.ipwho.de/ip --> 8.8.8.8
curl 6.ipwho.de/ip --> 2001:4860:4860::8888
curl ipwho.de/json

ipwho.de proudly presented by adminForge.de. GeoLite2 data created by MaxMind.com.

 

UnterstützenDas Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende.