Port forwarding al client VPN?


21

Ho incontrato un po 'di un enigma e non ho avuto molta fortuna a trovare una soluzione. In questo momento sono (purtroppo) connesso alla rete tramite Verizon 3G. Filtrano tutto il traffico in entrata, quindi è impossibile per me aprire le porte per accettare le connessioni.

Al momento ho una macchina virtuale Linux su linode.com e il pensiero mi è passato per la testa per installare pptpde tentare di eseguire un iptablesport forwarding. Ho pptpdinstallato e la mia macchina domestica si connette felicemente. Detto questo, ecco alcune informazioni generali:

Server (Debian) IP WAN: xxxx su eth0 - IP pptpd: yyy1 su ppp0 - IP VPN client: yyy100

Per verificare che non stavo impazzendo, ho tentato alcune connessioni dal server alle porte aperte sul client e il client accetta le connessioni tramite l'IP VPN.

Quello che voglio realizzare è questo:

Internet -> IP WAN: Porta -> Inoltra a IP VPN client: Porta

Ad esempio, se avessi la porta 6000 aperta sul mio client, una persona potrebbe telnetare su xxxx: 6000 e il server lo catturerebbe e lo inoltrerebbe a 192.168.3.100:6000.

Ho provato almeno 20 diverse configurazioni di Google iptablese nessuno ha ancora funzionato. Qualcuno ha qualche idea, o forse anche un approccio totalmente diverso di cui potrei non essere a conoscenza? L'obiettivo qui è ascoltare attraverso un'orribile connessione con firewall, preferibilmente sia il traffico TCP che UDP.

Risposte:


25

Devi fare tre cose sul tuo server VPN (Linode) per farlo funzionare:

  1. È necessario abilitare l'inoltro IP:

    sysctl -w net.ipv4.ip_forward=1
    
  2. Impostare il NAT di destinazione (DNAT) per inoltrare la porta. Probabilmente l'hai già capito perché è roba di port forwarding standard, ma per completezza:

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
  3. Configurare NAT (SNAT) di origine in modo che dal punto di vista del client VPN, la connessione provenga dal server VPN:

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    

Il motivo per cui hai bisogno di SNAT è perché altrimenti il ​​tuo client VPN invierà i suoi pacchetti di ritorno direttamente all'host che ha avviato la connessione (zzzz) tramite il suo gateway predefinito (cioè Verizon 3G) e non tramite la VPN. Pertanto, l'indirizzo IP di origine sui pacchetti di ritorno sarà il tuo indirizzo Verizon 3G, e non xxxx. Ciò causa ogni tipo di problema, dato che zzzz ha avviato la connessione a xxxx

Nella maggior parte delle configurazioni di port forwarding, SNAT non è necessario perché l'host che esegue il port forwarding è anche il gateway predefinito per l'host di destinazione (ad esempio un router di casa).

Si noti inoltre che se si desidera inoltrare la porta 6000 a una porta diversa (ad esempio 7000), la regola SNAT deve corrispondere a 7000, non a 6000.


Ciao AGWA, grazie per la risposta. Ho già attivato ip_forwarding e le tue regole hanno funzionato perfettamente, anche se non inizialmente. Il problema era (nella mia noobness di iptables) che non avevo realizzato che iptables -F non scaricava le voci nat e iptables -L non le stava elencando. Dopo aver capito come elencarli correttamente, ho notato diverse voci contrastanti dai tentativi precedenti. Dopo aver scaricato e provato le tue regole, funziona perfettamente. Una domanda veloce però, nelle tue regole specifichi tcp. La modifica di questo in "tutto" funzionerebbe sia per il traffico TCP / UDP?
Vile Brigandier,

Prego! (A proposito, mi piace usare iptables-saveper mostrare le mie regole di iptables - mentre l'output non è destinato al consumo umano è ancora leggibile e mostra tutte le tue regole di iptables.) No, sfortunatamente non puoi usare "tutto" lì, perché --dportsolo funziona con protocolli che dispongono effettivamente di porte ("all" includerebbe ad esempio ICMP, che non ha alcuna nozione di porte). Avrai bisogno di regole separate per TCP e UDP.
AGWA,

Grazie per il suggerimento di iptables-save. Tutto funziona come previsto per TCP e UDP. Saluti.
Vile Brigandier,

2
Solo un aggiornamento a questa risposta è che con iproute2, puoi effettivamente configurare il tuo client VPN per avere 2 gateway e instradare il traffico DNAT indietro sulla VPN. Questo è utile se non si desidera utilizzare SNAT e sembra che tutto il traffico provenga dal server VPN. thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System include informazioni su come configurarlo.
Premendo sempre il

Funziona per me finché ufw è disabilitato, anche se ho permesso 8080 in ufw, ma non appena abilito ufw, questa roba di inoltro non funziona .. qualche idea?
Sudhir N,

3

Ho anche avuto questo problema e ho provato a risolverlo per ore .. Ecco la mia soluzione:

  • Ne ho avuti più di uno VPNClientcon lo stesso IPAddress. Quindi ho dato a ciascuno di loro un staticoIPAddress

Definire una directory in cui archiviare gli script client, ad es. / Etc / openvpn / staticclients e creare la directory

mkdir /etc/openvpn/staticclients

Aggiungi questa directory come opzione al tuo file di configurazione openvpn sul server:

client-config-dir /etc/openvpn/staticclients

Per ogni client devi creare un file. Il nome file deve corrispondere acommon name all'attributo specificato nel certificato del client. Questo comando ottiene il CN dal certificato del computer:

In questo esempio viene inviato IPAddress10.1.134.110/10.1.134.109 al client con common name TESTCLIENT e viene inoltre inviato un percorso aggiuntivo per la subnet 10.1.135.0.

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-push 10.1.134.110 10.1.134.109
push "route 10.1.135.0 255.255.255.0 10.1.134.62"
sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110

2

La maggior parte dei server ha l'inoltro IP disabilitato nella configurazione predefinita. È necessario abilitarlo se si desidera reindirizzare le connessioni in entrata tramite la VPN.

Prova questo:

sysctl -w net.ipv4.ip_forward = 1

Intendo oltre alla configurazione di iptables.


0

Quello che vuoi ottenere è (probabilmente) molto possibile con pptpdo OpenVPN e iptables, tuttavia, potresti trovare un candidato migliore per questo caso d'uso. Ho appena letto questo che descrive come impostare tinc esattamente per questo caso d'uso. È un'alternativa (potenzialmente più semplice) alla parte pptdpo OpenVPN. Quindi avresti bisogno esattamente le stesse regole per iptables.

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.