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!
1 2 | 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.
1 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | 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!
1 2 | 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
.
1 2 3 | 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.
1 2 3 4 5 6 | [..] 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.
1 2 3 | # geoipupdate # crontab -e 18 7 * * 6 /usr/bin/geoipupdate |
Punkt 7: NGINX Config prüfen
Wir prüfen ob unsere NGINX Konfiguration korrekt ist.
1 2 3 | # 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.
1 | systemctl restart nginx.service |
Punkt 8: Testen
Wenn alles richtig verlaufen ist sollte nun eine Ausgabe wie diese kommen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | % 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. |
Das Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld. Unterstütze unsere Arbeit mit einer Spende. |
Hallo und guten Abend,
ich habe mir testweise ebenfalls einen IP-Dienst nach der obigen Anleitung eingerichtet. Mir wird auch die passende IPv4-Adresse angezeigt. Selbst wenn ich meinen Dienst mit dem Handy aufrufe wird mir die IPv4-Adresse angezeigt. Rufe ich euren Dienst auf, wird mir jedoch mit IPv6-Adresse angezeigt. Habt ihr einen Tipp für mich, was ich ändern muss, damit auch mein IPv6 zurückgegeben wird? Wie schaut eure nginx.conf aus?
Vielen Dank und Grüße
Mike
Hallo Mike,
wenn du der Domain eine IPv4 und eine IPv6 Adresse zuweist, dann wird die IPv6 bei der Rückgabe bevorzugt.
Du könntest wie bei ipwho.de eine Subdomain für IPv4 und eine für IPv6 anlegen.
Gruß
Dominion
Hallo Dominion,
danke für deine Antwort. Wenn ich das korrekt verstanden habe, hast du den DNS Record A von 4.ipwho.de auf die IPv4 gelegt und den Record AAAA von 6.iPhone.de auf die IPv6 des WebServers? Mein Server hat zwar auch eine IPv6 Adresse, warum auch immer werden trotzdem die Anfragen vom nginx auf IPv4 umgeleitet.
Hallo Mike,
korrekt, ipwho.de hat v4 und v6 Einträge, 4.ipwho.de nur v4 und 6.ipwho.de nur v6.
Lauscht NGINX auf IPv4 und 6? Dann sollte es auch getrennt funktionieren.
Guten Abend,
lt netstat läuft nginx auf IPv4 und IPv6. Hab jetzt testweise die DNS Records erstellt, nun heißt es geduldig sein und in 24-48h wieder testen 😉
Danke für deine Unterstützung.