Compartilhamento de porta OpenVPN com Apache / SSL


8

Estou tentando configurar o OpenVPN para escutar na porta 443 e depois passar todo o tráfego HTTPS para o Apache, usando a port-shareopção Os trechos de configuração relevantes são:

OpenVPN

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

Apache com SSL

Listen localhost:443

Meu cliente OpenVPN se conecta muito bem, mas ao abrir a página habilitada para HTTPS, recebo erros. O Firefox diz:

O SSL recebeu um registro que excedeu o comprimento máximo permitido.

(Código de erro: ssl_error_rx_record_too_long)

Curl diz

curl: (35) erro: 140770FC: rotinas SSL: SSL23_GET_SERVER_HELLO: protocolo desconhecido

A solicitação termina no Apache, pois vejo nos logs de erro as seguintes mensagens:

[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

A entrada de mensagens para uma conexão 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

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

O que devo fazer para que o compartilhamento de portas funcione?


Atualização : Usando

port 443
port-share localhost 10443

e

Listen localhost:10443

Não faz diferença.


Atualização 2 : alguma saída 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       

Respostas:


8

a port-shareopção define a porta que o outro aplicativo está ouvindo.

O que você quer fazer é configurar

compartilhamento de porta 10443

e defina o Apache para escutar na porta 10443:

Ouça <your-public-ip>: 10443

Isso ocorre porque dois aplicativos não podem abrir a mesma porta ao mesmo tempo.


Obrigado pela sua resposta. O OpenVPN se liga ao endereço público, enquanto o Apache se liga ao host local. Mudarei a porta Apache quando tiver chance, mas dois aplicativos podem ser ligados na mesma porta, pois eles usam endereços diferentes.
— Robert Munteanu

sim, é verdade, mas é provável que OpenVPN irá redirecionar para o mesmo IP, não localhost (que seria a coisa sensata a fazer)
— Hubert Kario

Na verdade, eu quis dizer port-share localhost 443. Eu tentei port-share localhost 10443, mas ainda não funcionou, mesmo erro.
— Robert Munteanu

ah, desculpe, eu estava dizendo uma coisa e mostrando a configuração para a outra. Eu acho que o apache precisa escutar no mesmo IP que o openvpn está escutando, ou seja, público, não localhost. Atualizei minha resposta.
— Hubert Kario

Mais uma coisa, você tem certeza de que sua versão do openvpn suporta esta opção? (tente com openvpn --help | grep port-share). E você tem certeza de que o apache escuta na porta configurada e o SSL está funcionando?
— Hubert Kario

2

Ao encontrar uma resposta adequada ao meu servidor, encontrei todo mundo falando sobre a portsharefunção da configuração do OpenVPN. No entanto, no meu caso, preciso saber o endereço IP real do cliente para log e outras funções. Eu descobri que o uso portsharefaz com que o IP local do servidor seja registrado.

Para consertar isso,

  1. Adicionar portshare [port]função no OpenVPN
  2. Defina o servidor Apache para ouvir [port]
  3. Instale a extensão ProxyProtocol (seguindo as instruções no readme do repositório ), disponível em: https://github.com/roadrunner2/mod-proxy-protocol
  4. Adicione a linha ProxyProtocol Onna configuração do Apache.

Deve funcionar e servir ao propósito acima. Acabei de postar isso e espero que ajude alguém que queira fazer algo como eu.


1

A opção de compartilhamento de porta do OpenVPN permite redirecionar o tráfego para outro site HTTPS, não para um servidor da Web comum; o erro que você está vendo

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

ocorre quando uma solicitação SSL é enviada para um site não 0SSL. Eu posso reproduzir o erro usando

  port-share localhost 80

(em vez de 443) Se você configurar seu site HTTPS corretamente, o compartilhamento de portas funcionará.

HTH,

JJK


0

Atualização: notei que o endereço IP dos visitantes do site sempre estará 127.0.0.1nos logs do servidor web. Este é um problema se você deseja saber a origem de uma conexão ou deseja usar uma ferramenta como essa fail2ban. Parece que não há como ter o endereço IP real do visitante nos logs do Apache se estivermos usando o OpenVPN port-share( https://forums.openvpn.net/viewtopic.php?t=22599 ), então usei a ferramenta SSLH no modo transparente: /unix/373717/how-does-sslhs-transparent-mode-work/532333#532333

Resposta original:

Se alguém estiver usando o OpenVPN Access Server, você deverá acessar /usr/local/openvpn_as/scripts/(por exemplo, no Debian) e executar o seguinte 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

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

No meu caso, não precisei executar o comando da chave vpn.server.port_share.servicee usei o comando em service openvpnas restartvez de ./sacli start.

I substituídos <LOCAL_IP>com 127.0.0.1e <PORT>com 4443desde I configurado Apache para escutar a porta 4443.

Meu arquivo /etc/apache2/ports.confestá configurado assim:

Listen 80

<IfModule ssl_module>
        Listen 4443
</IfModule>

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

E minha configuração SSL do Apache /etc/apache2/sites-enabled/000-default.confcomeça assim: <IfModule mod_ssl.c> <VirtualHost *:4443>

Nota: Eu usei o OpenVPN Access Server no passado, pois era fácil de configurar. Também existem scripts alternativos para configurar o OpenVPN, que têm a vantagem de ser de código aberto e não limitar o número de usuários, por exemplo: https://github.com/Nyr/openvpn-install

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.