В этой статье речь пойдет о возможности обхода некоторых ограничений в виде блокирования нежелательных портов и нежелательного трафика встречающихся в основном во внутрикорпоративной среде. Сразу предупрежу, что статья написана, как ознакомление, а не призыв к действию и если вы решите «провернуть» все на практике, то по «шапке» получать именно вам, а не мне, я ни за что ниже изложенное ответственности не несу :).
Для реализации нашей идеи нужно установить и настроить Stunnel и 3proxy.


Серверная часть stunnel будет ждать подключение на 443 порту «доверенной зоны» и перенаправлять расшифрованный трафик на интерфейс «петли» на котором запущен и ждет подключений 3proxy. Клиентская часть stunnel подключается к серверной и гонит весь трафик по защищенному каналу до 3proxy, который, в свою очередь, при успешной аутентификации распределяет этот трафик в нужном нам направлении. Думаю схема понятна.
Серверную часть stunnel я буду устанавливать на беспроводной роутер ASUS WL-500gp v1, прошитый прошивкой «Олега» с подключенной флешкой, смонтированной в каталог /opt.

Установка stunnel.

Начнем с установки пакета stunnel. Подключаемся через ssh к консоли роутера и выполняем команды:

# ipkg update
# ipkg upgrade
# ipkg install stunnel

В процессе установки будет создан файл с сертификатом и ключом, будем следовать рекомендациям с оффсайта и сгенерируем свой.

It is a bad idea to use the stunnel.pem file shipped with stunnel except for testing

Переходим в каталог «/opt/etc/stunnel/» и удаляем файл сертификата, созданный по умолчанию:

# rm -f stunnel.pem

Настройка stunnel.

Теперь правим файл конфигурации, который нам понадобится при генерации файла с новым ключом и сертификатом:

# nano stunnel-cert.conf

В этом файле нужно поправить следующие параметры:

Question 	
Country name 	
State or Province name 	
Locality 	
Organization Name 	
Organizational Unit Name 	
Common Name (FQDN)

Особое внимание следует уделить «Common Name (FQDN)» в этом параметре следует указать полное доменное имя сервера, если таковое имеется, на котором запущен stunnel.
Генерируем файл с ключом и сертификатом:

openssl req -new -x509 -days 365 -nodes -config stunnel-cert.conf -out stunnel.pem -keyout stunnel.pem

Удаляем временный файл:

# rm -f stunnel.rnd

Выставляем владельца и права доступа на каталог и файлы:

# chown -R nobody:nobody /opt/etc/stunnel
# cd /opt/etc/stunnel
# chmod 600 *

Разберем параметры, что мы задали:
openssl req -new создание нового сертификата.

-x509 генерирование самоподписанного сертификата в формате pem.

-days 365 сертификат будет действителен в течении года.

-nodes не ставить пароль на ключ.

-config stunnel-cert.conf конфигурацию берем из файла.

-out stunnel.pem записать сертификат в файл.

-keyout stunnel.pem записать ключ в файл.

Вывести информацию о сертификате на экран можно с помощью команд:

# openssl x509 -subject -dates -fingerprint -in stunnel.pem

Если вдруг под рукой не окажется openSSL, то сертификат с ключом можно сгенерировать прямо на сайте stunnel.org через веб-интерфейс, перейдя по ссылке:
http://www.stunnel.org/pem/
Отредактируем конфигурационный файл stunnel, изменив несколько параметров:

# nano stunnel.conf

У меня получился вот такой файл конфигурации:

CAfile = /opt/etc/stunnel/stunnel.pem
cert = /opt/etc/stunnel/stunnel.pem
 
chroot = /opt/var/stunnel/
setuid = nobody
setgid = nobody
 
pid = /stunnel.pid
 
 
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
 
verify = 2
 
debug = 7
output = stunnel.log
 
 
 
[3proxy]
accept  = 443
connect = 127.0.0.1:3128

Кратко пробежимся по конфигурационному файлу:

CAfile местоположение сертификата, применяемого при проверке.

cert имя pem файла в цепочке сертификатов, всегда требуется указание в режиме сервера, указание на стороне клиента — не является обязательным, но при указании на клиенте будет использован в цепочке сертификатов клиента. Сертификаты должны быть представлены в формате PEM, и должны быть рассортированы, начиная с сертификата на самом высоком уровне (корневого ЦС).

chroot запуск сервера в среде chroot.

setuid имя непривилегированного пользователя от имени которого будет работать сервер.

setgid имя группы от имени которой будет работать сервер.

pid файл идентификатора процесса.

verify достаточно важный параметр определяющий уровень проверки сертификатов у клиентов. 2 — означает разрыв соединения при отсутствии или неизвестном сертификате у клиента.

debug уровень отладки, в последствии, как только сервер будет настроен, можно выставить параметр 2 или совсем отключить, при первичных запусках рекомендуется выставить в 7.

output включение и определение местоположения логов.

accept на каком интерфейсе и порту принимать соединение.
connect куда их перенаправлять.

Сохраняем параметры и перезапускаем серверную часть stunnel:

# cd /opt/etc/init.d/
# ls
# ./68Stunnel restart

Проверяем запустился ли stunnel:

# netstat -an | grep LISTEN

Если все хорошо и сервер работает, то переходим к установке 3proxy.

Установка и настройка 3proxy.

Процесс установки достаточно подробно описан на форуме wl500g.info: