2012-10-17 16 views
19

Ho una rete domestica con pc Linux, che ha tutti in esecuzione iptables. Penso che sia più facile mettere la mia LAN dietro un gateway/firewall Linux, quindi ho messo un pc (con fedora, senza gui) tra il mio router e la LAN e configurato iptables. Nessun problema qui, INPUT consente solo DNS (e alcune cose locali), l'inoltro funziona bene: la LAN si connette a Internet.iptables FORWARD e INPUT

Ma la mia domanda è: FORWARD consente tutto dall'esterno o solo le porte configurate con INPUT? FORWARD e INPUT lavorano insieme o sono separati?

Questo è il mio iptables:

*nat 
:PREROUTING ACCEPT [16:1336] 
:INPUT ACCEPT [14:840] 
:OUTPUT ACCEPT [30:2116] 
:POSTROUTING ACCEPT [0:0] 
-A POSTROUTING -o p1p1 -j MASQUERADE 
COMMIT 
# Completed on Tue Oct 16 09:55:31 2012 
# Generated by iptables-save v1.4.14 on Tue Oct 16 09:55:31 2012 
*filter 
:INPUT DROP [0:0] 
:FORWARD DROP [0:0] 
:OUTPUT ACCEPT [91:9888] 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
-A INPUT -p UDP --dport 53 -j ACCEPT 
-A INPUT -p TCP --dport 53 -j ACCEPT 
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp -m multiport --dports 20,21 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp -m multiport --dports 20,21 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp -m tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp -m tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -i p1p1 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -i p1p1 -p tcp -m multiport --dports 20,21,443 -j DROP 
-A INPUT -i p1p1 -p tcp --dport 5000:5100 -j DROP 
-A INPUT -i p1p1 -p icmp -m icmp --icmp-type 8 -j DROP 
-A FORWARD -s 192.168.2.0/24 -j ACCEPT 
-A FORWARD -d 192.168.2.0/24 -j ACCEPT 
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 
-A OUTPUT -j LOG --log-prefix "denied out: " 

COMMIT 

p1p1 (.1.x) è il mio nic esterno, p3p1 (.2.x) è interno.

risposta

55

INPUT, FORWARD e OUTPUT sono separati. Un pacchetto colpirà solo una delle tre catene.

Se la destinazione è a, questo server, colpisce la catena INPUT. Se la sua origine è da questo server, viene visualizzato OUTPUT. Se la fonte e la destinazione sono entrambe le altre macchine, tramite il del server —, vengono indirizzate alla catena FORWARD.

+1

Quindi, se ho capito bene, ho INPUT protetto (sorta di), ma FORWARD lascia tutto attraverso il modo in cui è ora? Speravo che il traffico venisse prima filtrato da INPUT e poi inoltrato. – Ray

+0

Traffico dall'esterno, cioè. – Ray

+0

@Ray Right. Un pacchetto che passa attraverso la tua casella colpisce solo FORWARDED. Non fa INPUT → FORWARDED → OUTPUT. –

59

RedHat ha un great doc about iptables (un po 'lungo), ma al soggetto di copertura è complessa e ci sono così tanti casi d'uso differenti che non vedo come evitarlo.

iptables kernel routing

Ecco il capitolo relativo FORWARD and NAT Rules. Come si afferma:

Ad esempio, se si desidera HTTP avanti arrivo richiede al dedicato Server HTTP Apache a 172.31.0.23, utilizzare il seguente comando come utente root:

~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80 

Ecco cosa succede:

  • il gateway linux riceve un pacchetto dal router. L'intestazione del pacchetto è:
    • fonte: x.x.x.x:y (mittente IP dal porto & sorgente Internet utilizzato per la trasmissione di pacchetti)
    • destinazione: 192.168.1.1:80 (supponendo che il gateway IP di Linux sulla scheda di rete esterna, vale a dire p1p1)
  • il gateway linux applica la catena PREROUTING per trovare una corrispondenza.Supponendo di aver digitato ciò che è al di sopra, il pacchetto corrisponde alla regola e quindi chiama (salta -j) alla funzione DNAT (Destinazione Network Address Translation), che cambia la destinazione dell'intestazione del pacchetto dagli iniziali 192.168.1.1:80 a 172.31.0.23:80.
  • quindi il pacchetto arriva alla Decisione di routing. La destinazione del pacchetto è ora 172.31.0.23:80.
    • Il gateway linux si chiede: è per me (192.168.1.1:80)? No, quindi I non invierà alla catena INPUT.
    • => Lo invierò alla catena AVANTI.
  • dal momento che avete impostato le regole per inoltrare tutte sulla rete locale (tabella filter catena FORWARD), il pacchetto dovrebbe essere trasmesso correttamente al locale server Apache HTTP (per esempio).

Spero vi aiuterà a capire un po 'di più come il routing interno funziona con iptables.