Puerto compartido de OpenVPN con Apache / SSL

8

Estoy tratando de configurar OpenVPN para escuchar en el puerto 443, y luego pasar todo el tráfico HTTPS a Apache, usando la port-shareopción. Los fragmentos de configuración relevantes son:

OpenVPN

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

Apache con SSL

Listen localhost:443

Mi cliente OpenVPN se conecta bien, pero al abrir la página habilitada HTTPS, obtengo errores. Firefox dice:

SSL recibió un registro que excedió la longitud máxima permitida.

(Código de error: ssl_error_rx_record_too_long)

Curl dice

curl: (35) error: 140770FC: rutinas SSL: SSL23_GET_SERVER_HELLO: protocolo desconocido

La solicitud termina en Apache, ya que veo en el registro de error los siguientes mensajes:

[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 entrada de mensajes para una conexión HTTPS es

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

Usando httpd-2.2.3-43.el5.centos y openvpn-2.1.1-2.el5.

¿Qué debo hacer para que el puerto compartido funcione?


Actualización : usando

port 443
port-share localhost 10443

y

Listen localhost:10443

No hace diferencia.


Actualización 2 : alguna salida de 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       
Robert Munteanu
fuente

Respuestas:

8

la port-shareopción establece el puerto que está escuchando la otra aplicación.

Lo que quieres hacer es configurar

puerto compartido 10443

y configura Apache para escuchar en el puerto 10443:

Escuche <your-public-ip>: 10443

Eso es porque dos aplicaciones no pueden abrir el mismo puerto a la vez.

Hubert Kario
fuente
Gracias por su respuesta. OpenVPN se vincula en la dirección pública, mientras que Apache se vincula en localhost. Cambiaré el puerto de Apache cuando tenga la oportunidad, pero dos aplicaciones pueden enlazarse en el mismo puerto, dado que usan direcciones diferentes.
Robert Munteanu
sí, es cierto, pero es probable que openVPN redirija a la misma IP, no localhost (eso sería lo más sensato)
Hubert Kario
En realidad quise decir port-share localhost 443. Lo intenté port-share localhost 10443, pero todavía no funcionó, el mismo error.
Robert Munteanu
ah, lo siento, estaba diciendo una cosa y mostrando configuración para la otra. Supongo que Apache tiene que escuchar en la misma IP que openvpn está escuchando, es decir, público, no localhost. Actualicé mi respuesta.
Hubert Kario
Una cosa más, ¿estás seguro de que tu versión de openvpn admite esta opción? (prueba con openvpn --help | grep port-share) ¿Y está seguro de que Apache escucha en el puerto configurado y tiene SSL funcionando?
Hubert Kario
2

Al encontrar una respuesta que se adapta a mi servidor, encontré a todos hablando de la portsharefunción de la configuración de OpenVPN. Sin embargo, en mi caso, necesito saber la dirección IP real del cliente para el registro y otras funciones. Descubrí que el uso portsharehace que se registre la IP local del servidor.

Para arreglar esto,

  1. Agregar portshare [port]función en OpenVPN
  2. Configurar el servidor Apache para escuchar [port]
  3. Instale la extensión ProxyProtocol (siguiendo las instrucciones en el archivo readme del repositorio), disponible en: https://github.com/roadrunner2/mod-proxy-protocol
  4. Agregue la línea ProxyProtocol Onen la configuración de Apache.

Debería funcionar y cumplir el propósito anterior. Acabo de publicar esto y espero que pueda ayudar a alguien que quiera hacer algo como yo.

Nguyen H Chan
fuente
1

La opción de puerto compartido de OpenVPN le permite redirigir el tráfico a otro sitio HTTPS, no a un servidor web normal; el error que estás viendo

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

se produce cuando se envía una solicitud SSL a un sitio que no es 0SSL. Puedo reproducir el error usando

  port-share localhost 80

(en lugar de 443) Si configura su sitio HTTPS correctamente, el puerto compartido funcionará.

HTH

JJK

enero
fuente
0

Actualización: Noté que la dirección IP de los visitantes del sitio web siempre estará 127.0.0.1en los registros del servidor web. Este es un problema si desea conocer el origen de una conexión o utilizar una herramienta como fail2ban. Parece que no hay forma de tener la dirección IP real del visitante en los registros de Apache si estamos usando OpenVPN port-share( https://forums.openvpn.net/viewtopic.php?t=22599 ), por lo que utilicé la herramienta SSLH en modo transparente: /unix/373717/how-does-sslhs-transparent-mode-work/532333#532333

Respuesta original:

Si alguien usa OpenVPN Access Server, debe ir a /usr/local/openvpn_as/scripts/(por ejemplo en Debian) y ejecutar este comando:

./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

Fuente:

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

En mi caso, no necesitaba hacer el comando para la clave vpn.server.port_share.servicey usé el comando en service openvpnas restartlugar de ./sacli start.

Reemplacé <LOCAL_IP>con 127.0.0.1y <PORT>con 4443desde que configuré Apache para escuchar en el puerto 4443.

Mi archivo /etc/apache2/ports.confestá configurado así:

Listen 80

<IfModule ssl_module>
        Listen 4443
</IfModule>

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

Y mi configuración de Apache SSL en /etc/apache2/sites-enabled/000-default.confcomienza así: <IfModule mod_ssl.c> <VirtualHost *:4443>

Nota: Utilicé OpenVPN Access Server en el pasado ya que fue fácil de configurar. También hay scripts alternativos para configurar OpenVPN que tienen la ventaja de ser de código abierto y no limitar la cantidad de usuarios, por ejemplo: https://github.com/Nyr/openvpn-install

Baptx
fuente