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-лента Telegram канал Twitter

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

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. Там подобный функционал является штатным.
Новый комментарий



© 2006-2018 Вадим Калинников aka MooSE