Ho un gateway Linux che esegue NAT per la mia rete domestica. Ho un'altra rete a cui vorrei inoltrare i pacchetti in modo trasparente, ma solo a / da IP / porte specifici (cioè non una VPN). Ecco alcuni esempi di IP e porte con cui lavorare:
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
Vorrei che la macchina Source fosse in grado di comunicare con porte specifiche su Remote Target come se fosse direttamente instradabile dal router. Sul router, eth0 è la rete privata e eth1 è rivolto a Internet. Remote Gateway è un'altra macchina Linux in cui posso accedere e può indirizzare direttamente a Remote Target.
Il mio tentativo di una soluzione semplice è impostare il port forwarding ssh sul router, come ad esempio:
ssh -L 5000:192.168.50.50:5000 1.2.3.4
Funziona bene con il router, che ora può connettersi localmente alla porta 5000. Quindi "telnet localhost 5000" sarà collegato a 192.168.50.50:5000 come previsto.
Ora voglio reindirizzare il traffico da Source e incanalare attraverso il tunnel ssh ormai consolidato. Ho tentato una regola NAT per questo:
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
e poiché il router è già il mio gateway NAT, ha già la regola di postrouting necessaria:
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
La maggior parte delle domande e risposte su questo sito o altrove sembrano avere a che fare con il forwarding delle porte del server o con NAT hairpin, entrambi i quali sto lavorando bene altrove, nessuno dei quali si applica a questa situazione. Certamente potrei DMZ inoltrare le porte di destinazione remota tramite Gateway remoto, ma non voglio che le porte siano accessibili a Internet, le voglio accessibili solo attraverso il tunnel SSH sicuro.
La migliore risposta che posso trovare riguarda il rifiuto dei pacchetti marziani nel kernel di Linux:
iptables, come reindirizzare la porta dal loopback?
Ho abilitato la registrazione dei marziani e confermato che il kernel rifiuta questi pacchetti come marziani. Solo che non lo sono: so esattamente a cosa servono questi pacchetti, da dove vengono e dove stanno andando (il mio tunnel SSH).
La soluzione "rotonda" presentata lì è applicabile a quella domanda originale, ma non si applica al mio caso.
Tuttavia, durante la scrittura / ricerca di questa domanda, ho aggirato il mio problema utilizzando l'associazione IP sorgente SSH in questo modo:
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
Dal momento che non sto usando il loopback, questo aggira il rifiuto marziano.
Pubblico ancora la domanda qui per due motivi:
- Nella speranza che qualcuno che sta cercando di fare qualcosa di simile in futuro possa trovare questo nelle loro ricerche e questa soluzione alternativa potrebbe aiutarli.
- Preferisco ancora l'idea di mantenere la mia porta ssh inoltra la connessione solo al loopback e di essere in grado di instradarli attraverso iptables. Dal momento che so esattamente cosa sono questi pacchetti e dove stanno andando, non dovrei avere un modo per segnalarli come tali in modo che il filtro marziano Linux non li rifiuti? Tutte le mie ricerche su questo argomento portano a rp_filter, che non ha aiutato affatto nei miei test. E anche se ha funzionato, non è specifico per i pacchetti esatti che sto cercando di consentire.
Sono interessato a contribuire con la mia domanda e soluzione alternativa alla ricerca generale per salvare qualcun altro le ore di ricerca che ho fatto solo per trovare vicoli ciechi, così come spero che qualcuno risponda alla parte loopback / marziana della mia domanda che rimane ancora aperta per me.