GNU/Linux >> Linux Esercitazione >  >> Linux

Linux IPTables:esempi di regole in entrata e in uscita (SSH e HTTP)

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.

  1. Elimina tutte le regole esistenti:"iptables -F"
  2. Consenti solo SSH in entrata:“iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT”
  3. 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.

  1. Regola richiesta:questa è la richiesta che arriva dal client al server per la connessione in entrata.
  2. 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.

  1. Regola richiesta:questa è la richiesta che esce dal server all'esterno per la connessione in uscita.
  2. 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:

  1. Elimina tutte le regole esistenti
  2. Imposta criteri di catena predefiniti
  3. Consenti SSH in entrata
  4. Consenti HTTP in entrata
  5. 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)

Linux
  1. Procedura:Linux generale – IPtables in generale

  2. Linux IPTables:come aggiungere regole firewall (con esempio Consenti SSH)

  3. 25 Esempi di regole IPtables Linux più utilizzate

  4. 11 Utili comandi “ssh” e “scp” in Linux

  5. swapon e swapoff Esempi di comandi in Linux

Stabilire una connessione SSH tra Windows e Linux

19 comandi SSH comuni in Linux con esempi

Comandi SSH in Linux con esempi di utilizzo

Opzioni di comando ed esempi di Tee Command in Linux

50 esempi semplici e utili di comando Trova in Linux

16 Esempi pratici e utili di Echo Command in Linux