Stunnel Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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 добавляем строки:​