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       
Robert Munteanu
fonte

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.

Hubert Kario
fonte
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.

Nguyen H Chan
fonte
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

janjust
fonte
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

baptx
fonte