iptables reindirizza le richieste esterne a 127.0.0.1


41

Ho un servizio in esecuzione su 127.0.0.1 con la porta 2222. Devo inoltrare tutte le richieste a 192.168.2.2:2222 (IP esterno) solo dalla sottorete 192.168.1.0/24 a 127.0.0.1:2222.

Sto cercando di usare questo, ma non funziona.

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222

Come posso farlo funzionare?

UPD: modifica schema indirizzi.


Abbiamo bisogno di alcuni chiarimenti. Da dove proviene il traffico? Dove sta andando originariamente il traffico? Dove dovrebbe essere diretto il traffico? Mentre lo leggo, vuoi che il traffico da 192.168.1.0/24 a 127.0.0.1:2222 sia reindirizzato a 12.23.34.45:2222. Ma la risposta di Warren presuppone che si desideri reindirizzare il traffico dal 192.168.1.0/24 al 12.23.34.45:2222 al 127.0.0.1:222
Patrick

1
Il traffico proviene dalla sottorete 192.168.1.0/24 a 192.168.2.2:2222 e dovrebbe essere tradotto in servizio il 127.0.0.1:2222. Sono corretto schema di indirizzi.
SimWhite,

1
Vuoi una regola che consenta al traffico di 2222trasferire sull'interfaccia di loopback dalla sottorete 192.168.1.0/24? Questo non è solo un singolo tipo di installazione. Vedi qui: debuntu.org/…
slm

Sì. A quanto ho capito devo aggiungere la regola masq? L'inoltro IP è già abilitato, ovviamente.
SimWhite,

Perché non eseguirlo su un IP "reale" e filtrare il traffico proveniente da fonti indesiderate? Ecco a cosa servono i firewall, essenzialmente ...
vonbrand,

Risposte:


60

La regola iptables che stai utilizzando funzionerà, ma è necessario apportare un'altra modifica:

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

(sostituendo eth0con il nic 192.168.2.2risiede)

Per impostazione predefinita, questo valore è 0, che indica al kernel di non instradare il traffico esterno a cui è destinato 127.0.0.0/8. Questo è solo per sicurezza in quanto tale traffico non è normale.


Nota aggiuntiva: la tua attuale regola iptables è troppo ampia. La tua regola specifica -d 192.168.1.0/24 --dport 2222come corrispondenza di destinazione, il che significa che se la tua macchina prova a parlare con un altro host sulla porta 2222 (cioè il traffico in uscita), verrà reindirizzata anche. Devi modificare la -dcorrispondenza -d 192.168.2.2o aggiungere -i eth0(o qualunque sia la tua nicchia).


8
Questa informazione è sorprendentemente difficile da trovare.
Wren T.,

Sì, informazioni preziose e difficili da trovare! Grazie! Ma non ho route_localnet. Ci sono stati altri nomi per questo? (in linux 2.6.30) ls /proc/sys/net/ipv4/conf/lan/: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm inoltro mc_forwarding promote_secondaries rp_filter send_redirects tag
IMZ - Ivan Zakharyaschev

Vedo, la patch perroute_localnet è più recente (7 giugno 2012) rispetto al mio kernel (2.6.30-std-def-alt15 # 1 SMP lun 14 dic 08:45:48 UTC 2009). Ok, realizzerò semplicemente il port forwarding desiderato (dall'esterno all'interno) con un processo di forwarding come netcat( nc) xinetd, o le opzioni di port forwarding di ssh(quest'ultimo è inefficace e stupido, ovviamente, ma lo menziono, perché, beh, questa possibilità è lì).
imz - Ivan Zakharyaschev

2
I miei 2 centesimi: puoi abilitare questo parametro per tutte le interfacce consysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan,

Come altri, questa informazione era difficile da trovare. Grazie, se l'avessi trovato prima, mi avrebbe risparmiato una tonnellata di sforzi.
Stephen Simpson,

3

È possibile reindirizzare a localhost ma non a loopback (127.0.0.0/8). Il loopback è una scappatoia. Devi reindirizzare a una delle tue interfacce reali. Prova a utilizzare REDIRECT.

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222


Questa è probabilmente la risposta migliore senza il voodo sysctl ...
Lester Cheung

Non è ancora d'aiuto se la porta 222 viene ascoltata solo su localhost (la regola non cambierà l'indirizzo di destinazione)
sanmai

In tal caso, utilizzare-j DNAT --to-destination w.x.y.z:222
dresende il

2

Cosa succede se la risposta corretta con route_localnetnon funziona? ..

Se il tuo kernel non include la patch perroute_localnet , allora ... aggiorna il kernel!

Oppure ci sono altri modi per inoltrare il traffico proveniente da un'interfaccia a un'altra porta su un'altra interfaccia (in particolare, a localhost) eseguendo un processo che ascolti sull'interfaccia esterna e inoltri il traffico.

netcat( nc), xinetde ssh(e forse altro) sono tutti esempi di programmi in grado di farlo (anche se la scelta sshsarebbe strana e inefficace).

Ho scritto una configurazione xinetdper questo. Ora questo servizio viene automaticamente visualizzato:

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 

( vaio.obè il nome di questo host sull'interfaccia di rete esterna.)

Dopo un service xinetd reload, controlliamo che sia in ascolto:

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 

E infatti, le connessioni passano!

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.