Come fare il filtro di dominio in Linux?


12

Preferibilmente qualcosa di simile a iptables. Fondamentalmente, voglio fare il filtro di dominio / whitelisting / blacklist come farei con gli IP in iptables. Ci sono consigli su come farlo?


cosa / perché stai cercando di bloccare? Stai cercando di filtrare HTTP o SMTP o NTP in uscita / in entrata? Diversi strumenti possono essere utilizzati per diversi scenari.
Creek,

1
Un paio di suggerimenti che potrebbero aiutarti sono denyhosts.sourceforge.net/faq.html e fail2ban.org/wiki/index.php/Main_Page .
Ramesh,

1
Idealmente @josten useresti un proxy HTTP come Squid . Il blocco dei nomi di dominio iptablespuò essere fatto ma può essere rischioso
Creek,

Risposte:


8

Se si elimina il traffico utilizzando la risoluzione dei nomi con le regole iptables, i nomi verranno risolti durante la creazione di tale regola. Se qualcosa cambia, la tua regola non sarà più valida. Questa potrebbe essere una soluzione (non una bella ...):

# iptables -I FORWARD -p udp --dport 53 -m string --hex-string "|03|www|08|facebook|03|com" --algo bm -j DROP

Da un altro host all'interno della LAN:

# host www.facebook.com
www.facebook.com A record not found, try again

Fondamentalmente, stai dicendo a ogni pacchetto DNS ( udp/53) che ha la stringa esadecimale di www.facebook.com toessere eliminata. Si noti che questo eliminerà la risoluzione dei nomi e non il traffico http stesso.

I numeri esadecimali separati da pipe ( |03|www|08|facebook|03|com) sono la rappresentazione del .simbolo del punto nelle query DNS. Dirà quanti dei seguenti caratteri rappresenteranno ciascuna parte di un nome di dominio completo (host, dominio, dominio di primo livello) Esempio:

ospite: mail.google.com

rappresentazione esadecimale: 04 6d 61 69 6c 06 67 6f 6f 67 6c 65 03 63 6f 6d

"rappresentazione visiva: 04mail06google03com

Ottenere il pacchetto con tcpdump:

# tcpdump -i eth0 -X dst port 53

15:50:11.643672 IP xxx.xxx.xxx.xxx:xxx > ns4.google.com.domain: 16530 A? mail.google.com. (33)
        0x0000:  4500 003d 779a 4000 4011 b390 c949 4742  E..=w.@.@....IGB
        0x0010:  d8ef 260a 8424 0035 0029 0fc0 4092 0000  ..&..$.5.)..@...
        0x0020:  0001 0000 0000 0000 046d 6169 6c06 676f  .........mail.go
        0x0030:  6f67 6c65 0363 6f6d 0000 0100 01         ogle.com.....

Ma ricorda:

  • Se stai cercando di filtrare il traffico più specifico come smtp, ftp o http, un proxy di quel protocollo dovrebbe essere migliore.
  • Stai "dirottando" le query DNS e non stai bloccando il dominio. Gli utenti non sono così stupidi;)

Fonti: qui e qui


perché algo type è bm?
Gaurav Kansal,

Algorithm Boyer-Moore - it.wikipedia.org/wiki/…

4

Forse la risposta alla tua domanda è troppo tardi, ma recentemente ho dovuto risolvere un problema simile e google mi porta qui

Dopo ricerche fallite ho scritto una piccola utility in C che intercetta le risposte DNS, confronta il nome di dominio in essa contenuto con regex dato ed elenca gli indirizzi IP corrispondenti. Eccolo: https://github.com/vmxdev/sidmat/

Non è necessario configurare il proprio server DNS, l'utilità può catturare le risposte DNS da qualsiasi server

Ad esempio, per visualizzare gli indirizzi IP di facebook.com (e sottodomini) che sono stati risolti in questo momento, è possibile eseguire

# ./sidmat eth0 "^facebook\.com$|\.facebook\.com$"
173.252.120.6
...

dove eth0 è l'interfaccia di rete sul router (o dove passano le risposte DNS)

Puoi facilmente integrarlo con iptables (o iptables con ipset)

Ma:

  • l'utilità è davvero semplice. Non esegue molti controlli, quindi l'attaccante può imbrogliarlo
  • questa tecnica è inutile se gli utenti non utilizzano DNS per la risoluzione dei nomi

3

Per la lista nera il modo più semplice è probabilmente usare dnsmasq

Installare dnsmasq

$ sudo apt-get install dnsmasq

e aggiungi questa riga a /etc/dnsmasq.conf

address=/facebook.com/127.0.0.1

Questo bloccherà facebook.com e tutti i suoi sottodomini.

Nota: per Ubuntu vedere questo post .


1

Se si esegue un bind9 di memorizzazione nella cache locale, questo viene spesso realizzato da a dummy-block

zone "facebook.com" { type master; file "dummy-block"; };

e il dummy-blockfile:

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                          2         ; Serial
                     604800         ; Refresh
                      86400         ; Retry
                    2419200         ; Expire
                     604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
*       IN      A       127.0.0.1   

Guarda anche:

Esecuzione di BIND9 e ISC-DHCP con facebook.comesempio.

Un semplice approccio basato su DNS per bloccare la pubblicità sul Web

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.