Nel nostro precedente articolo sulla serie di firewall IPTables, abbiamo esaminato come aggiungere una regola firewall utilizzando "iptables -A".
Abbiamo anche spiegato come consentire la connessione SSH in entrata. Ad alto livello, implica seguire 3 passaggi.
- Elimina tutte le regole esistenti:"iptables -F"
- Consenti solo SSH in entrata:“iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT”
- Elimina tutti gli altri pacchetti in arrivo:“iptables -A INPUT -j DROP”
Quanto sopra funziona. Ma non è completo. Un problema con i passaggi precedenti è che non limita i pacchetti in uscita.
Politica catena predefinita
La politica predefinita di una catena è ACCEPT. Se non sai cosa significa una catena, è meglio leggere il nostro articolo introduttivo di iptables. Quindi, la politica predefinita della catena INPUT e OUTPUT è ACCEPT. Nei 3 passaggi precedenti abbiamo eliminato tutti i pacchetti in arrivo alla fine (tranne ssh in arrivo). Tuttavia, non abbiamo limitato il traffico in uscita.
Come si nota di seguito, accanto a tutti e tre i nomi delle catene (INPUT, OUTPUT e FORWARD) viene visualizzato "(policy ACCEPT)". Ciò indica che la policy della catena predefinita è ACCEPT.
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Quindi, hai due opzioni qui.
Opzione 1:aggiungi regole di rilascio
Alla fine, aggiungi le seguenti tre regole di rilascio che rilasceranno tutti i pacchetti in entrata, in uscita e in avanti (tranne quelli definiti sopra queste tre regole). Se lo fai, la politica della catena predefinita è ancora ACCEPT, il che non dovrebbe avere importanza, poiché stai comunque eliminando tutti i pacchetti alla fine.
iptables -A INPUT -j DROP iptables -A OUTPUT -j DROP iptables -A FORWARD -j DROP
Opzione 2:cambia la policy della catena predefinita in DROP
All'inizio, esegui i tre comandi seguenti che cambieranno la politica predefinita della catena in DROP.
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
Ora, se aggiungi la regola allow ssh:"iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT", e fai iptables -L, noterai che dice "(policy DROP)" accanto a tutte e tre le catene.
# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination
Ma c'è un problema qui. La regola per la connessione in entrata consenti ssh non funzionerà più, perché tutti i pacchetti in uscita vengono eliminati.
Consenti connessioni in entrata
Quando il criterio predefinito è DROP per le catene INPUT e OUTPUT, per ogni regola del firewall in ingresso è necessario specificare le due regole seguenti.
- Regola richiesta:questa è la richiesta che arriva dal client al server per la connessione in entrata.
- Regola di risposta:questa è per la risposta che va dal server al client (per la richiesta in entrata corrispondente).
Esempio 1:Consenti connessione SSH in entrata
Questo per consentire la connessione SSH dall'esterno al tuo server. cioè puoi inviare ssh al tuo server dall'esterno.
Ciò comporta due passaggi. Innanzitutto, dobbiamo consentire le nuove connessioni SSH in entrata. Una volta che la connessione ssh in entrata è consentita, dobbiamo anche consentire la risposta per quella connessione ssh in entrata.
Innanzitutto, Consenti richiesta di connessione SSH in entrata, come mostrato di seguito.
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Nell'esempio sopra:
- iptables -A INPUT:Aggiunge la nuova regola alla catena INPUT. Per la richiesta di connessione in entrata, questo deve sempre essere INPUT.
- -i eth0:si riferisce all'interfaccia di input. Per le connessioni in entrata, questo deve sempre essere "-i".
- -p tcp:indica che questo è per il protocollo TCP.
- –dport 22:si riferisce alla porta di destinazione per la connessione in entrata. La porta 22 è per ssh.
- -m state:indica che viene utilizzato il modulo di corrispondenza “state”. Discuteremo di più sull'opzione "-m" (e su tutti i moduli corrispondenti disponibili per iptables) in un articolo futuro.
- –state NEW, ESTABLISHED:Opzioni per il modulo di corrispondenza “state”. In questo esempio sono consentiti solo gli stati NEW e ESTABLISHED. La prima volta che viene avviata una richiesta di connessione SSH dal client al server, viene utilizzato lo stato NEW. Lo stato ESTABLISHED viene utilizzato per tutte le ulteriori richieste dal client al server.
Quindi, Consenti risposta alla connessione SSH in uscita (solo stato ESTABLISHED) (per la richiesta di connessione SSH in entrata corrispondente).
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Nell'esempio sopra:
- iptables -A OUTPUT:aggiunge la nuova regola alla catena OUTPUT. Poiché questo è per la regola di risposta (per la richiesta in entrata corrispondente) che esce dal server, questo dovrebbe essere OUTPUT.
- -o eth0:fa riferimento all'interfaccia di output. Per le connessioni in uscita, questo deve sempre essere "-o".
- -p tcp:indica che questo è per il protocollo TCP.
- –sport 22:si riferisce alla porta di origine per la connessione in uscita. La porta 22 è per ssh. Poiché la richiesta in entrata (dalla regola precedente) è arrivata alla porta "destinazione", la risposta in uscita passerà attraverso la porta "origine".
- -m state:indica che viene utilizzato il modulo di corrispondenza "state".
- –stato ESTABLISHED:poiché questa è una regola di risposta, consentiamo solo una connessione ESTABLISHED (e non una nuova connessione).
Esempio 2:Consenti connessione HTTP in entrata
Questo per consentire la connessione HTTP dall'esterno al tuo server. cioè puoi visualizzare il tuo sito web in esecuzione sul server dall'esterno.
Proprio come le regole in entrata SSH sopra, anche questo comporta due passaggi. Innanzitutto, dobbiamo consentire la nuova connessione HTTP in entrata. Una volta consentita la connessione HTTP in entrata, è necessario consentire la risposta per quella connessione HTTP in entrata.
Innanzitutto, Consenti richiesta di connessione HTTP in entrata, come mostrato di seguito.
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
Quindi, Consenti risposta alla connessione HTTP in uscita (solo ESTABLISHED) (per la corrispondente richiesta di connessione SSH in entrata).
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Nota:nella regola di richiesta e risposta HTTP sopra, tutto è uguale all'esempio SSH tranne il numero di porta.
Consenti connessioni in uscita
Quando il criterio predefinito è DROP per le catene INPUT e OUTPUT, per ogni regola del firewall in uscita, devi specificare le due regole seguenti.
- Regola richiesta:questa è la richiesta che esce dal server all'esterno per la connessione in uscita.
- Regola di risposta:questa è per la risposta che ritorna dall'esterno al server (per la corrispondente richiesta in uscita).
Esempio 3:Consenti connessione SSH in uscita
Questo per consentire la connessione SSH dal tuo server all'esterno. cioè puoi inviare ssh al server esterno dal tuo server.
Ciò comporta due passaggi. Innanzitutto, dobbiamo consentire la nuova connessione SSH in uscita. Una volta consentita la connessione ssh in uscita, è necessario consentire anche la risposta per quella connessione ssh in uscita.
Innanzitutto, Consenti richiesta di connessione SSH in uscita, come mostrato di seguito.
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Nell'esempio sopra:
- iptables -A OUTPUT:aggiunge la nuova regola alla catena OUTPUT. Per la richiesta di connessione in uscita, deve essere sempre OUTPUT.
- -o eth0:fa riferimento all'interfaccia di output. Per le connessioni in uscita, questo deve sempre essere "-o".
- -p tcp:indica che questo è per il protocollo TCP.
- –dport 22:si riferisce alla porta di destinazione per la connessione in uscita.
- -m state:indica che viene utilizzato il modulo di corrispondenza "state".
- –state NEW, ESTABLISHED:Opzioni per il modulo di corrispondenza “state”. In questo esempio sono consentiti solo gli stati NEW e ESTABLISHED. La prima volta che viene avviata una richiesta di connessione SSH dal server all'esterno, viene utilizzato lo stato NEW. Lo stato ESTABLISHED viene utilizzato per tutte le ulteriori richieste dal server all'esterno.
Quindi, Consenti risposta alla connessione SSH in uscita (solo ESTABLISHED) (per la corrispondente richiesta di connessione SSH in entrata).
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Nell'esempio sopra:
- iptables -A INPUT:Aggiunge la nuova regola alla catena INPUT. Poiché questo è per la regola di risposta (per la corrispondente richiesta in uscita) che arriva dall'esterno al server, questo dovrebbe essere INPUT.
- -i eth0:fa riferimento all'interfaccia di input. Per le connessioni in entrata, questo deve sempre essere "-i".
- -p tcp:indica che questo è per il protocollo TCP.
- –sport 22:si riferisce alla porta di origine per la connessione in entrata. Poiché la richiesta in uscita (dalla regola precedente) è andata alla porta "destinazione", la risposta in arrivo verrà dalla porta "origine".
- -m state:indica che viene utilizzato il modulo di corrispondenza "state".
- –stato ESTABLISHED:poiché questa è una regola di risposta, consentiamo solo una connessione ESTABLISHED (e non una nuova connessione).
Mettere tutto insieme
Crea lo script della shell rules.sh che esegue le seguenti operazioni:
- Elimina tutte le regole esistenti
- Imposta criteri di catena predefiniti
- Consenti SSH in entrata
- Consenti HTTP in entrata
- Consenti SSH in uscita
Innanzitutto, crea il rules.sh
$ vi rules.sh # 1. Delete all existing rules iptables -F # 2. Set default chain policies iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # 3. Allow incoming SSH iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 4. Allow incoming HTTP iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # 5. Allow outgoing SSH iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Quindi, esegui rules.sh e visualizza le regole.
# chmod u+x rules.sh # ./rules.sh # iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp spt:http state ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
Usando questo come base dovresti essere in grado di scrivere le tue regole firewall iptables in entrata e in uscita. C'è molto altro da trattare in IPtables. Resta sintonizzato!
Articoli precedenti nella serie iptables:
- Esercitazione sul firewall di Linux:tabelle IPTables, catene, nozioni fondamentali sulle regole
- IPTables Flush:elimina/rimuove tutte le regole su RedHat e CentOS Linux
- Linux IPTables:come aggiungere regole firewall (con l'esempio di SSH consentito)