SOCKS-прокси с авторизацией по логину и паролю

()

Прокси-сервера являются посредниками между клиентами и серверами. Например они позволяют из локальной сети обращаться к ресурсам глобальной сети. Не самым распространённым но одним из самых продвинутых прокси-протоколов является SOCKS (SOCKet Secure). Для многих приложений это единственный поддерживаемый или наиболее предпочтительный прокси-протокол.

В Linux в качестве SOCKS-прокси обычно используется пакет dante-server, а доступ ограничивают по IP-адресам или включают поддержку PAM и используют системных пользователей. Первый вариант далеко не всегда удобен, а второй весьма спорен. Далее будет показано как настроить dante-сервер с авторизацией по логину и паролю, но без использования системных пользователей.

Мы будем разворачивать наш прокси-сервер на самой дешёвой VPS от Vultr (всего 2.5 USD за достаточную для наших целей конфигурацию), работающей под управлением Ubuntu 16.04. Установим dante-server:

apt-get install dante-server

Далее нужно привести файл "/etc/danted.conf" к виду:

# Настроки логирования
logoutput: stderr
logoutput: /var/log/sockd.log
# Системные пользователи для разных операций
user.privileged: root
user.notprivileged: nobody
user.libwrap: nobody
# Интерфейс и порт, на котором слушает сервер
internal: ens3 port = 8088
# Интерфейс для исходящего трафика
external: ens3
# Будем использовать авторизацию через PAM
method: pam
# Списки доступов.
# Разрешаем всё для авторизованных пользователей
client pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: error
}
pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: error
    # Имя сервиса в PAM
    pam.servicename: sockd
}

Здесь мы указываем авторизацию через PAM, однако несмотря на это мы не будем использовать системных пользователей, а будем использовать файл с паролями. Для этого нам понадобится модуль "pam_pwdfile" и утилита "mkpasswd" из пакета "whois". Установим необходимые пакеты:

apt-get install libpam-pwdfile whois

Теперь создаём файл "/etc/pam.d/sockd" (Важно: имя файла должно совпадать с параметром "pam.servicename" в файле "dante.conf"!), он имеет вид:

#%PAM-1.0
auth required /lib/x86_64-linux-gnu/security/pam_pwdfile.so pwdfile=/etc/danted.passwd
account required pam_permit.so

Ну и наконец создаём файл "/etc/danted.passwd", каждая строчка которого имеет вид:

логин:шифрованный_пароль

И вот тут как раз пригодится утилита "mkpasswd": с ещё помощью нужно шифровать пароли. Закончив настройку перезапускаем сервис:

service danted restart

Так же если используется файрволл то необходимо разрешить обращение к порту tcp/8088. На этом настройка сервера закончена и можно приступать к настройкам клиентов. Например для одного популярного мессенджера настройки будут выглядеть так:

Настройки socks-прокси в популярном мессенджере

Если вы используете браузер Firefox то столкнётесь с тем что он не поддерживает авторизацию на SOCKS-прокси. В качестве решения можно установить дополнение FoxyProxy Standard. В браузере Google Chrome такое же ограничение можно обойти с помощью расширения Proxy Helper.

На этом всё. Приятной работы!

Ключевые слова: socks, socks5, dante, авторизация, pam, password, mkpasswd.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

Anonymous 2018-04-20 12:13:49 (#)

Привет!
Как скорость на вультре из Казани?
А само соединение до сокс-прокси получается нешифрованным?

MooSE 2018-04-20 16:21:00 (#)

Как скорость на вультре из Казани?
А само соединение до сокс-прокси получается нешифрованным?

На трёхмегабитном интернете - три мегабита:) Через wifi в гостях намерял 16 мбит/с. (подозреваю что это ограничение той сети).

Соединение до сокс-прокси нешифрованное. Да.

Anonymous 2018-04-24 12:26:55 (#)

Этот конфиг не рабочий. Сервер не стартует из-за строки pam.servicename: sockd

MooSE 2018-04-24 13:40:34 (#)

Этот конфиг не рабочий.
При наборе статьи немного ошибся. Исправил.

Anonymous 2018-04-24 15:13:11 (#)

Вы не в курсе, как сделать авторизацию через freeradius? Все найденные мной в интернете инструкции не актуальны на данный момент.

MooSE 2018-04-24 15:38:20 (#)

Вы не в курсе, как сделать авторизацию через freeradius?
В тексте выше используется авторизация через PAM, а в PAM для сервиса sockd используется модуль pam_pwdfile. Для PAM есть модуль pam_radius_auth. Соответственно можно попробовать переписать конфигурацию PAM-сервиса sockd на использование pam_radius_auth и всё должно поехать.

Anonymous 2018-04-24 15:53:11 (#)

Да, я в курсе. Пробовал настроить на разных ОС(Centos, Debian, Ubuntu) и везде проблема с secret. Dante пишет, что он не верный, хотя несколько раз перепроверял - всё было ОК.

MooSE 2018-04-24 16:47:49 (#)

К сожалению тут ничем помочь не могу. У меня и радиуса-то рабочего под рукой нет чтобы попробовать на него авторизацию завернуть:) А специально поднимать чтобы попробовать - тут надо время, которое ещё надо найти:)

Anonymous 2018-05-20 10:11:28 (#)

Автор то сам пробовал Proxy Helper под хром? Он всё ещё не поддерживает socks авторизацию из-за ограничений хрома.

MooSE 2018-05-21 09:03:43 (#)

Он всё ещё не поддерживает socks авторизацию из-за ограничений хрома.
Каюсь, не пробовал. Сейчас попробовал - действительно не умеет. Печально.

Anonymous 2018-05-30 14:10:55 (#)

можно ли сделать так, чтоб пользователь пользовался прокси только сам т.е. не смог передать пароль другим
например вход по логину только с одного IP. а с других запрет пока не освободится логин.
меня волнует что при передаче пароля юзеру он разлетится по всему интернету.
я понимаю что подключения длятся секунды но может есть какие-то таймауты или что-то подобное?
хочу так... юзер прошел авторизацию на прокси с какого-то адреса и в течении например минут 5, с этим логином, с других адресов вход запрещен.

MooSE 2018-05-31 23:28:46 (#)

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

Нет. Подробно объяснять немного лениво. В качестве альтернативы могу посоветовать смотреть в сторону VPN. Там подобный функционал является штатным.

Anonymous 2018-07-19 16:44:00 (#)

Файл в /etc/pam.d/sockd

auth sufficient /lib/security/pam_radius_auth.so debug
account sufficient /lib/security/pam_radius_auth.so

/etc/pam_radius_auth.conf
# server[:port] shared_secret timeout (s)

Конфиг dante
internal: youip
port = youport
external: youip method: pam #none #clientmethod: none user.privileged: root user.notprivileged: sockd
.........
Работает дебиан 8 убунту 16 убунту 18 уже год.
Извините за некропост

MooSE 2018-07-20 12:00:44 (#)

Извините за некропост
По-моему в любом случае круто. Если кто будет гуглить - попадёт сюда и в комментариях найдёт решение. Спасибо:)

Anonymous 2018-11-08 23:55:23 (#)

на каждого пользователя по 20 коннектов чтоб не раздавал пароль:
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
session.max: 20
user: vasja # если убрать строку то 20 будет всего на всех, прописывать каждого юзера тоскливо а как сделать проще не знаю, подскажите?
log: error connect
}

Anonymous 2020-07-14 07:25:14 (#)

Для тех, кто подрубает dante через freeradius - самое главное после настроек и конфигов нужно выключить и freeradius и dante. Настройки и установку соберете по интернету и по комментариям выше. Как-нибудь сделаю статью на своем блоге, намучился я сам очень с этим вопросом. Так вот, вы всё застопили. Потом включите freeradius и смотрите его состояние по systemctl status freeradius.service и как увидите норм логи нажимайте Ctr+C (это так вы выйдете) и только потом запускайте Dante (я сам компилил его из исходников) и тоже проверьте через systemctl status sockd.service. Если вы все сделали правильно - всё заработает. Пишу сей коммент после 4 реинсталлов операционки и накатывания всего и вся снова и снова. Нормально всё пашет на Ububntu 16.04.6 LTS.

Anonymous 2020-07-14 07:31:30 (#)

Продолжение этой истории - https://www.ylsoftware.com/news/698#3153. Вот вывод который подкрепит вас удовлетворительным коннектом, команда systemctl status sockd.service, Ububntu 16.04.6 LTS:
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности