Impostare alcune porte firewall per accettare solo connessioni di rete locali?


18

Come si configura il firewall su un sistema in una LAN in modo che alcune porte siano aperte solo alle connessioni dalla rete locale e non dal mondo esterno?

Ad esempio, ho una scatola con Scientific Linux 6.1 (una distribuzione basata su RHEL) e voglio che il suo server SSH accetti solo connessioni da localhost o LAN. Come faccio a fare questo?

Risposte:


24

Con iptables del kernel completamente vuoto ( iptables -F), questo farà ciò che chiedi:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

Ciò dice che tutti gli indirizzi LAN possono comunicare con la porta TCP 22, che localhost riceve la stessa considerazione (sì, 127. * non solo 127.0.0.1) e che i pacchetti di ogni altro indirizzo che non corrispondono a quelle prime due regole vengono inseriti senza cerimonie in il secchio . È possibile utilizzare REJECTinvece DROPse si desidera un rifiuto attivo (TCP RST) invece di rendere la porta TCP 22 un buco nero per i pacchetti.

Se la tua LAN non utilizza il blocco 192.168.0. *, Dovrai naturalmente modificare l'IP e la maschera sulla prima riga in modo che corrispondano allo schema IP della tua LAN.

Questi comandi potrebbero non fare ciò che desideri se nel tuo firewall sono già configurate alcune regole. (Di ' iptables -Lcome root per scoprirlo.) Quello che succede spesso è che una delle regole esistenti prende i pacchetti che stai cercando di filtrare, in modo che l'aggiunta di nuove regole non abbia alcun effetto. Sebbene sia possibile utilizzare -Ianziché -Acon il iptablescomando per unire nuove regole nel mezzo di una catena anziché aggiungerle, di solito è meglio scoprire come vengono popolate le catene all'avvio del sistema e modificare tale processo in modo che le nuove regole vengano sempre installate in l'ordine corretto.

RHEL 7+

Sui recenti sistemi di tipo RHEL, il modo migliore per farlo è quello di utilizzare firewall-cmdo il suo equivalente GUI. Questo dice al firewallddemone del sistema operativo ciò che vuoi, che è ciò che effettivamente popola e manipola ciò che vedi attraverso iptables -L.

RHEL 6 e versioni precedenti

Sui vecchi sistemi di tipo RHEL, il modo più semplice per modificare le catene di firewall quando si ordinano le cose è modificare /etc/sysconfig/iptables. Gli strumenti firewall GUI e TUI del sistema operativo sono piuttosto semplicistici, quindi una volta che inizi ad aggiungere regole più complesse come questa, è meglio tornare ai vecchi file di configurazione. Fai attenzione, una volta che inizi a fare questo, rischi di perdere le modifiche se usi mai gli strumenti del firewall del sistema operativo per modificare la configurazione, poiché potrebbe non sapere come gestire regole artigianali come queste.

Aggiungi qualcosa del genere a quel file:

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

Dove lo aggiungi è un po 'complicato. Se trovi una linea in quel file di cui parla --dport 22, sostituiscila semplicemente con le tre righe sopra. Altrimenti, dovrebbe probabilmente andare prima della fine della prima riga esistente -j ACCEPT. Generalmente, dovrai acquisire familiarità con il modo in cui funziona iptables , a quel punto il punto di inserimento corretto sarà ovvio.

Salvare quel file, quindi dire service iptables restartper ricaricare le regole del firewall. Assicurati di farlo mentre sei loggato nella console, nel caso in cui le dita vengano modificate! Non ti vuoi bloccare fuori dal tuo computer mentre sei loggato su SSH.

La somiglianza con i comandi sopra non è una coincidenza. Gran parte di questo file è costituito da argomenti per il iptablescomando. Le differenze rispetto a quanto sopra sono che il iptablescomando viene eliminato e il INPUTnome della catena diventa la RH-Firewall-1-INPUTcatena specifica specifica di RHEL . (Se ti interessa esaminare il file in modo più dettagliato, vedrai prima nel file in cui hanno essenzialmente rinominato la INPUTcatena. Perché? Non potrei dirlo.)


4

Lo strumento di basso livello per l'installazione del firewall in Linux è iptables . Sono disponibili anche strumenti di livello superiore. Non so se Scientific Linux abbia uno strumento firewall consigliato.

Secondo questa pagina Web (non ho verificato che si applichi alla 6.1), service iptables savesalverò le attuali regole del firewall e queste regole salvate verranno caricate all'avvio. Quindi è necessario impostare le regole desiderate tramite i iptablescomandi (o qualsiasi altro mezzo), quindi eseguire service iptables saveper rendere persistente l'installazione.

Il post sul blog di Scott Pack è un inizio per far cadere pacchetti "dispari" che di solito non sono necessari e hanno un alto rischio di far parte di un attacco. Oltre a ciò, ti consigliamo di chiudere tutte le porte in entrata e aprire solo quelle di cui hai bisogno. Qualcosa come questo:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT

1
Gilles, non hai letto male la domanda? Comprendo che la scatola di Scientific Linux è uno dei computer su LAN, ma non il firewall.
rozcietrzewiacz,

@Gilles Sì, la scatola è uno dei computer sulla LAN.
hpy,

@rozcietrzewiacz Comprendo che il firewall si trova sullo stesso computer del server. Concordo sul fatto che la domanda sia in qualche modo ambigua, ma poiché penyuan ha menzionato solo il sistema operativo di una macchina, presumo che tutto stia accadendo su quella macchina. Altrimenti questa non sarebbe una domanda unix, questa sarebbe una domanda di amministratore di rete non specificata.
Gilles 'SO- smetti di essere malvagio' il

1

Il modo preferito per farlo è con iptables. Sembra che sia stato adeguatamente coperto da altri, quindi, solo per completezza, indicherò un metodo di controllo degli accessi alternativo che è disponibile per molti demoni sulla maggior parte delle distribuzioni Linux. Tale metodo di controllo dell'accesso è fornito dalla libwraplibreria.

Per verificare se il tuo demone preferito ha libwrapsupporto, prova a eseguire quanto segue:

ldd `which sshd` | grep libwrap

Se si ottiene un risultato non vuoto, ad esempio

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

allora sei decisamente bravo ad andare.

È quasi una certezza che il tuo sshddemone abbia libwrapsupporto, quindi dovrebbe consultare i file /etc/hosts.allowe /etc/hosts.denyper il controllo degli accessi. Supponendo che la tua rete LAN locale sia 192.168.100.0/24, puoi negare l' accesso a sshdtutti i client tranne quelli sull'host locale o sulla LAN locale inserendo quanto segue nel tuo /etc/hosts.denyfile:

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

Si noti che questo metodo in realtà non apre o chiude le porte di per sé. Indica semplicemente ai demoni che utilizzano questo metodo di controllo dell'accesso se accettare o rifiutare i tentativi di connessione dai client che corrispondono ai modelli dati.

Per i dettagli completi, controlla le pagine man, a partire da hosts_access(5).


1

Se hai il tuo firewall basato su Linux, dovresti configurarlo meglio iptables, come altri descrivono qui. Altrimenti e il firewall è il tuo router, molto probabilmente la configurazione predefinita impedisce già l'accesso dall'esterno, a meno che tu non abiliti esplicitamente il port forwarding (come ho recentemente descritto in risposta a questa domanda ).

Per ulteriore sicurezza, puoi usare una sottorete separata per le connessioni in-LAN. Per fare ciò, per ogni computer aggiungere un secondo indirizzo IP che sarebbe utilizzato solo all'interno della LAN e non dal router. Supponiamo che ora l'intera LAN stia utilizzando gli 192.168.0.xxxindirizzi e lo sia il router (gateway, firewall) 192.168.0.1. Quindi aggiungi un secondo indirizzo per ciascun computer, ad esempio:

ifconfig eth0:0 192.168.5.1/24

Successivamente, modifica la sshdconfigurazione per utilizzare solo questo indirizzo (in modo che non consenta l'accesso alle connessioni 192.168.0.xxx) - modifica /etc/ssh/sshd_confige modifica ListenAddressa quello della tua nuova sottorete ( 192.168.5.1nell'esempio sopra). Questo è tutto! Se non si configura il gateway per instradare la comunicazione di quella sottorete, dovrebbe essere separato dall'esterno.

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.