3 155
contributi
Wtf (discussione | contributi) m (→LAN casalinga) |
Wtf (discussione | contributi) Nessun oggetto della modifica |
||
(19 versioni intermedie di 2 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili}} | {{Versioni compatibili}}{{Gateway-Router}} | ||
==Introduzione a IPTables/Netfilter== | ==Introduzione a IPTables/Netfilter== | ||
Questo semplice HOW-TO è rivolto a tutti coloro che usano iptables (molti, credo) con Debian GNU/Linux. | Questo semplice HOW-TO è rivolto a tutti coloro che usano iptables (molti, credo) con Debian GNU/Linux. | ||
Riga 20: | Riga 20: | ||
* '''filter''', la tabella usata per decidere il destino dei pacchetti, ovvero accettarli o scartarli. È, usando un'espressione impropria, la tabella delle regole del firewall; | * '''filter''', la tabella usata per decidere il destino dei pacchetti, ovvero accettarli o scartarli. È, usando un'espressione impropria, la tabella delle regole del firewall; | ||
* '''nat''', la tabella usata per alterare e instradare i pacchetti. Questa tabella viene usata per esempio per sostituire l'ip sorgente di un pacchetto in uscita dalla LAN (masquerading) o per reindirizzare ad una certa macchina della LAN tutti i pacchetti provenienti da internet e diretti verso una certa porta. | * '''nat''', la tabella usata per alterare e instradare i pacchetti. Questa tabella viene usata per esempio per sostituire l'ip sorgente di un pacchetto in uscita dalla LAN (masquerading) o per reindirizzare ad una certa macchina della LAN tutti i pacchetti provenienti da internet e diretti verso una certa porta. | ||
{{Box|Nota|Omettere la dichiarazione della tabella di riferimento equivale a dichiarare implicitamente ''filter'' come tabella di riferimento.}} | |||
Le catene possono essere pensate come le colonne che compongono le tabelle. | Le catene possono essere pensate come le colonne che compongono le tabelle. | ||
* ''filter'' | * ''filter'' | ||
Riga 29: | Riga 32: | ||
** '''OUTPUT''', raggruppa tutte le regole che modificano i pacchetti generati dalla macchina prima di transitare attraverso la catena ''output'' della tabella ''filter''; | ** '''OUTPUT''', raggruppa tutte le regole che modificano i pacchetti generati dalla macchina prima di transitare attraverso la catena ''output'' della tabella ''filter''; | ||
** '''POSTROUTING''', raggruppa tutte le regole che modificano i pacchetti in uscita da una delle interfacce della macchina, dopo che hanno già oltrepassato la tabella ''filter'', catena ''output'' o catena ''forwarding'' a seconda della provenienza del pacchetto; | ** '''POSTROUTING''', raggruppa tutte le regole che modificano i pacchetti in uscita da una delle interfacce della macchina, dopo che hanno già oltrepassato la tabella ''filter'', catena ''output'' o catena ''forwarding'' a seconda della provenienza del pacchetto; | ||
Se si considerano le sole due tabelle qui descritte l'ordine di transito | Se si considerano le sole due tabelle qui descritte l'ordine di transito dei pacchetti attraverso le diverse catene è il seguente: | ||
# '''nat PREROUTING''' | # '''nat PREROUTING''' | ||
# instradamento del pacchetto: | # instradamento del pacchetto: | ||
Riga 40: | Riga 43: | ||
# nuovo instradamento del pacchetto | # nuovo instradamento del pacchetto | ||
# '''nat POSTROUTING''' | # '''nat POSTROUTING''' | ||
{{Suggerimento|Un bel diagramma di flusso completo è quello realizzato da [https://stuffphilwrites.com/2014/09/iptables-processing-flowchart/ Phil Hagens].}} | |||
==Iniziamo== | ==Iniziamo== | ||
Riga 121: | Riga 126: | ||
== Esempi == | == Esempi == | ||
=== LAN | === LAN domestica === | ||
==== Wireless access point ==== | |||
Nel caso più semplice non è necessario configurare iptables poiché per comportamento predefinito questo permette il passaggio di tutti i dati. L'unica modifica necessaria è a livello di kernel per abilitare il ''forwarding'', ovvero è necessario modificare il file <code>/etc/sysctl.conf</code> impostando a ''1'' il valore del parametro <code>net.ipv4.ip_forward</code>. | |||
Questo non esclude naturalmente che l'utente debba saper configurare correttamente le interfacce di rete necessarie (nel caso dare uno sguardo all'esempio ''Wireless access point e ADSL'' in cui vengono elencate alcune guide di debianizzati). | |||
==== Wireless access point e ADSL ==== | |||
Macchina dedicata al ruolo di router/gateway/firewall. È dato per scontato quanto segue: | |||
* configurazione corretta dell'interfaccia wireless in modalità master ([[Wireless Access Point (WAP) personalizzato]]) | |||
* configurazione corretta di un bridge di rete per le interfacce cablate e senza fili ([[Ethernet Bridging]]) | |||
* configurazione corretta di una connessione ADSL ([[Pppoeconf]]) | |||
* configurazione corretta di server DNS e DHCP qualora tali servizi non fossero già disponibili ([[Un server DNS e DHCP su Debian]]) | |||
Di seguito un esempio di script bash per inserire tutte le regole del caso. | |||
* <code>ppp0</code> è l'interfaccia di collegamento al modem ADSL | |||
* <code>br0</code> è il bridge tra <code>eth0</code> e <code>wlan0</code> che consente il collegamento ad internet di tutti gli altri dispositivi della LAN. | |||
<pre> | <pre> | ||
Riga 148: | Riga 168: | ||
# Accetta tutte le connessioni già stabilite | # Accetta tutte le connessioni già stabilite | ||
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | ||
# Accetta anche le nuove connessioni per le porte 4662 e 4672 | # Accetta anche le nuove connessioni per le porte 4662 e 4672 | ||
iptables -A INPUT | iptables -A INPUT -m state --state NEW -p tcp --dport 4662 -j ACCEPT | ||
iptables -A INPUT | iptables -A INPUT -m state --state NEW -p udp --dport 4672 -j ACCEPT | ||
# Accetta tutte le nuove connessioni SSH | # Accetta tutte le nuove connessioni SSH | ||
iptables -A INPUT | iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT | ||
# Permettere ping | # Permettere ping | ||
Riga 186: | Riga 203: | ||
# purché veicolato da connessioni già stabilite o ad esse riconducibile | # purché veicolato da connessioni già stabilite o ad esse riconducibile | ||
iptables -A FORWARD -i ppp0 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT | iptables -A FORWARD -i ppp0 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT | ||
# Programmi specifici | # Programmi specifici, ad esempio un server di COD4 | ||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport | iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20800 -j ACCEPT | ||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport | iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20800 -j ACCEPT | ||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20810 -j ACCEPT | |||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW --dport | iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20810 -j ACCEPT | ||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW --dport | iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 28960 -j ACCEPT | ||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW --dport 28960 -j ACCEPT | iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 28960 -j ACCEPT | ||
# Non inoltrare il restante traffico in entrata | # Non inoltrare il restante traffico in entrata | ||
iptables -A FORWARD -i ppp0 -o br0 -j REJECT | iptables -A FORWARD -i ppp0 -o br0 -j REJECT | ||
Riga 210: | Riga 227: | ||
# ---------------- | # ---------------- | ||
# COD4 | # Programmi specifici, ad esempio un server di COD4 | ||
iptables -t nat -A PREROUTING -i ppp0 --dport 20800 -j DNAT --to-destination 192.168.1.172 | iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20800 -j DNAT --to-destination 192.168.1.172 | ||
iptables -t nat -A PREROUTING -i ppp0 --dport 20810 -j DNAT --to-destination 192.168.1.172 | iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20800 -j DNAT --to-destination 192.168.1.172 | ||
iptables -t nat -A PREROUTING -i ppp0 --dport 28960 -j DNAT --to-destination 192.168.1.172 | iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20810 -j DNAT --to-destination 192.168.1.172 | ||
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20810 -j DNAT --to-destination 192.168.1.172 | |||
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 28960 -j DNAT --to-destination 192.168.1.172 | |||
Riga 220: | Riga 239: | ||
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE | iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE | ||
</pre> | |||
==== Uso di una VPN commerciale ==== | |||
{{Suggerimento|Prima di procedere si consiglia la lettura della corrispondente sezione presente nella guida dedicata a [[Openvpn]].}} | |||
===== Caso 1 ===== | |||
Questo esempio si basa sulla precedente configurazione (''Wireless access point e ADSL'') per adattarla al caso in cui si decida di configurare il proprio gateway per far transitare tutto il traffico della propria LAN attraverso un tunnel VPN. Si ipotizza inoltre che sul computer che agisce come gateway sia in funzione un servizio che richiede di accettare nuove connessioni dall'esterno attraverso la porta 6666 e che il proprio fornitore di VPN permetta di reindirizzare una sola porta, la 6666 appunto (motivo per cui è stato eliminata la parte di configurazione relativa al forwording delle nuove connessioni come quelle basate sulla porta 20800). | |||
{{Box|Nota|La seguente configurazione farà si che tutte le connessioni provenienti da internet non transitanti per il tunnel VPN saranno rifiutate.}} | |||
<pre> | |||
#!/bin/bash | |||
# | |||
# INTERFACCE: br0 è l'interfaccia LAN, mentre ppp0 quella ADSL | |||
# ------------ | |||
# FILTER TABLE | |||
# ------------ | |||
# INPUT chain | |||
# ----------- | |||
# Politica del negare in modo .predefinito quando non esplicitamente permesso | |||
iptables -P INPUT DROP | |||
# Permette tutto il traffico su loopback (lo0) ed elimina tutto il traffico che non usa lo0 verso 127/8 | |||
iptables -A INPUT -i lo -j ACCEPT | |||
iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT | |||
# Accetta tutte le nuove connessioni che NON provengono da internet | |||
iptables -A INPUT -m state --state NEW -i br0 -j ACCEPT | |||
# Accetta tutte le connessioni già stabilite | |||
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | |||
# Accetta anche le nuove connessioni per la porta 6666 | |||
iptables -A INPUT -i tun0 -m state --state NEW -p tcp --dport 6666 -j ACCEPT | |||
# Permettere ping | |||
# notare che bloccare altri tipi di pacchetti icmp è considerata da alcuni una cattiva idea | |||
# rimuovere -m icmp --icmp-type 8 da questa riga per permettere tutti i tipi di icmp: | |||
# https://security.stackexchange.com/questions/22711 | |||
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT | |||
# Registrare le sole chiamate negate (accesso via il comando 'dmesg') | |||
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 | |||
# Respingere tutto il resto del traffico in entrata: politica del negare | |||
# in modo predefinito quando non esplicitamente permesso | |||
iptables -A INPUT -j REJECT | |||
# OUTPUT chain | |||
# ------------ | |||
# Imposta il comportamento predefinito (accetta tutto) | |||
iptables -P OUTPUT ACCEPT | |||
# FORWARD chain | |||
# ------------- | |||
# Imposta il comportamento predefinito (scarta tutto) | |||
iptables -P FORWARD DROP | |||
# Accetta tutto il traffico entrante diretto alla lan (br0), | |||
# purché veicolato da connessioni già stabilite o ad esse riconducibile | |||
iptables -A FORWARD -i ppp0 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT | |||
# Non inoltrare il restante traffico in entrata | |||
iptables -A FORWARD -i tun0 -o br0 -j REJECT | |||
# Inoltra tutto il traffico uscente proveniente dalla LAN | |||
iptables -A FORWARD -i br0 -o tun0 -j ACCEPT | |||
# Inoltra tutto il traffico proveniente da wlan0 a eth0 e viceversa (quindi entrante e uscente | |||
# da br0) | |||
iptables -A FORWARD -i br0 -o br0 -j ACCEPT | |||
# --------- | |||
# NAT table | |||
# --------- | |||
# POSTROUTING chain | |||
# ----------------- | |||
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE | |||
</pre> | |||
===== Caso 2 ===== | |||
Anche questo esempio si basa sulla precedente configurazione (''Wireless access point e ADSL''), ma diversamente dal caso precedente qui si presenta la situazione in cui parte del traffico internet non venga dirottato verso il tunnel VPN. In particolare si suppone come prima di avere un servizio sulla porta 6666 accessibile da internet solo attraverso il tunnel VPN ed altri applicativi accessibili sulle porte 22, 4662 e 4672, ma solo dalla normale interfaccia adsl. | |||
In tale situazione, onde evitare il rischio che qualcuno possa correlare l'IP di uscita della VPN a quello pubblico proprio, si impostano delle regole anche nella catena di output, in modo che sia impossibile per un servizio rispondere sia attraverso l'interfaccia ADSL che il tunnel VPN. | |||
{{Box|Nota|Per permettere il traffico internet in ingresso sull'interfaccia ppp0 è necessario creare e configurare un'apposita tabella di routing aggiuntiva a quella predefinita.}} | |||
<pre> | |||
#!/bin/bash | |||
# | |||
# INTERFACCE: br0 è l'interfaccia LAN, mentre ppp0 quella ADSL | |||
# ------------ | |||
# FILTER TABLE | |||
# ------------ | |||
# INPUT chain | |||
# ----------- | |||
# Politica del negare in modo .predefinito quando non esplicitamente permesso | |||
iptables -P INPUT DROP | |||
# Permette tutto il traffico su loopback (lo0) ed elimina tutto il traffico che non usa lo0 verso 127/8 | |||
iptables -A INPUT -i lo -j ACCEPT | |||
iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT | |||
# Accetta tutte le nuove connessioni che NON provengono da internet (ppp0) | |||
iptables -A INPUT -m state --state NEW -i br0 -j ACCEPT | |||
# Accetta tutte le connessioni già stabilite | |||
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | |||
# Accetta tutte le nuove connessioni SSH | |||
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 22 -j ACCEPT | |||
# Accetta anche le nuove connessioni per le seguenti porte | |||
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 4662 -j ACCEPT | |||
iptables -A INPUT -i ppp0 -m state --state NEW -p udp --dport 4672 -j ACCEPT | |||
iptables -A INPUT -i tun0 -m state --state NEW -p tcp --dport 6666 -j ACCEPT | |||
# Permettere ping | |||
# notare che bloccare altri tipi di pacchetti icmp è considerata da alcuni una cattiva idea | |||
# rimuovere -m icmp --icmp-type 8 da questa riga per permettere tutti i tipi di icmp: | |||
# https://security.stackexchange.com/questions/22711 | |||
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT | |||
# Registrare le sole chiamate negate (accesso via il comando 'dmesg') | |||
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 | |||
# Respingere tutto il resto del traffico in entrata: politica del negare | |||
# in modo predefinito quando non esplicitamente permesso | |||
iptables -A INPUT -j REJECT | |||
# OUTPUT chain | |||
# ------------ | |||
# Imposta il comportamento predefinito (accetta tutto) | |||
iptables -P OUTPUT ACCEPT | |||
# Blocca le connessioni in uscita sulle interfacce "errate". | |||
iptables -A OUTPUT -o tun0 -p tcp --dport 22 -j REJECT | |||
iptables -A OUTPUT -o tun0 -p tcp --dport 4662 -j REJECT | |||
iptables -A OUTPUT -o tun0 -p udp --dport 4672 -j REJECT | |||
iptables -A OUTPUT -o ppp0 -p tcp --dport 6666 -j REJECT | |||
# FORWARD chain | |||
# ------------- | |||
# Imposta il comportamento predefinito (scarta tutto) | |||
iptables -P FORWARD DROP | |||
# Inoltra tutto il traffico proveniente dalla LAN | |||
iptables -A FORWARD -i br0 -j ACCEPT | |||
# Accetta tutto il traffico entrante diretto alla lan (br0), | |||
# purché veicolato da connessioni già stabilite o ad esse riconducibile | |||
iptables -A FORWARD ! -i br0 -m state --state ESTABLISHED,RELATED -j ACCEPT | |||
# Programmi specifici, ad esempio un server di COD4 | |||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20800 -j ACCEPT | |||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20800 -j ACCEPT | |||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20810 -j ACCEPT | |||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20810 -j ACCEPT | |||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 28960 -j ACCEPT | |||
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 28960 -j ACCEPT | |||
# Non inoltrare il restante traffico in entrata proveniente da internet, a prescindere | |||
# che arrivi da tun0 o ppp0 | |||
iptables -A FORWARD ! -i br0 -j REJECT | |||
# --------- | |||
# NAT table | |||
# --------- | |||
# PREROUTING chain | |||
# ---------------- | |||
# Programmi specifici, ad esempio un server di COD4 | |||
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20800 -j DNAT --to-destination 192.168.1.172 | |||
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20800 -j DNAT --to-destination 192.168.1.172 | |||
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20810 -j DNAT --to-destination 192.168.1.172 | |||
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20810 -j DNAT --to-destination 192.168.1.172 | |||
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 28960 -j DNAT --to-destination 192.168.1.172 | |||
# POSTROUTING chain | |||
# ----------------- | |||
iptables -t nat -A POSTROUTING ! -o br0 -j MASQUERADE | |||
</pre> | </pre> | ||
Riga 231: | Riga 441: | ||
=== Sitografia === | === Sitografia === | ||
* [http://a2.pluto.it/ | * [http://a2.pluto.it/a2/a258.htm#almlindex4169 sez. "IPTables per l'amministrazione del firewall" di Appunti di informatica libera]; | ||
* [http://www.netfilter.org/ homepage degli sviluppatori di netfilter]: sono presenti una ottima mailinglist (consigliata) e ricca documentazione. | * [http://www.netfilter.org/ homepage degli sviluppatori di netfilter]: sono presenti una ottima mailinglist (consigliata) e ricca documentazione. | ||
* [https://wiki.debian.org/it/iptables iptables] su wiki.debian.org | * [https://wiki.debian.org/it/iptables iptables] su wiki.debian.org |
contributi