Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
wiki:stunnel [2015/01/13 23:17] [Особенности настроек приложений при работе через stunnel] |
wiki:stunnel [2017/11/03 04:49] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== Stunnel ====== | ====== Stunnel ====== | ||
**Stunnel** это программная обертка, позволяющая спрятать в шифрованный ssl-туннель произвольный трафик. | **Stunnel** это программная обертка, позволяющая спрятать в шифрованный ssl-туннель произвольный трафик. | ||
- | <note tip>Собственно этой технологией вы пользуетесь каждый раз, когда заходите на сервера в Интрнет, с которыми устанавливается соединение по протоколу HTTPS (в строке адреса вы видите: https:\\.....). Фактически web-сервер и клиентский браузер работают с HTTP запросами и ответами (не шифрованный трафик), однако в случае с HTTPS весь этот трафик передается внутри ssl-туннеля установленного между клиентом и сервером. Особенность такого туннеля в том, что весь трафик передается шифрованным. Для шифрования используется сессионные (временные) ключи, которые формируют в процессе обмена клиент и сервер на основе сертификата доступного на сервере. Таким образом - любой клиент может установить защищенное соединение с сервером, однако прочитать информацию передаваемую в канале может только тот клиент, который устанавливал это соединение и сервер, и никто другой (теоретически((На практике крипто-стойкость канала целиком и полностью зависит от алгоритмов шифрования, которые используются (и к примеру протокол OpenSSL v.2 уже объявлен не безопасным т.к. в нем были выявлены серьезные уязвимости).))) эту информацию в процессе передачи прочитать не может. | + | <note tip>Собственно этой технологией вы пользуетесь каждый раз, когда заходите на сервера в Интернет, с которыми устанавливается соединение по протоколу HTTPS (в строке адреса вы видите: https:\\.....). Фактически web-сервер и клиентский браузер работают с HTTP запросами и ответами (не шифрованный трафик), однако в случае с HTTPS весь этот трафик передается внутри ssl-туннеля установленного между клиентом и сервером. Особенность такого туннеля в том, что весь трафик передается шифрованным. Для шифрования используется сессионные (временные) ключи, которые формируют в процессе обмена клиент и сервер на основе сертификата доступного на сервере. Таким образом - любой клиент может установить защищенное соединение с сервером, однако прочитать информацию передаваемую в канале может только тот клиент, который устанавливал это соединение и сервер, и никто другой (теоретически((На практике крипто-стойкость канала целиком и полностью зависит от алгоритмов шифрования, которые используются (и к примеру протокол OpenSSL v.2 уже объявлен не безопасным т.к. в нем были выявлены серьезные уязвимости).))) эту информацию в процессе передачи прочитать не может. |
HTTPS протокол имеет встроенный механизм ssl-туннелирования. | HTTPS протокол имеет встроенный механизм ssl-туннелирования. | ||
Строка 13: | Строка 13: | ||
При этом клиент свой запрос отправляет не на удаленный сервер, а на тот самый порт **localhost**-а, на котором слушает **stunnel**. | При этом клиент свой запрос отправляет не на удаленный сервер, а на тот самый порт **localhost**-а, на котором слушает **stunnel**. | ||
Сервер же слушает (ждет запроса клиента) не на внешнем порту, а на локальном порту на который транслирует передачу **stunnel**. | Сервер же слушает (ждет запроса клиента) не на внешнем порту, а на локальном порту на который транслирует передачу **stunnel**. | ||
- | Посмотрите на схему (что бы было понятнее): | + | Посмотрите на схему (чтобы было понятнее): |
<file>Вариант без stunnel (прямое соединение без шифрования) | <file>Вариант без stunnel (прямое соединение без шифрования) | ||
+----------------------+ +----------------------+ | +----------------------+ +----------------------+ | ||
- | | Клиентский компьютth | | Сервер | | + | | Клиентский компьютер | | Сервер | |
| |(запрос к ex.t.ser.ver:service_port) (слушает service_port на внешнем адресе ex.t.ser.ver)| | | | |(запрос к ex.t.ser.ver:service_port) (слушает service_port на внешнем адресе ex.t.ser.ver)| | | ||
| приложение клиент >--+-->----->------------------------------------------------------------------------------------------------+--> приложение сервер | | | приложение клиент >--+-->----->------------------------------------------------------------------------------------------------+--> приложение сервер | | ||
Строка 39: | Строка 39: | ||
Все эти обратные порты открываются только для связи с другим портом (**netstat** такие порты отмечает статусом ESTABLISHED) и они не являются слушающими (LISTEN статус в выводе **netstat**) соединение (исходящие) от такого порта файерволом не блокируется. | Все эти обратные порты открываются только для связи с другим портом (**netstat** такие порты отмечает статусом ESTABLISHED) и они не являются слушающими (LISTEN статус в выводе **netstat**) соединение (исходящие) от такого порта файерволом не блокируется. | ||
- | И так, с механизмом встраивания **stunnel** в работу клиент-серверного приложения мы разобрались (возможно даже излишне глубоко - копали, "от печки"). Посмотрим теперь как он устанавливается и настраивается. | + | И так, с механизмом встраивания **stunnel** в работу клиент-серверного приложения мы разобрались. Посмотрим теперь как он устанавливается и настраивается. |
===== Установка Stunnel ===== | ===== Установка Stunnel ===== | ||
Строка 47: | Строка 47: | ||
===== Настройка Stunnel ===== | ===== Настройка Stunnel ===== | ||
==== Настройка Stunnel на сервере ==== | ==== Настройка Stunnel на сервере ==== | ||
- | **stunel** использует все файлы с расширением .conf, которые находит в каталоге **/etc/stunnel** как конфигурационные. В каждом файле могут быть описаны как и общие параметры настройки так и настройки для отдельных сервисов, причем в одном файле можно описать несколько сервисов. | + | **stunnel** использует все файлы с расширением .conf, которые находит в каталоге **/etc/stunnel** как конфигурационные. В каждом файле могут быть описаны как и общие параметры настройки так и настройки для отдельных сервисов, причем в одном файле можно описать несколько сервисов. |
Создадим новый конфигурационный файл: | Создадим новый конфигурационный файл: | ||
Строка 70: | Строка 70: | ||
<code> | <code> | ||
[<service1>] | [<service1>] | ||
- | # Укажем, что это конфигурация серверной стороны (в принципе это не обязательно - stunel по умолчанию считает, что она работает как сервер) | + | # Укажем, что это конфигурация серверной стороны (в принципе это не обязательно - stunnel по умолчанию считает, что работает как сервер) |
client = no | client = no | ||
accept = <ex.t.ser.ver>:<s2_port> | accept = <ex.t.ser.ver>:<s2_port> | ||
connect = localhost:<service_port> | connect = localhost:<service_port> | ||
</code> | </code> | ||
- | В этом шаблоне нужно будет указать реальные порты приложения сервера (<**service_port**>) и порт на котором будет принимать соединения **stunel** для этого сервиса (<**s2_port**>). Имя хоста или внешний IP адрес сервера (<**ex.t.ser.ver**>) можно и не указывать (пропустить), тогда **stunnel** будет слушать этот порт на всех адресах сервера. | + | В этом шаблоне нужно будет указать реальные порты приложения сервера (<**service_port**>) и порт на котором будет принимать соединения **stunnel** для этого сервиса (<**s2_port**>). Имя хоста или внешний IP адрес сервера (<**ex.t.ser.ver**>) можно и не указывать (пропустить), тогда **stunnel** будет слушать этот порт на всех адресах сервера. |
Пример для сервиса **telnet** будет выглядеть примерно так (**stunnel** будет ждать установки соединения с клиентской стороны на порту **8023**) | Пример для сервиса **telnet** будет выглядеть примерно так (**stunnel** будет ждать установки соединения с клиентской стороны на порту **8023**) | ||
<code> | <code> | ||
Строка 88: | Строка 88: | ||
</code> | </code> | ||
Созданный файл конфигурации закрываем и сохраняем.\\ | Созданный файл конфигурации закрываем и сохраняем.\\ | ||
- | Кроме конфигурации **stunnel** нужно разрешить. Для этого в файле **/etc/default/stunnel** нужно заменить | + | Кроме настройки конфигурационных файлов, нужно еще разрешить запуск **stunnel**. Для этого в файле **/etc/default/stunnel** нужно заменить |
<code> | <code> | ||
ENABLED=0 | ENABLED=0 | ||
Строка 115: | Строка 115: | ||
==== Настройка Stunnel на клиенте ==== | ==== Настройка Stunnel на клиенте ==== | ||
- | Настройка на клиентской машине отличается от серверной минимально.\\ | + | Настройка на клиентской машине не сильно отличается от настройки на серверной машине.\\ |
Общие настройки (минимальный вариант): | Общие настройки (минимальный вариант): | ||
<code> | <code> | ||
Строка 140: | Строка 140: | ||
где **aa.bb.cc.dd** - IP адрес или DNS-имя внешнего сервера. | где **aa.bb.cc.dd** - IP адрес или DNS-имя внешнего сервера. | ||
- | Настроенный **stunnel** разрешаем (так же как и на сервере, редактируя **/etc/defaul/stunnel**) и запускаем: | + | Настроенный **stunnel** разрешаем (так же как и на сервере, редактируя **/etc/default/stunnel**) и запускаем: |
<code> | <code> | ||
service stunnel start | service stunnel start | ||
Строка 168: | Строка 168: | ||
</code> | </code> | ||
- | Но это приведет к тому, что в маршрутизацию клиента (**ip route**), при установлении соединения с OpnVPN сервером, будет записан маршрут не на внешний сервер, а на localhost (ведь соединение было с localhost, а не с удаленным сервером), что приведет к практически полной неработоспособности сети на клиенте (из за возникшего цикла в правилах маршрутизации). | + | Но это приведет к тому, что в маршрутизацию клиента (**ip route**), при установлении соединения с OpenVPN сервером, будет записан маршрут не на внешний сервер, а на localhost (ведь соединение было с localhost, а не с удаленным сервером), что приведет к практически полной неработоспособности сети на клиенте (из за возникшего цикла в правилах маршрутизации). |
Что бы исправить эту ситуацию нужно "вручную" прописать правильный маршрут, а неверный маршрут - удалить. Для этого в конфигурационный файл OpenVPN добавляем строки: | Что бы исправить эту ситуацию нужно "вручную" прописать правильный маршрут, а неверный маршрут - удалить. Для этого в конфигурационный файл OpenVPN добавляем строки: |