Я пытаюсь настроить 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 говорит
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
в port-share
опция устанавливает порт Другой приложение слушает.
Что вы хотите сделать, так это настроить
port-share 10443
и установите Apache для прослушивания порта 10443:
Listen <your-public-ip>:10443
Это потому, что два приложения не могут открыть один и тот же порт одновременно.
Находя ответ, который подходит моему серверу, я обнаружил, что все говорят о portshare
функция конфига OpenVPN. Однако в моем случае мне нужно знать фактический IP-адрес клиента для ведения журнала и других функций. Я обнаружил, что используя portshare
вызывает регистрацию локального IP-адреса сервера.
Чтобы исправить это,
portshare [port]
функция в OpenVPN [port]
ProxyProtocol On
в конфиге Apache. Он должен работать и служить вышеуказанной цели. Просто разместил это и надеюсь, что это поможет кому-то, кто хочет сделать что-то вроде меня.
Опция совместного использования порта OpenVPN позволяет перенаправлять трафик на другой сайт HTTPS, а не на обычный веб-сервер; ошибка, которую вы видите
[error] [client 127.0.0.1] Invalid method in request \x16\x03\x01
происходит, когда запрос SSL отправляется на сайт, отличный от 0SSL. Я могу воспроизвести ошибку, используя
port-share localhost 80
(вместо 443). Если вы правильно настроили свой сайт HTTPS, то совместное использование портов будет работать.
HTH,
JJK
Обновление: я заметил, что IP-адрес посетителей сайта всегда будет 127.0.0.1
в журналах веб-сервера. Это проблема, если вы хотите знать происхождение соединения или хотите использовать такой инструмент, как fail2ban
. Похоже, что нет способа иметь реальный IP-адрес посетителя в журналах Apache, если мы используем OpenVPN port-share
(https://forums.openvpn.net/viewtopic.php?t=22599), поэтому я использовал инструмент SSLH в прозрачном режиме: https://unix.stackexchange.com/questions/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
В моем случае мне не нужно было выполнять команду для ключа 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>
И моя конфигурация SSL Apache в /etc/apache2/sites-enabled/000-default.conf
начинается так: <IfModule mod_ssl.c>
<VirtualHost *:4443>
Примечание. Раньше я использовал OpenVPN Access Server, так как его было легко настроить. Существуют также альтернативные сценарии для настройки OpenVPN, которые имеют то преимущество, что имеют открытый исходный код и не ограничивают количество пользователей, например: https://github.com/Nyr/openvpn-install