MULTI: indirizzo sorgente errato dal client - soluzioni una tantum?


10

Installazione: ho una configurazione client / server openvpn (file di configurazione in fondo) e ricevo il famigerato MULTI: bad source address from client [192.168.x.x], packet droppedmessaggio sul server. Il server ha un indirizzo IP pubblico, mentre il client è protetto da NAT.

Carenze delle soluzioni precedentemente proposte: il client-config-dirdefinito nella configurazione del server è attualmente vuoto. I post precedenti (qui e nei forum di supporto di openvpn) suggeriscono di aggiungere un file denominato DEFAULTcon le regole appropriate client-config-diro di aggiungere un file per utente con tali regole per risolvere il problema.

Tuttavia, questa non sembra essere una soluzione a lungo termine, poiché queste regole sono specifiche della posizione del cliente. Quindi, posso aggiungere una regola per consentire ai client 192.168.x.0di connettersi. Ma se si connettono da un'altra rete che invece utilizza 192.168.y.0per NAT, sarà necessaria una nuova regola.

Domande:

  • Le regole richieste possono essere scritte in modo generico / una tantum?
  • Qualcuno può spiegare perché questo problema si verifica in primo luogo?

Config server:

port 1234
proto tcp
dev tun

ca ca.crt
cert openvpn.crt
key openvpn.key
dh dh2048.pem

server 10.78.96.0 255.255.255.0
keepalive 10 120
comp-lzo
cipher CAMELLIA-128-CBC

user nobody
group nogroup  
persist-key
persist-tun
client-cert-not-required
plugin /usr/lib/openvpn/openvpn-auth-pam.so login

status openvpn-status.log

push "redirect-gateway def1"
push "remote-gateway 1.2.3.4"
push "dhcp-option DNS 8.8.8.8"

client-config-dir ccd
verb 4

Configurazione client:

ca ca.crt
client
dev tun
proto tcp
remote 1.2.3.4 1234

auth-user-pass
script-security 2
keepalive 5 60
topology subnet
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
cipher CAMELLIA-128-CBC
comp-lzo
verb 4

Tutti i tuoi clienti sono su reti 192.168.xy?
IceMage,

Non mi è chiaro ... Vuoi dire che vuoi indirizzare in un modo diverso un client che è acceso 192.168.x.0e un client che è in 192.168.y.0rete? Sono tutti nella stessa 192.168.x.x/16rete che hai definito ... (?)
krisFR

Risposte:


12

Hai chiesto: " Qualcuno può spiegare perché questo problema si verifica in primo luogo? "

Sulla base di quanto riportato nelle FAQ ufficiali di OpenVPN, scommetto che è causato da un problema di routing all'interno del motore OpenVPN.

Per chiarire meglio lo scenario, vorrei fare riferimento al diagramma seguente:

Qui puoi vedere:

  • un "server" OpenVPN collegato alla rete interna HEADQUARTER (10.0.1.0/24)
  • un "client" OpenVPN in esecuzione in un sito remoto e collegato alla rete remota 192.168.1.0/24

Anche

  • stiamo assumendo che il tunnel OpenVPN sia stato istituito e:
    • Il "server" OpenVPN è raggiungibile tramite la propria interfaccia tun , con l'indirizzo 10.10.0.1. Anche l'indirizzo P2P, utilizzato dall'interfaccia tun è 10.10.0.2 ( questo è importante per le discussioni successive, quindi sottolineiamo )
    • OpenVPN "client" ha un'interfaccia tun con IP 10.10.0.2

Ora supponiamo che:

  • il "Client" OpenVPN ha ridefinito il suo gateway predefinito, in modo da reindirizzare all'interno del tunnel tutto il traffico IP in uscita;
  • il "Client" OpenVPN ha IP_FORWARDING abilitato e, come tale, può instradare i pacchetti provenienti dalla sua LAN interna (192.168.1.0/24) ( sto sottolineando questo punto, poiché è fondamentale per la nostra discussione ).

Con uno scenario simile, controlliamo in dettaglio cosa succede quando R_PC1 (192.168.1.2) invia un pacchetto, come una richiesta di eco, a L_PC1 (10.0.1.2):

  1. dopo aver lasciato la scheda NIC R_PC1, il pacchetto raggiunge il client OpenVPN;
  2. Client OpenVPN (configurato per fungere da router comune), instradalo secondo la sua tabella di routing. Poiché il gateway predefinito è il tunnel, invia il pacchetto al tunnel;
  3. Il pacchetto raggiunge l'interfaccia tun del server OpenVPN. OpenVPN lo "vedrà" e, poiché (server OpenVPN) sa che 10.0.1.2 è un indirizzo appartenente alla sua sottorete LAN, "inoltra" il pacchetto, da TUN a LAN;
  4. Il pacchetto raggiunge L_PC1.

Quindi va tutto bene ...

Ora controlliamo cosa succede con l'eco-risposta che L_PC1 risponde a R_PC1.

  1. echo-reply lascia la scheda NIC L_PC1 e raggiunge l'interfaccia LAN del server OpenVPN (10.0.1.1);

Ora, se vogliamo che OpenVPN Server sia in grado di raggiungere il sito remoto, dobbiamo definire il routing con una "route statica". Qualcosa di simile a:

route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.10.0.2

Si prega di notare l'indirizzo P2P utilizzato come gateway .

Tali percorsi statici funzioneranno a livello di sistema operativo. In altre parole, è necessario che il sistema operativo instrada correttamente il pacchetto. Significa qualcosa del tipo: "Per favore, tutto il traffico indirizzato alla sottorete 192.168.1.0/24 deve essere inoltrato al motore OpenVPN, con il quale il sistema operativo è in grado di comunicare tramite l'indirizzo P2P". Grazie a tale percorso statico, ora ...

  1. il pacchetto lascia il contesto di routing del sistema operativo e raggiunge OpenVPN. L'istanza OpenVPN in esecuzione sul server OpenVPN. Quindi, a questo punto, il sistema operativo non ha altro da fare e tutto il routing (all'interno della VPN) viene lasciato al software del server OpenVPN.

Quindi, ora, il problema è: come, il software server openvpn, sarà in grado di decidere il percorso di un pacchetto, con SRC_IP 10.0.1.2 e DST_IP 192.168.1.2 ?

Si noti che, in base alla configurazione del server OpenVPN, non sa nulla della rete 192.168.1.0/24, né dell'host 192.168.1.2. E ' non è un client connesso. E ' non è un client locale. E così? OpenVPN, anche, sa che è non è il "OS-Router", in modo che non vuole veramente (e può ....) inviare il posteriore pacchetto al gateway locale. Quindi l'unica opzione, qui, è quella di generare un errore. Esattamente l'errore che stai riscontrando

Per dirlo con la lingua delle FAQ: " ... non sa come instradare il pacchetto su questa macchina, quindi rilascia il pacchetto ... ".

Come possiamo risolvere il problema?

Come puoi vedere dalla documentazione ufficiale , l'opzione iroute serve esattamente al nostro ambito:

--iroute network [netmask]
Generate an internal route to a specific client. The netmask 
parameter, if omitted, defaults to 255.255.255.255.
This directive can be used to route a fixed subnet from the server 
to a particular client, regardless of where the client is 
connecting from. Remember that you must also add the route to the 
system routing table as well (such as by using the --route 
directive). The reason why two routes are needed is that the 
--route directive routes the packet from the kernel to OpenVPN. 
Once in OpenVPN, the --iroute directive routes to the specific 
client.

Quindi hai bisogno di un:

--iroute 192.168.1.0 255.255.255.0

da applicare (al server) quando il client OpenVPN si connette, ad esempio tramite un file di configurazione ad hoc definito sul server (client-config-dir, ecc.).

Se ti chiedi perché questo problema non si verifica al passaggio 2) sopra, la mia comprensione è che il client OpenVPN sa come instradarlo, perché sa che il tunnel VPN è un gateway predefinito.

Lo stesso non può essere fatto sul server OpenVPN, perché lì il gateway predefinito non viene tipicamente ignorato. Inoltre, considera che potresti avere un singolo server OpenVPN con un sacco di client OpenVPN: ogni client sa come raggiungere il server ma ... come può, il server, decidere quale è il client che funge da gateway per una sottorete sconosciuta?


Per quanto riguarda la tua prima domanda ( le regole richieste possono essere scritte in modo generico / una tantum? ), Mi dispiace ma non sto riscontrando il tuo problema. Puoi riformulare fornendo maggiori dettagli?



Rispondere alla tua ultima domanda: non voglio modificare la configurazione di iroute ogni volta che il client OpenVPN si connette da un altro Wi-Fi pubblico solo perché ha un indirizzo di rete locale diverso.
jollyroger,

1
@jollyroger: in tipici "road-guerrieri" scenario (un singolo PC che agisce come un vpn-client verso un openpn-server) si NON bisogno di direttiva "iroute"! Quindi, se ti connetti tramite public-wifi, sono sicuro che non ne avrai bisogno. Ne avrai bisogno solo nelle configurazioni tipiche da LAN a LAN, dove dietro il client OpenVPN hai un'intera rete a cui il server OpenVP può accedere. Sono sicuro che questo NON è il caso quando ti connetti ... "da un altro Wi-Fi pubblico". Se i miei presupposti sono errati, ti preghiamo di fornire dettagli sulla tua configurazione di rete tipica (specialmente quando ti connetti tramite public-wifi)
Damiano Verzulli,

Ciò è principalmente legato all'utilizzo di SIP su OpenVPN. Supponiamo di avere 192.168.0.111/24 su wlan0 e 10.10.10.5/30 su tun0 collegati a OpenVPN. Supponiamo che il server OpenVPN abbia una rete aggiuntiva 10.11.10.2/24 con Asterisk il 10.11.10.1 e tutte le rotte necessarie vengono inviate al client (il ping riesce in entrambe le direzioni). Il problema è che SIP può decidere di instradare i pacchetti con IP sorgente del tuo wlan0 all'interfaccia tun0 invece di usare tun0 sorgente IP e questo è quando ricevi il problema - l'asterisco penserà che sei NAT-ed anche se non lo sei.
jollyroger,

@jollyroger: se ho ragione, è perfettamente possibile avere client SIP dietro le scatole NAT, quindi dovrebbe essere possibile, all'interno del tuo client OpenVPN, il traffico VPN in uscita NAT (lasciando l'interfaccia tun0). Ci sono alcuni motivi specifici per cui questa non è un'opzione, per te?
Damiano Verzulli,

Funziona. ma non è affidabile (leggi il mio commento precedente) a causa della natura dei client SIP e buggy e quest'ultimo non è cambiato da anni. Certo, posso abilitare il proxy di forzamento di tutto il traffico attraverso il mio server Asterisk, ma questo limita i client a usare solo codec supportati dal server nonostante abbia la possibilità di instradare i pacchetti RTP direttamente solo con la negoziazione di codec client-to-client.
jollyroger,

1

Ho avuto un problema che sembra simile, ma non sono sicuro che sia uguale al tuo problema. Stavo cercando di eseguire il ping da un client openvpn a un computer nella rete locale del server openvpn (instradato nella configurazione del server), non ottenendo risposta e ho potuto vedere il messaggio "indirizzo di origine errato" nel registro openvpn del server.

Per risolverlo, ho dovuto fare 2 cose:

  1. Abilita l'inoltro IP sul server.
  2. Aggiungi una route per la sottorete VPN sul gateway del server, perché nel mio caso il gateway per la rete locale del server non è il server stesso, ma un router. Il computer con ping cercava di rispondere attraverso il gateway, il che non aveva idea di cosa fare per la sottorete VPN. Quindi ho aggiunto una route statica nel router usando la subnet vpn per la destinazione e l'ip del server openvpn come gateway per essa.

Ciò ha risolto il problema per me.

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.