Совместное использование порта OpenVPN с Apache / SSL

8

Я пытаюсь настроить OpenVPN для прослушивания через порт 443, а затем передать весь трафик HTTPS в Apache, используя эту port-shareопцию. Соответствующие фрагменты конфигурации:

OpenVPN

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

Apache с SSL

Listen localhost:443

Мой OpenVPN-клиент подключается нормально, но при открытии страницы с поддержкой HTTPS я получаю ошибки. Firefox говорит:

SSL получил запись, превышающую максимально допустимую длину.

(Код ошибки: ssl_error_rx_record_too_long)

Керл говорит

curl: (35) ошибка: 140770FC: процедуры SSL: SSL23_GET_SERVER_HELLO: неизвестный протокол

Запрос заканчивается на Apache, так как я вижу в журналах ошибок следующие сообщения:

[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

Запись сообщений для 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

Используя httpd-2.2.3-43.el5.centos и openvpn-2.1.1-2.el5.

Что я должен сделать, чтобы совместное использование портов работало?


Обновление : Использование

port 443
port-share localhost 10443

а также

Listen localhost:10443

не имеет значения.


Обновление 2 : вывод некоторых команд

[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       
Роберт Мунтяну
источник

Ответы:

8

port-shareопция устанавливает порт , другое приложение слушает.

Что вы хотите сделать, это настроить

доля порта 10443

и установите Apache для прослушивания через порт 10443:

Слушайте <ваш-public-ip>: 10443

Это потому, что два приложения не могут открыть один и тот же порт одновременно.

Хьюберт Карио
источник
Спасибо за ответ. OpenVPN связывается с публичным адресом, а Apache - с локальным. Я изменю порт Apache, когда у меня будет такая возможность, но два приложения могут связываться с одним и тем же портом, учитывая, что они используют разные адреса.
Роберт Мунтяну
да, правда, но вполне вероятно, что openVPN будет перенаправлять на тот же IP, а не на localhost (это было бы разумно)
Hubert Kario
Я действительно хотел сказать port-share localhost 443. Я пробовал port-share localhost 10443, но все равно не получилось, такая же ошибка.
Роберт Мунтяну
ах, извините, я говорил одно и показывал конфиг для другого. Я предполагаю, что apache должен прослушивать тот же IP, что слушает openvpn, то есть public, а не localhost. Обновил мой ответ.
Хьюберт Карио
Еще одна вещь, вы уверены, что ваша версия openvpn поддерживает эту опцию? (попробуйте с openvpn --help | grep port-share). И вы уверены, что apache прослушивает настроенный порт и работает ли SSL?
Хьюберт Карио
2

Находя ответ, который подходит моему серверу, я обнаружил, что все говорят о portshareфункции конфигурации OpenVPN. Однако в моем случае мне нужно знать фактический IP-адрес клиента для ведения журнала и других функций. Я обнаружил, что использование portshareвызывает локальный IP-адрес сервера для регистрации.

Чтобы исправить это,

  1. Добавить portshare [port]функцию в OpenVPN
  2. Настройте сервер Apache для прослушивания [port]
  3. Установите расширение ProxyProtocol (следуя инструкциям в файле readme), доступное по адресу : https://github.com/roadrunner2/mod-proxy-protocol
  4. Добавьте строку ProxyProtocol Onв конфиге Apache.

Это должно работать и служить вышеуказанной цели. Только что опубликовал это и надеюсь, что это может помочь кому-то, кто хочет сделать что-то, как я.

Нгуен Х Чан
источник
1

Опция общего доступа к портам в OpenVPN позволяет перенаправлять трафик на другой сайт HTTPS, а не на обычный веб-сервер; ошибка, которую вы видите

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

происходит, когда запрос SSL отправляется на сайт, отличный от 0SSL. Я могу воспроизвести ошибку с помощью

  port-share localhost 80

(вместо 443) Если вы правильно настроили свой HTTPS-сайт, то будет работать совместное использование портов.

НТН,

JJK

janjust
источник
0

Обновление: я заметил, что IP-адрес посетителей сайта всегда будет 127.0.0.1в журналах веб-сервера. Это проблема, если вы хотите узнать происхождение соединения или использовать инструмент, подобный fail2ban. Похоже, что нет никакого способа получить реальный IP-адрес посетителя в журналах Apache, если мы используем OpenVPN port-share( https://forums.openvpn.net/viewtopic.php?t=22599 ), поэтому я использовал инструмент SSLH в прозрачном режиме: /unix/373717/how-does-sslhs-transparent-mode-work/532333#532333

Оригинальный ответ:

Если кто-то использует OpenVPN Access Server, вам нужно перейти /usr/local/openvpn_as/scripts/(например, в Debian) и выполнить следующую команду:

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

Источник:

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

В моем случае мне не нужно было делать команду для ключа, vpn.server.port_share.serviceи я использовал команду service openvpnas restartвместо ./sacli start.

Я заменил <LOCAL_IP>на 127.0.0.1и <PORT>с, 4443так как я настроил Apache для прослушивания через порт 4443.

Мой файл /etc/apache2/ports.confнастроен так:

Listen 80

<IfModule ssl_module>
        Listen 4443
</IfModule>

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

И моя конфигурация Apache SSL /etc/apache2/sites-enabled/000-default.confначинается следующим образом: <IfModule mod_ssl.c> <VirtualHost *:4443>

Примечание: я использовал OpenVPN Access Server в прошлом, поскольку его было легко настроить. Существуют также альтернативные сценарии для настройки OpenVPN, которые имеют преимущество быть открытым исходным кодом и не ограничивают количество пользователей, например: https://github.com/Nyr/openvpn-install

baptx
источник