Lista bianca indirizzi IP di origine in CentOS 7


23

Voglio impostare il firewall CentOS 7 in modo tale che tutte le richieste in arrivo vengano bloccate, tranne che dagli indirizzi IP di origine che inserisco nella whitelist. E per gli indirizzi IP della whitelist tutte le porte dovrebbero essere accessibili.

Sono in grado di trovare poche soluzioni (non sono sicuro che funzioneranno) per, iptablesma CentOS 7 utilizza firewalld. Non riesco a trovare qualcosa di simile da raggiungere con il firewall-cmdcomando.

Le interfacce sono in zona pubblica. Inoltre ho già spostato tutti i servizi nell'area pubblica.

Risposte:


44

Lo farei aggiungendo fonti a una zona. Primo controllo quali fonti ci sono per la tua zona:

firewall-cmd --permanent --zone=public --list-sources

Se non ce ne sono, puoi iniziare ad aggiungerli, questa è la tua "whitelist"

firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32

(Ciò aggiunge un intero /24e un singolo IP, solo per avere un riferimento sia per una sottorete che per un singolo IP)

Imposta l'intervallo di porte che desideri aprire:

firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp

Questo fa solo le porte da 1 a 22. Se lo desideri, puoi ampliarlo.

Ora ricarica quello che hai fatto.

firewall-cmd --reload

E controlla il tuo lavoro:

 firewall-cmd --zone=public --list-all

Nota a margine / editoriale: non importa ma mi piace la zona "attendibile" per un set di IP in white list in firewalld. Puoi fare un'ulteriore valutazione leggendo i suggerimenti di Redhat sulla scelta di una zona .

Guarda anche:


Se desideri DROPpacchetti al di fuori di questa fonte, ecco un esempio per far cadere quelli al di fuori di quelli che /24ho usato come esempio prima, credo che tu possa usare delle regole avanzate per questo . Questo è concettuale, non l'ho testato (oltre a vedere che centos 7 accetta il comando), ma, dovrebbe essere abbastanza facile fare un tappo e vedere se si comporta come ti aspetteresti

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'

Grazie mille per aver risposto. Impossibile votare a causa della carenza di reputazione. Ma come faccio a eliminare tutti gli altri IP tranne quello che ho aggiunto usando i sorgenti?
Krishnandu Sarkar

Grazie @KrishnanduSarkar - hai ragione, per impostazione predefinita dovrebbe essere un rifiuto ICMP. Ma penso che puoi aggiungere una ricca regola per eliminare i pacchetti. Ho aggiunto un esempio alla mia risposta che penso funzionerà. Grazie per il voto, ho capito, se una risposta funziona, considera di accettare una risposta.
dougBTV,

Ottima risposta, fino ad ora avevo usato iptables.
Tensigh,

(!) Questa risposta non funzionerà come previsto per l'attuale configurazione FirewallD predefinita (le interfacce sono assegnate alla zona pubblica per impostazione predefinita).
Dess

25

Anche se una risposta è stata accettata e votata, non credo sia una risposta corretta. Non riesco a trovare una spiegazione chiara nella documentazione, ma dal comportamento implementato sembra che:

  1. l'interfaccia e la sorgente vengono utilizzate come selettori - quali zone attivare
  2. entrambi vengono ignorati per la zona predefinita (sempre attiva)

Quindi la risposta sarebbe:

  1. bloccare la zona predefinita, dire "pubblico" - nessuna porta aperta o servizi disponibili
  2. in un'altra zona, dire "lavoro": definire l'origine e le porte aperte

Ad esempio, supponendo che la zona predefinita sia pubblica e non abbia porte aperte, aggiungi l'origine e l'intervallo di porte alla zona di "lavoro":

$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp

ora controlla le zone attive (la zona predefinita è sempre attiva):

$ sudo firewall-cmd --get-active-zones

otterrai:

work
  sources: 192.168.0.0/24

quindi le regole di zona "lavoro" si applicheranno alla sottorete particolare. Avrai a disposizione una gamma di porte aperte per la "whitelist" = sottorete come richiesto. E, naturalmente, utilizzare l' --permanentopzione nelle --add-xxxistruzioni per mantenere fedele il comportamento.

A sua volta, tutte le porte o i servizi presenti nella zona "pubblica" (impostazione predefinita) verranno applicati a tutte le interfacce e gli indirizzi di origine.

$ sudo firewall-cmd --list-all-zones

public (default)
interfaces:
sources:
services:
ports: 
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

work (active)
interfaces: 
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Lo stesso sistema funziona per le interfacce. Dire aggiungendo l'interfaccia "ens3" alla zona "lavoro":

$ sudo firewall-cmd --zone=work --add-interface=ens3

userete le regole di zona "lavoro" per qualsiasi richiesta dalla particolare interfaccia - selettore più approssimativo di "sorgente".


4
Questa è la risposta migliore La parte più cruciale è la spiegazione che l'impostazione di un'interfaccia amplia l'accesso (nel caso in cui siano impostate le fonti). Ho avuto un problema che i porti erano accessibili anche se avevo la sourceswhitelist. Il motivo era che alla zona era assegnata un'interfaccia.
Pinkeen,

1
Per essere esattamente corretta, questa risposta richiede la rimozione di tutti i servizi predefiniti dalla publiczona, se presenti (questi servizi saranno disponibili a tutti gli indirizzi poiché le interfacce sono assegnate alla publiczona per impostazione predefinita). Oppure cambia la zona predefinita in un'altra: blocko drop(questa è una pratica comune). Oppure cambia il publictarget di zona in %%REJECT%%o DROP.
Dess

6

Disclaimer: in realtà non ho provato quello che sto suggerendo, qui, ma è abbastanza vicino all'ultima configurazione del firewall che ho fatto, quindi me ne vado. Firewalld offre alcune zone preconfigurate, proprio per questo scopo. Ce n'è uno chiamato "drop", che lascia cadere qualsiasi cosa entri, e uno chiamato "trusted", che consente qualsiasi connessione (cioè, quindi non dovresti nemmeno dover aprire le singole porte, penso). Il trucco è far scattare la zona giusta per quello che vuoi.

Firewalld applicherà le regole per una zona in base alla seguente precedenza:

  • Se l'IP di origine corrisponde a un IP di origine associato a una zona, lo utilizza.
  • Se l'IP di origine non corrisponde a nessuna zona particolare, controlla se esiste una zona configurata per l' interfaccia su cui è arrivato il pacchetto. Se ce n'è uno, lo usa.
  • Infine, se nient'altro corrisponde, utilizza la zona predefinita.

Quindi, prima di tutto, vuoi associare i tuoi IP fidati alla zona "fidata":

firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4

Quindi, imposta la tua zona predefinita su "drop" o associa la tua interfaccia ad essa:

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0

e quindi rendere effettive le modifiche (avviso: questo probabilmente lascerà cadere la connessione se lo stai facendo sulla rete e non hai aggiunto il tuo IP di origine all'area attendibile):

firewall-cmd --reload

Ovviamente, puoi anche provarli temporaneamente omettendo il "--permanent" (e quindi non devi nemmeno ricaricare).


blockpuò anche essere usato (invece di drop) se vuoi dire ad altri host che non stai parlando con loro ....
Gert van den Berg,

5

Gestisco i miei firewall in questo modo. Ecco il mio metodo preferito per realizzare ciò che vuoi.

# firewall-cmd --list-all

Vedrai che la tua zona predefinita è pubblica e i servizi abilitati sono dhcpv6-client e ssh. Non vogliamo servizi pubblici disponibili, giusto? Sono autorizzati solo gli IP autorizzati. Quindi rimuoviamo i due servizi pubblici.

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

Ora, autorizziamo un IP specifico che consente l'accesso a qualsiasi porta.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

Ora, autorizziamo un altro IP, che vogliamo avere accesso solo agli accessi SSH, http e https. Nessun altro porto.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'

Se ti connetti tramite SSH, assicurati di autorizzare il tuo IP prima di applicare il nuovo set di regole. Quando sei pronto per applicare le nuove regole.

#firewall-cmd --reload

2

Puoi gestirlo facilmente con Rich Rule.

Primo passo

firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0

Secondo passaggio - Aggiungi regola avanzata

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'

Tutte le porte sono accessibili da 192.168.2.2 dopo aver aggiunto la regola avanzata e bloccato tutte le porte da altre fonti.

Se aggiungerai qualsiasi porta o servizio con il comando seguente, sarà accessibile da tutte le fonti.

firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080

Se si desidera aprire una porta specifica per Ip specifici rispetto al comando seguente

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'

2

La risposta migliore da dougBTV è sbagliata. Non posso rispondere alla sua risposta perché non ho ancora i punti di ripetizione necessari, quindi spiegherò qui:

Sta usando la zona predefinita "pubblica". Sta collegando le reti a quella zona e quindi aprendo le porte su quella zona. Ma, in una configurazione predefinita, tutto il traffico passa attraverso la zona predefinita, non solo le reti di origine a cui ti colleghi. Quindi i suoi comandi --add-source non fanno alcuna differenza e i suoi comandi --add-port hanno ora permesso a tutto il mondo di accedere a quelle porte.

La seconda risposta di Normunds Kalnberzins è corretta. Vuoi creare una zona separata, collegare la tua rete / IP a quella zona e aprire le porte in quella zona.

In alternativa, puoi lasciare tutto nella zona predefinita e utilizzare le regole avanzate di firewalld per consentire l'accesso da determinati IP:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'

Ciò consente tutto il traffico da 192.168.2.2 a tutte le porte e poiché non ho specificato una zona, questa verrà applicata alla zona predefinita "pubblica" (usa --get-default-zone per verificare quale sia la tua zona predefinita e - get-active-zone per vedere quali zone sono attualmente in uso).

Per consentire l'accesso da questo IP solo a una porta specifica farei:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'

È consigliabile eseguire questi comandi senza --permanent (o --perm in breve) che influisce sul firewall attualmente in esecuzione. Dopo aver verificato che la tua regola funziona, eseguila di nuovo con --perm accodato in modo che venga ricordata nelle successive ricariche di firewalld.


1

Solo per aggiungere alla risposta Normunds:

$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp

Per bloccare tutto l'altro traffico:

$ sudo firewall-cmd --set-default-zone=drop

Avvertenza: se si accede da un computer remoto, ciò potrebbe disconnettere la sessione di accesso. Se l'impostazione IP della zona "lavoro" non è stata eseguita correttamente, non sarà possibile connettersi al server.

Per ricaricare il firewall:

$ sudo firewall-cmd --reload

Non sono riuscito a capire come aggiungere due IP diversi con "--add-rich-rule".


Per l'attuale configurazione predefinita di FirewallD potrebbe non essere sufficiente. Vedi il mio commento alla risposta di Normunds per i dettagli.
Dess

per più IP usa crea un ipsetlike firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipaggiungi ips all'ipset con firewall-cmd --ipset=blacklist --add-entry=192.168.1.4poi puoi usarefirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye

0

Sono sorpreso che le risposte alla zona attendibile non siano la risposta selezionata. La zona attendibile ha un "target: ACCEPT" predefinito mentre gli altri sono "target: default". Anche se in realtà non importa, sembra essere il metodo previsto a causa del suo nome e valore target predefinito.

Come bloccare rapidamente una casella in modo che solo tu possa accedervi:

firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones

Dopo aver elencato tutte le zone dovresti vedere qualcosa del genere:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  sources: 1.2.3.4 5.6.7.8/24
  masquerade: no

drop (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: eth1
  masquerade: no

Nota: ho rimosso le righe con un valore nullo / mancante. L'importante è che trusted e drop siano entrambi (attivi) e drop abbia la tua interfaccia pubblica.

Cosa fa iptables per la dimostrazione:

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination
IN_trusted  all  --  1.2.3.4         0.0.0.0/0
IN_trusted  all  --  5.6.7.8/24        0.0.0.0/0
Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
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.