regole iptables per consentire il traffico HTTP verso un solo dominio


20

Devo configurare la mia macchina in modo da consentire solo il traffico HTTP da / verso serverfault.com. Tutti gli altri siti Web, le porte dei servizi non sono accessibili. Ho inventato queste regole di iptables:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

Non funziona abbastanza bene:

  • Dopo aver lasciato cadere tutto e passare alla regola 3:

    iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT

Ottengo questo errore:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

Pensi che sia legato al DNS? Dovrei permetterlo anche io? O dovrei semplicemente inserire gli indirizzi IP nelle regole? Pensi che ciò che sto cercando di fare potrebbe essere realizzato con regole più semplici? Come?

Gradirei qualsiasi aiuto o suggerimenti su questo. Molte grazie!


2
Non dimenticare sstatic.net e altri. serverfault.com non proviene interamente da serverfault.com
Zoredache il

Puoi eseguire un proxy su un altro sistema? Questa è la soluzione migliore / più semplice: serverfault.com/questions/215134
mattdm

Risposte:


29

Con le regole IPTables, l'ordine conta. Le regole vengono aggiunte e applicate, in ordine. Inoltre, quando si aggiungono manualmente le regole, vengono applicate immediatamente. Pertanto, nel tuo esempio, tutti i pacchetti che attraversano le catene INPUT e OUTPUT vengono eliminati non appena viene impostata la politica predefinita. Questo è anche, per inciso, il motivo per cui hai ricevuto il messaggio di errore che hai fatto. Quello che sta succedendo è questo:

  1. Viene applicato il criterio DROP predefinito
  2. IPTables riceve un nome host come destinazione
  3. IPTables tenta una ricerca DNS su "serverfault.com"
  4. La ricerca DNS è bloccata dall'azione DROP

Mentre le opzioni di origine / destinazione accettano nomi host, è fortemente sconsigliato. Per citare la pagina man,

I nomi host verranno risolti una sola volta, prima che la regola venga inviata al kernel. Si noti che specificare un nome da risolvere con una query remota come DNS è una pessima idea.

Slillibri ha colpito l'unghia sulla testa che la sua risposta, hai perso la regola ACCETTA DNS. Nel tuo caso non importa, ma generalmente imposterò la politica di default più avanti nel processo. L'ultima cosa che vuoi è lavorare in remoto e consentire SSH dopo aver attivato un rifiuto predefinito.

Inoltre, a seconda della distribuzione, dovresti essere in grado di salvare le regole del firewall in modo tale che vengano automaticamente applicate all'avvio.

Sapendo tutto ciò e riorganizzando la tua sceneggiatura, ecco cosa consiglierei.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

3
Bella risposta ben realizzata.
JakeRobinson,

1
Lo apprezzo, anche se devi aver perso anche il mio errore. Ops.
Scott Pack

3
In realtà, puoi inserire le tue iptables -Pdichiarazioni ovunque nel tuo script, poiché i criteri di catena vengono applicati solo quando i pacchetti "cadono" alla fine di una catena. Di solito inserisco le dichiarazioni delle politiche (in genere DROPpolitiche) in cima ai miei script iptables.
Steven lunedì

1
@Steven: hai assolutamente ragione. Sembra che l'OP li stia digitando in modo interattivo. Facciamo finta di essere connesso al tuo host tramite SSH e la tua prima regola è per la politica DROP. La tua connessione SSH verrà interrotta prima di poter digitare altre regole. Questo è lo stesso problema di temporizzazione, se una manifestazione diversa, di quella in cui si è imbattuta.
Scott Pack

Grazie. Ci stavo provando. Ma non ha funzionato senza aggiungere sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. Non dovrebbe essere aggiunto?
Kiran,

7

Inserisci

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

per consentire le ricerche DNS.


5

Questo tipo di requisito può essere gestito meglio con un proxy Web e / o un filtro. Dansgaurdian può essere configurato per fare questo. Dovrai utilizzare le regole NAT per forzare il tuo traffico attraverso il filtro.

L'uso di iptables per filtrare consentirà qualsiasi sito disponibile dagli indirizzi IP pertinenti. Questo è normalmente un piccolo sottoinsieme dell'intero Web.


1
Totalmente d'accordo con questo. iptablesè probabilmente lo strumento sbagliato da usare qui, in quanto non si occupa particolarmente bene dei nomi DNS. Un proxy Web con impostazioni di filtro appropriate è molto più adatto.
Steven lunedì

2

Temo che iptables non funzioni a questo livello, si preoccupa solo dell'indirizzo IP, non del nome host. Se vuoi bloccare l'accesso ad altri host virtuali di nome sullo stesso IP, dovrai guardare inserendo i file .htaccess.


Il fatto è che quando provo la regola 3 senza "far cadere tutto" funziona bene con iptables!
Zenet,

2
hmm, ho letto male la domanda. Bene, quello che sta succedendo in background è che iptables risolverà serverfault.com a 64.34.119.12 (vedi la risposta di slillibri per capire perché la risoluzione non funzionava). Tuttavia, poiché iptables non comprende i nomi host e consente solo l'IP, sarai in grado di collegarti a qualsiasi sito Web su quell'ip, se ha più siti.
Niall Donegan,

2
@Emily, potrebbe funzionare bene, in quanto viene aggiunta la regola, ma se l'IP serverfault.com cambia, il traffico non sarà consentito. Autorizzare un sito come google.com con centinaia di indirizzi che vengono cambiati frequentemente non funzionerebbe affatto.
Zoredache,

1

Devi configurarlo sul tuo server web. iptables è un filtro pacchetti. Le transazioni HTTP inviano il nome del sito (cioè stackoverflow) come parte del payload TCP (ovvero non come parte dell'intestazione TCP che è ciò che iptables legge facilmente).

Detto questo, e il fatto che le transazioni HTTP saranno quasi certamente distribuite su più pacchetti (cioè non puoi semplicemente abbinare una stringa nell'intestazione HTTP), questo è molto meglio gestito dalla configurazione del tuo server web o da un proxy di fronte di esso.

Sarebbe utile conoscere il ragionamento alla base di questo, ci sono un paio di altre alternative:

  1. Reindirizzare all'URL corretto se immettono l'URL errato (ad esempio reindirizzare a stackoverflow.com se immettono www.stackoverflow.com)
  2. Di 'al tuo server web di non servire host diversi da stackoverflow.com
  3. Metti il ​​sito su un IP separato a cui nient'altro si risolve e fai in modo che il tuo server web lo ascolti.

Ciao Phil, non sono sicuro di aver capito quale server web? Non ho un server web. Sto eseguendo questa configurazione sul mio computer.
Zenet,
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.