Partage de port OpenVPN avec Apache / SSL

8

J'essaie de configurer OpenVPN pour écouter sur le port 443, puis transmettre tout le trafic HTTPS à Apache, en utilisant l' port-shareoption. Les extraits de configuration pertinents sont les suivants:

OpenVPN

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

Apache avec SSL

Listen localhost:443

Mon client OpenVPN se connecte très bien, mais lors de l'ouverture de la page activée HTTPS, j'obtiens des erreurs. Firefox dit:

SSL a reçu un enregistrement dépassant la longueur maximale autorisée.

(Code d'erreur: ssl_error_rx_record_too_long)

Curl dit

curl: (35) erreur: 140770FC: routines SSL: SSL23_GET_SERVER_HELLO: protocole inconnu

La demande se termine sur Apache, car je vois dans les journaux d'erreurs les messages suivants:

[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

L'entrée de messages pour une connexion HTTPS est

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

Utilisation de httpd-2.2.3-43.el5.centos et openvpn-2.1.1-2.el5.

Que dois-je faire pour que le partage de port fonctionne?


Mise à jour : utilisation

port 443
port-share localhost 10443

et

Listen localhost:10443

ça ne fait aucune différence.


Mise à jour 2 : sortie de certaines commandes

[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
la source

Réponses:

8

l' port-shareoption définit le port que l' autre application écoute.

Ce que vous voulez faire, c'est configurer

partage de port 10443

et paramétrez Apache pour écouter sur le port 10443:

Écoutez <votre-public->: 10443

En effet, deux applications ne peuvent pas ouvrir le même port à la fois.

Hubert Kario
la source
Merci pour votre réponse. OpenVPN se lie à l'adresse publique, tandis qu'Apache se lie à localhost. Je changerai le port Apache quand j'en aurai l'occasion, mais deux applications peuvent se lier sur le même port, étant donné qu'elles utilisent des adresses différentes.
Robert Munteanu
oui, c'est vrai, mais il est probable qu'OpenVPN redirige vers la même IP, pas vers localhost (ce serait la chose sensée à faire)
Hubert Kario
Je voulais vraiment dire port-share localhost 443. J'ai essayé port-share localhost 10443, mais ça n'a toujours pas fonctionné, même erreur.
Robert Munteanu
ah, désolé, je disais une chose et montrais la configuration pour l'autre. Je suppose que Apache doit écouter sur la même IP que openvpn écoute, c'est-à-dire public, pas localhost. Mis à jour ma réponse.
Hubert Kario
Encore une chose, êtes-vous sûr que votre version d'openvpn prend en charge cette option? (essayez avec openvpn --help | grep port-share). Et êtes-vous sûr qu'apache écoute sur le port configuré et que SSL fonctionne?
Hubert Kario
2

En trouvant une réponse qui convient à mon serveur, j'ai trouvé que tout le monde parlait de la portsharefonction de la configuration OpenVPN. Cependant, dans mon cas, j'ai besoin de connaître l' adresse IP réelle du client pour la journalisation et d'autres fonctions. J'ai constaté que l'utilisation portshareentraîne la journalisation de l'IP locale du serveur.

Pour résoudre ce problème,

  1. Ajouter une portshare [port]fonction dans OpenVPN
  2. Configurer le serveur Apache pour écouter [port]
  3. Installez l' extension ProxyProtocol (en suivant les instructions du fichier Readme du repo), disponible sur: https://github.com/roadrunner2/mod-proxy-protocol
  4. Ajoutez la ligne ProxyProtocol Ondans la configuration Apache.

Cela devrait fonctionner et servir le but ci-dessus. Je viens de poster ceci et j'espère que cela pourra aider quelqu'un qui veut faire quelque chose comme moi.

Nguyen H Chan
la source
1

L'option de partage de port d'OpenVPN vous permet de rediriger le trafic vers un autre site HTTPS, pas vers un serveur Web normal; l'erreur que vous voyez

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

se produit lorsqu'une demande SSL est envoyée à un site non-0SSL. Je peux reproduire l'erreur en utilisant

  port-share localhost 80

(au lieu de 443) Si vous configurez votre site HTTPS correctement, le partage de port fonctionnera.

HTH,

JJK

janjust
la source
0

Mise à jour: j'ai remarqué que l'adresse IP des visiteurs du site Web sera toujours 127.0.0.1dans les journaux du serveur Web. C'est un problème si vous voulez connaître l'origine d'une connexion ou utiliser un outil comme fail2ban. Il semble qu'il n'y ait aucun moyen d'avoir la véritable adresse IP du visiteur dans les journaux Apache si nous utilisons OpenVPN port-share( https://forums.openvpn.net/viewtopic.php?t=22599 ), j'ai donc utilisé l'outil SSLH en mode transparent: /unix/373717/how-does-sslhs-transparent-mode-work/532333#532333

Réponse originale:

Si quelqu'un utilise OpenVPN Access Server, vous devez vous rendre sur /usr/local/openvpn_as/scripts/(par exemple sur Debian) et exécuter ces commandes:

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

La source:

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

Dans mon cas, je n'avais pas besoin de faire la commande pour la clé vpn.server.port_share.serviceet j'ai utilisé la commande à la service openvpnas restartplace de ./sacli start.

J'ai remplacé <LOCAL_IP>par 127.0.0.1et <PORT>par 4443depuis que j'ai configuré Apache pour écouter sur le port 4443.

Mon fichier /etc/apache2/ports.confest configuré comme ceci:

Listen 80

<IfModule ssl_module>
        Listen 4443
</IfModule>

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

Et ma configuration SSL Apache /etc/apache2/sites-enabled/000-default.confcommence comme ceci: <IfModule mod_ssl.c> <VirtualHost *:4443>

Remarque: J'ai utilisé OpenVPN Access Server dans le passé car il était facile à configurer. Il existe également des scripts alternatifs pour configurer OpenVPN qui ont l'avantage d'être open source et de ne pas limiter le nombre d'utilisateurs, par exemple: https://github.com/Nyr/openvpn-install

baptx
la source