reindirizzamento della porta iptables non funzionante per localhost


55

Voglio reindirizzare tutto il traffico dalla porta 443 alla porta interna 8080. Sto usando questa configurazione per iptables:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

Questo funziona per tutti i client esterni. Ma se sto provando ad accedere alla porta 443 dalla stessa macchina vedrò un errore di connessione rifiutata.

wget https://localhost

Come posso estendere la regola iptables per reindirizzare anche il traffico locale?


Questo argomento fornisce una risposta più generale: serverfault.com/questions/380447/iptables-preroute-localhost
Jeroen,

1
Qualcuno con rep può aggiungere una barra rovesciata al comando prima dell'interruzione di riga?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Risposte:


69

PREROUTING non viene utilizzato dall'interfaccia di loopback, è inoltre necessario aggiungere una regola OUTPUT:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080

3
Non è necessaria la prima regola. I pacchetti generati localmente non passano attraverso la catena PREROUTING.
Khaled,

9
Ho aggiunto la regola iniziale per il bene dell'eliminazione, poiché vuole reindirizzare anche il traffico esterno. La regola non ha bisogno di origine / destinazione se dicono solo di accettare tutti gli IP
Andy l'

oh mi scuso non ho visto la tua risposta quando ho risposto.
Andy,

Ciao Andy, sto ancora ricevendo Connessione a server.com | <ip> |: 443 ... non riuscita: connessione rifiutata.
Chris,

Ciao Chris, è il collegamento a localhost | 127.0.0.1 | 443 o è quello il dominio? Se quest'ultimo e lo stai eseguendo dal tuo server, potresti avere un problema di routing interno. Puoi ricontrollare provando wget server.com:8080 (anche se presumo che il port forwarding sia perché è bloccato esternamente?). Il mio VPC ha questo problema, tuttavia potresti eventualmente risolvere il problema definendo il dominio come 127.0.0.1 nel tuo file / etc / hosts.
Andy,

10

Per reindirizzare i pacchetti da localhost a un altro computer la regola:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

funzionerà, MA devi anche abilitare questa opzione nel kernel:

sysctl -w net.ipv4.conf.all.route_localnet=1

Senza quell'impostazione del kernel non funzionerà.


Funzionerebbe anche quello. Penso che fare tutto in iptables sia più pulito.
quadruplebucky

In realtà, l'impostazione del kernel è necessaria se la destinazione si trova su un'altra macchina, in linea su una macchina virtuale o remota.

è , non se si hanno le due regole come Andy suggerito sopra.
quadruplebucky

Spiacenti, stavo parlando del caso di inoltro a un altro computer in cui DNAT non funziona. Stavo cercando questa risposta per una soluzione a un problema quando stavo cercando di inoltrare qualcosa che pensava si connettesse a localhost a un contenitore sulla stessa macchina. ad es. eseguire il nameserver in un contenitore per query locali.

In realtà, sembra dipendere dalla versione del kernel> = 3.6.
quadruplebucky

3

Cosa ne pensi di questo?

iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-port 8080


2

Hai detto che stai ricevendo un errore di connessione rifiutata . Ciò significa che non esiste alcun processo locale in ascolto sulla porta alla quale si sta tentando di connettersi! Per verificare i processi di ascolto, utilizzare il comando:

$ sudo netstat -lnp | grep 8080

Dopo aver applicato la regola, dovresti avere un processo in ascolto sulla porta 8080 per connetterti.

Sembra che dovresti invece avere la seguente regola:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

Ricorda che stai inviando da localhost. Pertanto, è necessario reindirizzare il pacchetto di output.


1
Grazie per la tua risposta. Il processo è in ascolto sulla porta 8080. Pertanto, desidero reindirizzare tutto il traffico verso quella porta.
Chris,

Sei sicuro che il processo sia in ascolto anche sull'interfaccia del loop? Potrebbe essere solo in ascolto sulla tua interfaccia fisica. In genere, il tuo server web dovrà ascoltare 0.0.0.0 anziché, diciamo, 192.168.10.0
MrMajestyk
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.