Установка и настройка Dante SOCKS5 Proxy сервера на Ubuntu 18.04 LTS [годная инструкция по обходу блокировки мессенджера Telegram (и др сайтов) Роскомнадзором]

Вспомнилась цитата с одно ещё не заблокированного интернет-ресурса:

— Скоро и на сковородку придется VPN ставить =/
— Главное, чтобы на унитаз не пришлось, а то пошёл посрать, а унитаз заблокирован.
— Придется срать через Нидерланды.

SOCKS — сетевой протокол, который позволяет клиент-серверным приложениям прозрачно использовать сервисы за межсетевыми экранами (фаерволами). SOCKS — это сокращение от «SOCKet Secure». SOCKS не зависит от конкретных протоколов уровня приложений (7-го уровня модели OSI) и базируется на стандарте TCP/IP — протоколе 4-го уровня.

Socks — это о-о-о-очень старый протокол. Вышел в свет аж в 1992-м году. Ясен пень, что в те далёкие времена ни о каком SSL никто ничего не слышал. Поэтому данные, в том числе логины и пароли на подключение к серверу всегда передаются открытым текстом. Далее, подняв такой прокси и передав доступ к нему всем желающим, вы несколько рискуете. Ведь если Вася подключится браузером или скайпом к вашему проксе, а потом сделает что-то нехорошее, то прилетит по шапке именно вам. Поэтому имеет смысл ограничивать сети с/на которые можно ходить, а также закрываться паролями. Правда, последнее тоже не является панацеей (см. выше). 

Кстати о прокси серверах и авторизации. У человека из интернетов дошли руки исследовать эту тему, на которую обратили внимание в одной статье на geektimes (ее правда уже удалили), что даже при условии того, что вы укажете шелл /usr/sbin/nologin, это не спасает вас например от фишки ssh проброса портов. Вам не обязательно нужен шелл, чтобы, например, создать свой сокс сервер на чужом сокс сервере.

ssh -N -D 1337 user@host

Cпасибо ребятам, которые подсказали про ключ -N.
Ну и в дополнение, кроме -D вполне можно использовать и ключи -L -R, что потенциально поможет вам пробросить себя в сеть за уязвимым прокси-сервером или достучаться до служб, висящих на локалхосте.

Хотя этот протокол разработан достаточно давно, он является относительно новым (по сравнению с HTTP proxy). SOCKS позволяет работать с любыми (версия Socks 4 — с TCP, Socks 5 — с TCP и UDP) протоколами. SOCKS proxy просто передает данные от клиента к серверу, не вникая в содержимое самих данных (поэтому он может работать с HTTP, FTP, SMTP, POP3, NNTP, etc.).

SOCKS сервер Dante Server

Dante — это только SOCKS сервер. Если дополнительно нужна поддержка HTTP-прокси, то используйте 3proxy.

Свежая версия Dante в Ubuntu появилась только в версии 18.04. Если у вас 16.04 или 14.04, то вам пригодится статья по самостоятельной сборке deb пакета — https://bvn13.tk/posts/dante-server-on-ubuntu-16-04-lts или https://bvn13.tk/posts/dante-server-on-ubuntu-16-04-lts

Шаг 1. Установка:

sudo apt install dante-server

При старте возможно появится ошибка, это, увы, нормально, её можно пропускать:

warning: checkconfig(): no socks authentication methods enabled.  This means all socks requests will be blocked
error: checkconfig(): no internal address given for server to listen for clients

Шаг 2. Основные настройки

Конфигурационный файл расположен в по адресу: /etc/danted.conf

Ниже представлена типовая конфигурация:

# Путь к лог файлу
logoutput: /var/log/socks.log
# Можно задать отдельный лог файл для ошибок
# errorlog: /var/log/socks_error.log

internal: eth0 port = 1080
external: eth0

##Тип авторизации
#Работа без пароля
#socksmethod: none
#Авторизация по локальным/системным пользователям (наш случай)
socksmethod: username
#Авторизация при помощи логинна/пароля, сохраняемого в PAM-файле:
#socksmethod: pam.username


# Мы используем системных пользователей, поэтому нужны права на чтение passwd
user.privileged: root
user.unprivileged: nobody
user.libwrap: nobody

# Разрешить подключения с любых IP всем пользователям прошедшим авторизацию
client pass {
        from: 0/0 to: 0/0
        log: connect disconnect error ioop
}

socks pass {
        from: 0/0 to: 0/0
        log: connect disconnect error ioop
}

Подробнее об уровнях логированиях на сайте Dante смотрите в разделе Server logging

Уже сейчас можно попробовать запустить сервис без пароля командой sudo service danted start Но для этого в конфигурационном файле должна быть разрешена работа без пароля: socksmethod: none

Шаг 3. Логины/пароли

Добавим нового пользователя proxy_user_01 для работы с SOCKS сервером.

Добавляем нового пользователя:
useradd --shell /usr/sbin/nologin proxy_user_01
Задаем ему пароль:
passwd proxy_user_01

При этом у пользователя не будет доступа к SSH, т.к. в качестве шелла указан nologin.

Шаг 4. Запуск.

Добавляем сервис в автозагрузку и запускаем его:

systemctl enable danted
systemctl start danted

Прокси будет работать по ip вашего сервера и порт, который был указан в файле конфигурации (1080 — стандартный порт). Если у вас на сервере не висят https сайты или вроде того, то настоятельно рекомендую поменять порт, например на 443.

Можно пользоваться!

Шаг 5. Безопасность.

Вместо системных пользователей можно и нужно использовать PAM файл с логинами и паролями (аналог htpasswd).

Для этого необходимо дополнительно установить пакет libpam-pwdfile:

sudo apt install libpam-pwdfile

И после этого в конфигурационном файле/etc/danted.conf заменить строку:

socksmethod: username
на эту
socksmethod: pam.username

В файл /etc/pam.d/sockd добавляем:

auth required pam_pwdfile.so pwdfile /etc/dante.passwd
account required pam_permit.so

Используя mkpasswd (входит в состав пакета whois)

mkpasswd --method=md5 password

Логин и зашифрованный пароль следует теперь добавить в файл: /etc/dante.passwd

proxy_user_01:$apr1$Ts3tPSBs$kfYlyhXwezKq2t6mItWm6/

Можно воспользоваться онлайн сервисом генерации строки логина-пароля: https://www.mkpasswd.net/index.php (выбрав type:crypt-md5) или любым другим, но не стои забывать о том, что такие сервисы могут сохранять ваш логин и пароль у себя, в том числе и нехешированными! 🙂

p.s.: стоит обратить внимание на то, что тип для md5 должен быть $1, а используемый в htpasswd md5 APR не поддерживается. Т.е. вы не сможете сгенирировать правильный пароль при помощи утилиты htpasswd!

Имя PAM сервиса используемое Dante по умолчанию sockd. Так же, если вы хотите использовать файл конфигурации libpam_pwdfile от другого настроенного сервиса, либо использовать несколько конфигураций, вы можете воспользоваться директивой pamservicename в конфигурационном файле Dante. Пример использования:

client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
#the servicename should differ from the servicename in socks-rules
pamservicename: pam_host
}

Дополнительно вы можете почитать статьи: