# MySQL: non riesco ad accedere tramite la OpenVPN

## fbcyborg

Salve a tutti, 

ho un problema con il server MYSQL e la OpenVPN.

Ho lasciato il parametro bind-address appositamente commentato nel file my.cnf, così in questo modo riesco a connettermi al server MySQL sia digitando l'IP 127.0.0.1 sia digitando l'IP che mi viene assegnato dal router.

Quindi, il server è accessibile da tutti i PC che sono in LAN con il server.

Faccio presente che l'accesso avviene tramite un software gestionale che ho fatto io in java.

Ho provato anche a inserire una regola iptables apposita ma non funziona.

Il problema è che se si prova ad accedere utilizzando l'IP della VPN, l'accesso non è consentito. Perché?

----------

## Peach

come hai configurato ovpn?

----------

## fbcyborg

Cosa vuoi sapere esattamente?

Ti posso postare il file /etc/openvpn/server.conf, ma non so quanto ti possa essere d'aiuto.

----------

## Peach

 *fbcyborg wrote:*   

> Cosa vuoi sapere esattamente?
> 
> Ti posso postare il file /etc/openvpn/server.conf, ma non so quanto ti possa essere d'aiuto.

 

scusa, volevo sapere se l'hai configurato come bridge o come tunnel

----------

## fbcyborg

Nel file di configurazione ho inserito "dev tun" quindi come tunnel. Inoltre per conferma, l'interfaccia che viene tirata su, è tun0.

----------

## Peach

 *fbcyborg wrote:*   

> Nel file di configurazione ho inserito "dev tun" quindi come tunnel. Inoltre per conferma, l'interfaccia che viene tirata su, è tun0.

 

ok quindi stai usando un altro ip su un'altra sottorete per collegarti alla macchina.

ora sul server dovresti controllare che effettivamente il server mysql sia in ascolto su "qualsiasi indirizzo":

```
# netstat -ltn | grep 3306
```

dato che mysql sta su porta 3306.

Prima di usare la tua interfaccia proverei a fare dei tentativi di connessione "manuali" e vedere se funzionano senza problemi.

Quindi una volta connesso via openvpn ti provi prima a collegare via ssh al server (sull'ip ovpn) e provi a collegarti localmente:

```
# mysql -u root -p -h localhost
```

poi senza collegarti via ssh provi la connessione remota sulla vpn

```
# mysql -u root -p -h <ip_ovpn>
```

se tutto funziona senza problemi, allora conviene fare un po' di tcpdump sul server su tun0 per vedere che succede e perché non va.

----------

## fbcyborg

 *Peach wrote:*   

> 
> 
> ok quindi stai usando un altro ip su un'altra sottorete per collegarti alla macchina.
> 
> ora sul server dovresti controllare che effettivamente il server mysql sia in ascolto su "qualsiasi indirizzo":
> ...

 

OK, in realtà questa cosa l'avevo già fatta ed ecco cosa mi viene fuori:

```
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN
```

Quindi sembrerebbe tutto OK su questo punto di vista.

 *Peach wrote:*   

> 
> 
> Prima di usare la tua interfaccia proverei a fare dei tentativi di connessione "manuali" e vedere se funzionano senza problemi.
> 
> Quindi una volta connesso via openvpn ti provi prima a collegare via ssh al server (sull'ip ovpn) e provi a collegarti localmente:
> ...

 Nessun problema a connettermi così. *Peach wrote:*   

> 
> 
> poi senza collegarti via ssh provi la connessione remota sulla vpn
> 
> ```
> ...

 Inserisco la password e non succede niente. Rimane bloccato senza dare di nuovo la shell. *Peach wrote:*   

> 
> 
> se tutto funziona senza problemi, allora conviene fare un po' di tcpdump sul server su tun0 per vedere che succede e perché non va.

 

EDIT: dopo un po' sputa fuori:

ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.139.1' (110)

Grazie per l'aiuto!

----------

## Peach

dimenticavo di chiederti.. che regola hai aggiunto al fw?

possibile che sia da ricercare lì il problema.

----------

## fbcyborg

Guarda, quella regola che ti dicevo non l'avevo memorizzata in /var/lib/iptables/rules-save, quindi le prove le sto facendo "senza regole".

----------

## fbcyborg

Ancora non riesco a capire perché da remoto non riesco a collegarmi al mio server mysql tramite la vpn.  :Sad: 

Se in locale faccio

```
mysql -u root -h 192.168.139.1 -p
```

dove 192.168.139.1 è l'ip del server openvpn, riesco a connettermi. Ma se lo faccio da un client openvpn, sta sempre le ore in attesa e poi risputa fuori quel messaggio di errore di prima.

Mi era venuto lo scrupolo di verificare che l'utente root potesse connettersi da qualsiasi host ovvero che ci fosse il "%" per quanto riguarda "host", ma anche mettendo il "%" non mi fa connettere da remoto.

E' assurdo!

----------

## Peach

 *fbcyborg wrote:*   

> Ancora non riesco a capire perché da remoto non riesco a collegarmi al mio server mysql tramite la vpn. 
> 
> Se in locale faccio
> 
> ```
> ...

 

l'idea di base dovrebbe essere quella di mettere in ascolto un dumper di pacchetti tcp e vedere se arriva effettivamente, imho è un problema di routing dei pacchetti dal server al dispositivo tun0.

ti posso consigliare di usare wireshark (tcpdump è un'altra soluzione).

dimmi se ci sono altre cose che ti servono sapere...

----------

## fbcyborg

Sto provando con wireshark.

Mi sono messo in ascolto sull'interfaccia della VPN, ed escono delle righe.

Che tipo di informazione ti posso fornire? Quello che leggo non mi sembra molto significativo.

Forse dovrei impostare qualche opzione di cattura particolare?

EDIT: anche con tcpdump vedo che le richieste arrivano, ma nulla di significativo.

----------

## Peach

 *fbcyborg wrote:*   

> Sto provando con wireshark.
> 
> Mi sono messo in ascolto sull'interfaccia della VPN, ed escono delle righe.
> 
> Che tipo di informazione ti posso fornire? Quello che leggo non mi sembra molto significativo.
> ...

 

teoricamente dovresti vederti la sequenza del 3 way handshake passare con numero di sequenza incrementale (syn, syn ack, ack)

prova a metterti in ascolto su lo e fai la connessione così vedi quali pacchetti aspettarti poi rifai lo stesso lavoro su tun0

----------

## fbcyborg

Questo è quello che vedo quando mi collego da localhost:

```
No.     Time        Source                Destination           Protocol Info

      1 0.000000    127.0.0.1             127.0.0.1             TCP      51215 > mysql [SYN] Seq=0 Win=32792 Len=0 MSS=16396 TSV=5231322 TSER=0 WS=7

      2 0.000006    127.0.0.1             127.0.0.1             TCP      mysql > 51215 [SYN, ACK] Seq=0 Ack=1 Win=32768 Len=0 MSS=16396 TSV=5231322 TSER=5231322 WS=7

      3 0.000018    127.0.0.1             127.0.0.1             TCP      51215 > mysql [ACK] Seq=1 Ack=1 Win=32896 Len=0 TSV=5231322 TSER=5231322

      4 0.000160    127.0.0.1             127.0.0.1             MySQL    Server Greeting proto=10 version=5.0.84-log

      5 0.000184    127.0.0.1             127.0.0.1             TCP      51215 > mysql [ACK] Seq=1 Ack=61 Win=32896 Len=0 TSV=5231322 TSER=5231322

      6 0.000218    127.0.0.1             127.0.0.1             MySQL    Login Request user=root db=mydatabase

      7 0.000237    127.0.0.1             127.0.0.1             TCP      mysql > 51215 [ACK] Seq=61 Ack=75 Win=32768 Len=0 TSV=5231322 TSER=5231322

    129 0.051311    127.0.0.1             127.0.0.1             TCP      51215 > mysql [ACK] Seq=1057 Ack=14096 Win=49536 Len=0 TSV=5231335 TSER=5231325
```

Mentre invece se tento il collegamento da un client della vpn:

```
No.     Time        Source                Destination           Protocol Info

      1 0.000000    192.168.139.5         192.168.139.1         TCP      37140 > mysql [SYN] Seq=0 Win=5840 Len=0 MSS=1084 TSV=4294933971 TSER=0 WS=7

      2 2.999070    192.168.139.5         192.168.139.1         TCP      37140 > mysql [SYN] Seq=0 Win=5840 Len=0 MSS=1084 TSV=4294934721 TSER=0 WS=7

      3 8.999577    192.168.139.5         192.168.139.1         TCP      37140 > mysql [SYN] Seq=0 Win=5840 Len=0 MSS=1084 TSV=4294936221 TSER=0 WS=7

      4 21.002553   192.168.139.5         192.168.139.1         TCP      37140 > mysql [SYN] Seq=0 Win=5840 Len=0 MSS=1084 TSV=4294939221 TSER=0 WS=7

      5 45.002794   192.168.139.5         192.168.139.1         TCP      37140 > mysql [SYN] Seq=0 Win=5840 Len=0 MSS=1084 TSV=4294945221 TSER=0 WS=7

      6 93.007009   192.168.139.5         192.168.139.1         TCP      37140 > mysql [SYN] Seq=0 Win=5840 Len=0 MSS=1084 TSV=4294957221 TSER=0 WS=7
```

Non riesco a ricavarne informazioni utili, a parte il fatto che è evidente che mentre nel primo caso la connessione avviene mentre nel secondo caso no!

----------

## Peach

quello che puoi ricavare è che nel primo caso hai il 3way handshake

nel secondo caso la comunicazione è monodirezionale, dal client al server ma non viceversa

sarebbe a dire che il server riceve i pacchetti ma non sa a chi mandarli.

ora io non sono un esperto di iptables e l'unico setup che ho fatto ho usato shorewall, che non è altro che una interfaccia di astrazione su iptables (genericamente va bene per configurazioni semplici perché tende ad essere un pelo verboso)

in ognicaso, su shorewall quando si tira su un tunnel (tunX) come nel caso di openvpn, occorre specificare il device per avere l'instradamento corretto dei pacchetti verso il tunnel.

Come con comandi iptables si possa fare è al di fuori della mia conoscenza.

A questo punto potrei suggerirti, prima di impazzirci dietro, di guardare l'ottima documentazione sul sito di openvpn, ci dovrebbero essere un po' di soluzioni/howto a riguardo.

let me know

[edit] hai mai considerato di configurare openvpn per roadwarrior? 

http://en.gentoo-wiki.com/wiki/Road_Warriors_with_OpenVPN

----------

## fbcyborg

Dunque, 

premesso che non capisco il motivo per cui se c'è di mezzo la vpn io debba mettere mano a iptables, non penso che sia un problema di firewall e/o di instradamento.

Non si spiegherebbe perché (altrimenti) non ho alcun problema con il server web, quello ftp, e diversi altri. Funziona anche samba, per la cronaca, e tutto questo senza una linea di iptables.

Neanche io purtroppo sono un esperto di iptables, anche se qualche regola di instradamento la dovrei saper fare, visto che me ne sono servito in altre occasioni.

Road Warriors non l'avevo mai considerato perché non ne ero a conoscenza. A tal proposito comunque preferirei non cambiare le cose, perché ho questo server aziendale sul quale ho installato la VPN e non vorrei rischiare di perderci una giornata per cambiare le cose.

Se non ho capito male questo Road Warriors fa in modo che i client della VPN abbiano la stessa classe di IP della subnet reale. È così?

----------

## fbcyborg

Ho notato una cosa molto strana. 

Il server mysql sembrerebbe inaccessibile anche dall'esterno pur avendo impostato un port forwarding verso l'IP del server che è in LAN.

Quindi è come se il server mysql riconoscesse che la richiesta viene da fuori, e la droppasse.

Il fatto però è che quando faccio il test con la vpn, il client è nella stessa LAN.

----------

## Peach

 *fbcyborg wrote:*   

> Se non ho capito male questo Road Warriors fa in modo che i client della VPN abbiano la stessa classe di IP della subnet reale. È così?

 

si, infatti il rischio e' di avere una classe LAN "generica" di quelle molto usate, e avere un conflitto di gateway che ti blocca tutto. e' uno dei pochi motivi per cui uso anche io la soluzione che stai usando tu.

Ok, la cosa che non sapevo e' che cmq tutti gli altri servizi funzionavano correttamente.

Quindi occhio e croce il problema sembra effettiavamente essere mysql... e se effettivamente il bind-address e' commentato e netstat lo mostra in attesa su tutti gli indirizzi... l'unica a sto punto sarebbe ricompilarlo con flag debug e loggare il tutto (la conf per i parametri sono in my.cnf)

che dici?

----------

## fbcyborg

C'avevo pensato anche io!  :Smile: 

Provo e ti faccio sapere. Grazie!

----------

## fbcyborg

Nonostante io abbia abilitato il debug in my.cnf (e ovviamente ricompilato con la flag use debug attiva), in nessuno dei seguenti tre log succede nulla, al tentativo di connessione:

mysqld.err  mysql.err  mysql.log.

La riga di my.cnf che ho decommentato è:

```
debug                       = d:t:i:o,/tmp/mysqld.trace
```

Neanche in /tmp/mysqld.trace riesco a vedere nulla.

Sto provando con "tail -0f /tmp/mysqld.trace" al momento del tentativo di connessione ma non esce nulla.

Allora è un problema di VPN?

----------

## fbcyborg

Mi correggo: se provo a fare il port redirect della 3306 verso l'IP interno alla LAN dove c'è il server mysql, riesco ad accedere.

Quindi sembrerebbe essere proprio un problema di openvpn!

----------

## Peach

 *fbcyborg wrote:*   

> Mi correggo: se provo a fare il port redirect della 3306 verso l'IP interno alla LAN dove c'è il server mysql, riesco ad accedere.
> 
> Quindi sembrerebbe essere proprio un problema di openvpn!

 

e se metti esplicitamente in ascolto mysql sull'ip del tunnel?

----------

## fbcyborg

C'avevo provato, non funziona!  :Sad: 

----------

## Peach

 *fbcyborg wrote:*   

> C'avevo provato, non funziona! 

 

eh allora openvpn.. 

il punto e' questo, samba lavora su un altro livello

mi domando, puoi fare il dump dei pacchetti tpc di una connessione al webserver e vedere se c'e' il 3way?

----------

## fbcyborg

Scusa, prima di fare questa cosa, possiamo confrontare la mia configurazione del server vpn con la tua?

Ecco il file server.conf:

```
port 59000

proto tcp

dev tun

mode server

ca /usr/share/openvpn/easy-rsa/keys/ca.crt

cert /usr/share/openvpn/easy-rsa/keys/server.crt

key /usr/share/openvpn/easy-rsa/keys/server.key

dh /usr/share/openvpn/easy-rsa/keys/dh1024.pem

server 192.168.139.0  255.255.255.0 # for example 192.168.141.0

client-to-client

ifconfig-pool-persist ipp.txt

client-config-dir ccd

keepalive 10 120

tls-auth ta.key 0

tun-mtu 1500

tun-mtu-extra 32

mssfix 1200

duplicate-cn

comp-lzo

crl-verify /etc/openvpn/crl.pem

max-clients 100

persist-key

persist-tun

status openvpn-status.log

log        /var/log/openvpn.log

log-append /var/log/openvpn.log

verb 3

```

----------

## Peach

la mia configurazione è questa

```
dev tun

proto udp

port 1194

local 192.168.1.30

server 10.157.234.0 255.255.255.0

ifconfig-pool-persist /etc/openvpn/ip_pool

client-config-dir ccd

push "dhcp-option WINS 10.157.234.1"

status /tmp/vpn.status

log-append  /var/log/openvpn.log

verb 3

tls-server

tls-auth /etc/openvpn/ta.key         0

dh      /etc/openvpn/dh1024.pem

ca      /etc/openvpn/ca.crt

cert    /etc/openvpn/server.crt

key     /etc/openvpn/server.key

comp-lzo

keepalive 10 120

max-clients 20

user nobody

group nobody

persist-key

persist-tun
```

posso dirti con certezza che servizi tcp tipo ssh e apache funzionano, ma non ho mai provato mysql visto che per sicurezza sta in ascolto esclusivamente su localhost.

Altra cosa che ancora non riesco a fare, e qui è proprio una cosa relativa alla configurazione di iptables, è instradare i pacchetti indietro dalla vpn alla rete esterna (sarebbe a dire il passaggio contrario di quello che vuoi fare te), ma questa è un'altra storia.

spero possa esserti d'aiuto.

fammi sapere

----------

## fbcyborg

Mmh.. vedo che già usiamo un protocollo diverso.

Io comunque preferisco sempre TCP. Ci devo far girare un'applicazione distribuita sopra.

Quindi tu non mi puoi confermare se con questa configurazione mysql funziona?

----------

## Peach

 *fbcyborg wrote:*   

> Mmh.. vedo che già usiamo un protocollo diverso.
> 
> Io comunque preferisco sempre TCP. Ci devo far girare un'applicazione distribuita sopra.
> 
> Quindi tu non mi puoi confermare se con questa configurazione mysql funziona?

 

purtroppo non posso nemmeno provare visto che è un ambiente di produzione

cmq io non vedo sto problema nell'uso di tpc rispetto ad udp in questo caso, quindi magari prova a farti una seconda configurazione openvpn, creati un link simbolico a /etc/init.d/openvpn che rispecchi il nome della nuova configurazione e fa partire il servizio e vedi se noti differenze sostanziali, così eviti di modificare la conf che hai già creato.

altra cosa, sul mio server c'ho un po' di regole di routing/firewalling che forse mi aiutano (come ti dicevo, usando shorewall)

----------

## fbcyborg

OK, ma come ti ripeto ho già provato con delle regole di routing con iptables (sono abbastanza sicuro che siano corrette perché in un server che ho installato le uso e funzionano - non riguardo questo caso specifico).

Smanetterò un altro po!  :Smile: 

----------

