Kleine Serveranwendung für Web-Blacklist

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
paedubucher
Beiträge: 932
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Kleine Serveranwendung für Web-Blacklist

Beitrag von paedubucher » 04.11.2021 15:31:29

Ich hatte heute eine kleine Projektidee. Es geht darum, eine Reihe von Domainnamen zu definieren, auf welche Anfragen blockiert werden sollen (z.B. facebook.com oder twitter.com). Ich definiere also eine Blacklist, und eine kleine Serveranwendung, die bei mir lokal läuft, leitet mich bei entsprechenden Anfragen weiter auf eine neutrale Seite, die von der Anwendung selber ausgeliefert wird.

Der einfachste Ansatz wäre es, wenn ich z.B. mit Go einen kleinen Web-Server bauen würde, der etwa auf Port 1337 läuft. In /etc/hosts könnte ich dann folgende Einträge machen:

Code: Alles auswählen

facebook.com		localhost:1337
twitter.com		localhost:1337
Besser wäre es, wenn sich meine kleine Serveranwendung selber um das Routing kümmern würde. Natürlich könnte die Anwendung selber ins Hosts-File reinschreiben, doch das ist mir etwas zu riskant.

Von DNS verstehe ich ansonsten nur sehr wenig. Doch es müsste doch irgend eine betriebssystemseitige API geben, mit welcher ich solche Hosts registrieren könnte. Wenn die Anwendung dann beendet wird, werden die Einträge wieder entfernt.

Kennt hier jemand gute Ansätze? Oder soll ich vielleicht doch mit dem Hosts-File arbeiten, indem ich etwa einen Bereich speziell mit Kommentaren markiere? Meine Anwendung dürfte dann nur in diesem Bereich Änderungen vornehmen.

Code: Alles auswählen

### start of blacklist entries ###
facebook.com		localhost:1337
twitter.com		localhost:1337
### end of blacklist entries ###
Ich wäre sehr froh, um ein paar Anregungen!

PS: Ich gehe davon aus, dass die Anwendung mit Super-User-Rechten laufen muss. Wenn das nicht nötig wäre, umso besser. (Port 1337 ist ja kein Problem.)
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
MSfree
Beiträge: 11604
Registriert: 25.09.2007 19:59:30

Re: Kleine Serveranwendung für Web-Blacklist

Beitrag von MSfree » 04.11.2021 15:50:49

Gibt es alles schon fertig:
https://pi-hole.net/

Benutzeravatar
debilian
Beiträge: 1371
Registriert: 21.05.2004 14:03:04
Wohnort: 192.168.43.7
Kontaktdaten:

Re: Kleine Serveranwendung für Web-Blacklist

Beitrag von debilian » 04.11.2021 15:54:34

mache das seit Jahren über die /etc/hosts
kann das halbe Internet nicht aufrufen - die ganzen grossen Seiten sind bei mir verboten bzw.
führen auf einen eigenen Server....

sobald irgendeine Webseite nervt oder eine paywall erscheint - schwubs ab in die hosts Datei und gut isses...

;-)
-- nichts bewegt Sie wie ein GNU --

Benutzeravatar
paedubucher
Beiträge: 932
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Kleine Serveranwendung für Web-Blacklist

Beitrag von paedubucher » 04.11.2021 15:57:57

MSfree hat geschrieben: ↑ zum Beitrag ↑
04.11.2021 15:50:49
Gibt es alles schon fertig:
https://pi-hole.net/
Das ist sicherlich eine gute Lösung für zu Hause. Mir schwebt aber eher ein Tool vor, das ich folgendermassen bei Bedarf benutzen kann:

Code: Alles auswählen

$ blockweb blacklist.txt
Wobei die Datei blacklist.txt eine Liste von Domains enthält, die ich blockieren möchte.

Und wenn ich dann Ctrl-C drücke, schaltet es wieder ab, und räumt die Regeln wieder weg.

So kann ich mit verschiedensten Blacklists arbeiten, ohne in einem Web-Interface rumfummeln zu müssen.

Ausserdem möchte ich das halt genau nach meinen Bedürfnissen programmieren. Mir geht es einerseits um den konkreten Nutzen der Anwendung, andererseits auch ums Programmieren und Lernen selber.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
bluestar
Beiträge: 2418
Registriert: 26.10.2004 11:16:34
Wohnort: Rhein-Main-Gebiet

Re: Kleine Serveranwendung für Web-Blacklist

Beitrag von bluestar » 04.11.2021 17:01:17

paedubucher hat geschrieben: ↑ zum Beitrag ↑
04.11.2021 15:31:29
Ich wäre sehr froh, um ein paar Anregungen!
In deinem Post stecken ein paar Ungereimtheiten, die ich erst mal adressieren will für dein Verständnis:

DNS bzw. /etc/hosts lösen lediglich Namen auf IPs auf => Ports bekommst du da gar nicht rein (1337)

In /etc/hosts kannst du keine Wildcard/Subdomain gültigen Einträge machen, also "*.example.com" geht auch nicht, du müsstest jeden Hostnamen von example.com explizit blockieren.

Solltest du versuchen example.com auf IP-Ebene via Routing zu blockieren gilt ähnliches, du brauchst alle IPs von example und musst jede explizit blockieren. Auf IP-Ebene hat.

Last but not least kommst du an den Punkt, wo dein Browser die Seite https://example.com aufruft und deine Umleitung auf den lokalen Server greift, hier müsstest du dann auch für example.com ein gültiges Zertifikat bereithalten damit keine Fehlermeldung auftritt.

Und wenn dein Browser oder deine example-App auch noch DNS over HTTPs (DoH) macht, dann ist /etc/hosts außen vor und deine gewollte Blockade/Zensur greift nicht.

Mein Ansatz wäre ein eigener DNS-Server der für alle Anfragen für "example.com" und "*.example.com" schlicht und ergreifend ein "not found" zurückgibt, damit kommt ein Fehler und es wird gar nicht erst versucht eine Verbindung (ggfs. +SSL) aufzubauen.

Ein lokaler Proxy Server (squid + squidguard) wäre auch noch eine mögliche Option, auf die du den Browser festnageln könntest.

Bei DoH bist du jedoch komplett gelackmeiert und das Blocken wird ein Ding der Unmöglichkeit werden.

Ich bin gespannt, wie deine Lösung letztlich aussieht.
Zuletzt geändert von Tintom am 04.11.2021 17:18:59, insgesamt 1-mal geändert.
Grund: Beispieldomains entschärft auf example.com

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Kleine Serveranwendung für Web-Blacklist

Beitrag von JTH » 04.11.2021 17:17:12

paedubucher hat geschrieben: ↑ zum Beitrag ↑
04.11.2021 15:31:29
Ich hatte heute eine kleine Projektidee.
Was du dir vorstellst, wäre also ein kleiner lokaler DNS-Server/-Proxy mit eingebautem, leere oder negative Antworten liefernden HTTP(S?)-Server? Klingt nach ner netten Bastelei :) Aber ich meine, so wie du es beschrieben hast, scheitert es an ein paar Punkten – korrigiert mich, wenn Unsinn schreibe.

paedubucher hat geschrieben: ↑ zum Beitrag ↑
04.11.2021 15:31:29
Der einfachste Ansatz wäre es, wenn ich z.B. mit Go einen kleinen Web-Server bauen würde, der etwa auf Port 1337 läuft.
[…]
PS: Ich gehe davon aus, dass die Anwendung mit Super-User-Rechten laufen muss. Wenn das nicht nötig wäre, umso besser. (Port 1337 ist ja kein Problem.)
Wenn man die Anwendung etwa als lokalen DNS-Server in /etc/resolv.conf festlegt, müsste sie auch entsprechend auf Port 53 laufen. Ich wüsste nicht, dass man dort oder an entsprechenden Stellen angeben kann, dass der zu verwendende DNS-Server auf einem anderen Port läuft.

paedubucher hat geschrieben: ↑ zum Beitrag ↑
04.11.2021 15:31:29

Code: Alles auswählen

facebook.com		localhost:1337
twitter.com		localhost:1337
Namensauflösung befasst sich nur mit der Zuordnung von Namen zu IP-Adressen (und anderem hier mal ignoriertem). Eine Zuordnung eines Dienstes (wie HTTP-Server) zu einem Port passiert an anderer Stelle in den Protokollschichten. DNS kennt gar keine Ports. Das müsste also anders passieren, etwa wie ein Reverse-Proxy mit nginx. Oder es funktioniert nur für HTTP und deine Anwendung läuft einfach lokal auf Port 80.

paedubucher hat geschrieben: ↑ zum Beitrag ↑
04.11.2021 15:31:29
Kennt hier jemand gute Ansätze?
Ohne es ausprobiert oder so mal verwendet zu haben: Vielleicht lässt sich deine Idee schon direkt mit Debiandnsmasq-base oder ähnlichem umsetzen:
In /etc/resolv.conf

Code: Alles auswählen

nameserver 127.0.0.1
nameserver <IP eines anderen, garantiert funktionierendem DNS-Servers als Fallback>
Zum temporären Blocken dnsmasq starten:

Code: Alles auswählen

dnsmasq --addn-hosts=blacklist.txt --resolv-file=aehnlich_resolv_conf_aber_nur_mit_fallback_dns_server.conf
bluestar hat geschrieben: ↑ zum Beitrag ↑
04.11.2021 17:01:17
In /etc/hosts kannst du keine Wildcard/Subdomain gültigen Einträge machen, also "*.example.com" geht auch nicht, du müsstest jeden Hostnamen von example.com explizit blockieren.
Nachtrag: Ach ja Mist, da scheitert meine Idee schon :-/
Zuletzt geändert von JTH am 04.11.2021 17:21:58, insgesamt 1-mal geändert.
Grund: Nachtrag
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
paedubucher
Beiträge: 932
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Kleine Serveranwendung für Web-Blacklist

Beitrag von paedubucher » 04.11.2021 20:15:11

@bluestar: Danke, dass du TLS erwähnst! Das könnte noch ein Problem werden. Wobei die Weiterleitungsseite eher eine Erinnerung sein soll und daher sekundär ist. Ein lokaler Proxy mit funktionierendem TLS wäre da schon interessant.

@JTH: Das würde das Problem technisch schon einmal lösen! Probiere ich gerne mal als Prototyp aus. Ich neige aber nun doch mehr zu einem einfachen Binary, das ich dann eben mit sudo ausführe und dann halt doch das Hosts-File überschreibe. Ist auch mal eine gute Übung, das umzusetzen, ohne etwas kaputt zu machen :wink:

Danke für die guten Hinweise!
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Kleine Serveranwendung für Web-Blacklist

Beitrag von JTH » 04.11.2021 20:57:08

paedubucher hat geschrieben: ↑ zum Beitrag ↑
04.11.2021 20:15:11
Wobei die Weiterleitungsseite eher eine Erinnerung sein soll und daher sekundär ist.

[…] und dann halt doch das Hosts-File überschreibe. Ist auch mal eine gute Übung, das umzusetzen, ohne etwas kaputt zu machen :wink:
Ach, kaputt machen … das erhöht den Lerneffekt :P

Wenn es dir doch hauptsächlich um das Abdrehen mancher Namensauflösungen geht, hab ich noch eine Idee: Schreib dir eine eigene kleine libnss-myblacklist (oder so ähnlich). Einzuhängen in der /etc/nsswitch.conf etwa so:

Code: Alles auswählen

hosts:          files myblacklist [NOTFOUND=return] dns
Orientieren könntest du dich an den libnss* der Glibc (konkret dem Part, der die /etc/hosts liest) oder systemds Debianlibnss-myhostname (Code siehe hier). Die könnte Abfragen abfangen und kurzschließen, wenn z.B. eine /run/hosts-blacklist existiert und ein Eintrag matcht (das ginge an der Stelle auch mit Wildcardnamen), und ansonsten nichts tun. Aber auch das funktioniert mit DoT, DoH wohl nicht.
Manchmal bekannt als Just (another) Terminal Hacker.

Antworten