Porta condivisa OpenVPN con Apache / SSL


8

Sto cercando di configurare OpenVPN per l'ascolto sulla porta 443, quindi passare tutto il traffico HTTPS ad Apache, utilizzando l' port-shareopzione. I frammenti di configurazione rilevanti sono:

OpenVPN

local ${PUBLIC_IP}
port 443
port-share localhost 443

Apache con SSL

Listen localhost:443

Il mio client OpenVPN si connette bene, ma quando apro la pagina HTTPS abilitata, ottengo errori. Firefox dice:

SSL ha ricevuto un record che ha superato la lunghezza massima consentita.

(Codice errore: ssl_error_rx_record_too_long)

Dice Curl

curl: (35) errore: 140770FC: routine SSL: SSL23_GET_SERVER_HELLO: protocollo sconosciuto

La richiesta finisce su Apache, poiché vedo nei log di errore i seguenti messaggi:

[Wed Oct 06 01:10:20 2010] [error] [client 127.0.0.1] Invalid method in request \x16\x03\x01
[Wed Oct 06 01:11:04 2010] [error] [client 127.0.0.1] Invalid method in request \x16\x03\x01
[Wed Oct 06 01:11:51 2010] [error] [client 127.0.0.1] Invalid method in request \x16\x03\x01

La voce dei messaggi per una connessione HTTPS è

Oct  6 01:13:21 ns1 openvpn[20154]: Re-using SSL/TLS context
Oct  6 01:13:21 ns1 openvpn[20154]: LZO compression initialized
Oct  6 01:13:21 ns1 openvpn[20154]: Control Channel MTU parms [ L:1544 D:140 EF:40 EB:0 ET:0 EL:0 ]
Oct  6 01:13:21 ns1 openvpn[20154]: Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Oct  6 01:13:21 ns1 openvpn[20154]: Local Options hash (VER=V4): 'c0103fa8'
Oct  6 01:13:21 ns1 openvpn[20154]: Expected Remote Options hash (VER=V4): '69109d17'
Oct  6 01:13:21 ns1 openvpn[20154]: TCP connection established with ${CLIENT_IP}:56203
Oct  6 01:13:21 ns1 openvpn[20154]: TCPv4_SERVER link local: [undef]
Oct  6 01:13:21 ns1 openvpn[20154]: TCPv4_SERVER link remote: ${CLIENT_IP}:56203
Oct  6 01:13:21 ns1 openvpn[20154]: ${CLIENT_IP}:56203 Non-OpenVPN client protocol detected
Oct  6 01:13:21 ns1 openvpn[20154]: TCP/UDP: Closing socket

Uso di httpd-2.2.3-43.el5.centos e openvpn-2.1.1-2.el5.

Cosa devo fare per far funzionare la condivisione delle porte?


Aggiornamento : utilizzo

port 443
port-share localhost 10443

e

Listen localhost:10443

non fa differenza.


Aggiornamento 2 : alcuni output del comando

[root@ns1 ~]# openvpn --help | grep port-share
--port-share host port : When run in TCP mode, proxy incoming HTTPS sessions
[root@ns1 ~]# netstat -nltp | grep 443
tcp        0      0 127.0.0.1:10443             0.0.0.0:*                   LISTEN      20088/httpd         
tcp        0      0 ${PUBLIC_IP}:443             0.0.0.0:*                   LISTEN      20066/openvpn       

Risposte:


8

l' port-shareopzione imposta la porta in attesa dell'altra applicazione.

Quello che vuoi fare è configurare

port-share 10443

e imposta Apache per l'ascolto sulla porta 10443:

Ascolta <your-public-ip>: 10443

Questo perché due applicazioni non possono aprire la stessa porta contemporaneamente.


Grazie per la tua risposta. OpenVPN si lega all'indirizzo pubblico, mentre Apache si lega a localhost. Cambierò la porta Apache quando ne avrò la possibilità, ma due applicazioni possono legarsi sulla stessa porta, dato che usano indirizzi diversi.
Robert Munteanu,

sì, vero, ma è probabile che openVPN reindirizzerà allo stesso IP, non localhost (sarebbe la cosa più sana da fare)
Hubert Kario,

In realtà volevo dire port-share localhost 443. Ho provato port-share localhost 10443, ma ancora non ha funzionato, stesso errore.
Robert Munteanu,

ah, scusa, stavo dicendo una cosa e mostrando la configurazione per l'altra. Immagino che Apache debba ascoltare sullo stesso IP che openvpn sta ascoltando, cioè pubblico, non localhost. Aggiornato la mia risposta.
Hubert Kario,

Un'altra cosa, sei sicuro che la tua versione di openvpn supporti questa opzione? (prova con openvpn --help | grep port-share). E sei sicuro che apache è in ascolto sulla porta configurata e SSL funziona?
Hubert Kario,

2

Mentre trovavo una risposta adatta al mio server ho trovato tutti che parlavano della portsharefunzione della configurazione OpenVPN. Tuttavia, nel mio caso, devo conoscere l' indirizzo IP del client effettivo per la registrazione e altre funzioni. Ho scoperto che l'utilizzo portsharecausa la registrazione dell'IP locale del server.

Per risolvere questo problema,

  1. Aggiungi portshare [port]funzione in OpenVPN
  2. Imposta il server Apache per l'ascolto [port]
  3. Installare l' estensione ProxyProtocol (seguendo le istruzioni nel file Leggimi del repository), disponibile da: https://github.com/roadrunner2/mod-proxy-protocol
  4. Aggiungi la linea ProxyProtocol Onnella configurazione di Apache.

Dovrebbe funzionare e servire allo scopo di cui sopra. Ho appena pubblicato questo e spero che possa aiutare qualcuno che vuole fare qualcosa come me.


1

L'opzione di condivisione delle porte di OpenVPN consente di reindirizzare il traffico verso un altro sito HTTPS, non verso un normale server Web; l'errore che stai vedendo

[error] [client 127.0.0.1] Invalid method in request \x16\x03\x01

si verifica quando una richiesta SSL viene inviata a un sito diverso da 0SSL. Posso riprodurre l'errore usando

  port-share localhost 80

(anziché 443) Se il sito HTTPS è stato impostato correttamente, la condivisione delle porte funzionerà.

HTH,

JJK


0

Aggiornamento: ho notato che l'indirizzo IP dei visitatori del sito Web sarà sempre 127.0.0.1nei registri del server Web. Questo è un problema se vuoi conoscere l'origine di una connessione o vuoi usare uno strumento simile fail2ban. Sembra che non ci sia modo di avere l'indirizzo IP reale del visitatore nei log di Apache se stiamo usando OpenVPN port-share( https://forums.openvpn.net/viewtopic.php?t=22599 ), quindi ho usato lo strumento SSLH in modalità trasparente: /unix/373717/how-does-sslhs-transparent-mode-work/532333#532333

Risposta originale:

Se qualcuno sta usando OpenVPN Access Server, devi andare /usr/local/openvpn_as/scripts/(ad esempio su Debian) ed eseguire questi comandi:

./sacli --key "vpn.server.port_share.enable" --value "true" ConfigPut ./sacli --key "vpn.server.port_share.service" --value "custom" ConfigPut ./sacli --key "vpn.server.port_share.ip_address" --value <LOCAL_IP> ConfigPut ./sacli --key "vpn.server.port_share.port" --value <PORT> ConfigPut ./sacli start

Fonte:

https://forums.openvpn.net/viewtopic.php?p=78630#p78630

https://openvpn.net/vpn-server-resources/managing-settings-for-the-web-services-from-the-command-line/#Change_the_web_service_forwarding_settings

Nel mio caso non avevo bisogno di eseguire il comando per la chiave vpn.server.port_share.servicee ho usato il comando service openvpnas restartinvece di ./sacli start.

Ho sostituito <LOCAL_IP>con 127.0.0.1e <PORT>con da 4443quando ho configurato Apache per l'ascolto sulla porta 4443.

Il mio file /etc/apache2/ports.confè configurato in questo modo:

Listen 80

<IfModule ssl_module>
        Listen 4443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 4443
</IfModule>

E la mia configurazione SSL di Apache /etc/apache2/sites-enabled/000-default.confinizia in questo modo: <IfModule mod_ssl.c> <VirtualHost *:4443>

Nota: ho usato OpenVPN Access Server in passato poiché era facile da configurare. Esistono anche script alternativi per configurare OpenVPN che hanno il vantaggio di essere open source e non limitare il numero di utenti, ad esempio: https://github.com/Nyr/openvpn-install

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.