Статья как поднять свой Socks5 сервер с авторизацией через mysql. Учтите что Dante сервер условно бесплатный и модули для него платные.
Сервер будет работать в связке PAM+Radius+MySQL . Было это поднято на OS Debian 8 . Начнем:
Обновляем систему, а потом ставим нужные пакеты.
apt install freeradius freeradius-mysql freeradius-utils mysql-server libpam-radius-auth libpam-auth gcc -y
При установке пакетов MySQL попросит указать пароль root.
Качаем последнюю версию Dante. Распаковываем.
cd /tmp https://www.inet.no/dante/files/dante-1.4.3.tar.gz tar -xvf dante-1.4.3.tar.gz
Компилируем
mkdir /opt/dante ./configure --prefix=/opt/dante make make install
Создаем и настраиваем конфигурационный файл Dante
nano /etc/sockd.conf
Выкладываю свой:
#logoutput: stderr logoutput: /var/log/socks.log internal: eth0 port = 1080 //имя и порт интерфейса с которых принимаются запросы external: eth0 //Исходящий интерфейс socksmethod: pam.username user.privileged : root user.notprivileged : sockd client pass { from: 0.0.0.0/0 to: 0.0.0.0/0 log: error connect disconnect } client block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error } socks pass { from: 0.0.0.0/0 to: 0.0.0.0/0 log: error connect disconnect } socks block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error }
socksmethod: pam.username — Это значит что будем авторизоваться через PAM
Создаем файл /etc/pam.d/sockd и записываем в него:
auth sufficient /lib/security/pam_radius_auth.so debug account sufficient /lib/security/pam_radius_auth.so
Это мы указали библиотеки через которые PAM будет проверять соответствие логина и пароля для sockd
Создаем пользователя для прокси сервера (user.notprivileged)
useradd sockd
Заходим в MySQL создаем БД для Radius
mysql -uroot -p mysql>CREATE DATABASE radius; mysql>GRANT ALL PRIVILEGES ON radius.* TO radius@localhost IDENTIFIED BY 'radpass'; mysql> use radius; mysql>SOURCE /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
radpass — это пароль для пользователя radius, под которым Radius будет стучаться к БД
Сразу добавим пользователя для прокси(авторизация)
mysql>INSERT INTO radcheck (UserName, Attribute, Value) VALUES ('proxyuser', 'Password', 'passforproxyuser'); mysql>quit
Открываем конфиг sql Radius
nano /etc/freeradius/3.0/sql.conf
Редактируем подключение к БД
server = 'localhost' #port = 3306 login = 'radius' password = 'radpass' radius_db = 'radius'
Редактируем конфиг демона.
nano /etc/freeradius/3.0/radiusd.conf
Раскомментируем строку:
$INCLUDE sql.conf
В следующем конфиге в секциях authorize{} accounting {} session {} раскомментируем все строки содержащие sql и sql_log
nano /etc/freeradius/sites-available/default
Далее.
nano /etc/freeradius/clients.conf
Находим secret = testing123 и меняем на свой пароль. (ну или не меняем, но запоминаем)
Этот пароль записываем в следующий файл.
nano /etc/pam_radius_auth.conf # server[:port] shared_secret timeout (s) 127.0.0.1 testing123 1 other-server other-secret 3
Перезагружаем radius
/etc/init.d/freeradius restart
Запускаем Dante
/opt/dante/sbin/sockd -D
Проверить сервер можно командой:
curl -v -x socks5://proxyuser:passforproxyuser@xxx.xxx.xxx.xxx:1080 http://www.google.com/ #
Управлять пользователями можно через простенькую админ панель
Автозапуск сервера
Напишем скрипт который будет запускать сервер при загрузке системы. Скрипт должен располагаться в каталоге /etc/init.d/ и называться sockd.
nano /etc/init.d/sockd
Содержимое скрипта sockd.
#! /bin/sh ### BEGIN INIT INFO # Provides: sockd # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start the dante SOCKS server. # Description: SOCKS (v4 and v5) proxy server daemon (sockd). # This server allows clients to connect to it and # request proxying of TCP or UDP network traffic # with extensive configuration possibilities. ### END INIT INFO # # dante SOCKS server init.d file. Based on /etc/init.d/skeleton: # Version: @(#)skeleton 1.8 03-Mar-1998 miquels@cistron.nl # Via: https://gitorious.org/dante/pkg-debian PATH=/sbin:/usr/sbin:/bin:/usr/bin NAME=sockd DAEMON=/opt/dante/sbin/$NAME DAEMON_ARGS="-D" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME DESC="Dante SOCKS daemon" CONFFILE=/etc/$NAME.conf # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions set -e # This function makes sure that the Dante server can write to the pid-file. touch_pidfile () { if [ -r $CONFFILE ]; then uid="`sed -n -e 's/[[:space:]]//g' -e 's/#.*//' -e '/^user\.privileged/{s/[^:]*://p;q;}' $CONFFILE`" if [ -n "$uid" ]; then touch $PIDFILE chown $uid $PIDFILE fi fi } case "$1" in start) if ! egrep -cve '^ *(#|$)' \ -e '^(logoutput|user\.((not)?privileged|libwrap)):' \ $CONFFILE > /dev/null then echo "Not starting $DESC: not configured." exit 0 fi echo -n "Starting $DESC: " touch_pidfile start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS \ || return 2 echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 echo "$NAME." ;; reload|force-reload) # # If the daemon can reload its config files on the fly # for example by sending it SIGHUP, do it here. # # Make this a do-nothing entry, if the daemon responds to changes in its config file # directly anyway. # echo "Reloading $DESC configuration files." start-stop-daemon --stop --signal 1 --quiet --pidfile \ $PIDFILE --exec $DAEMON -- -D ;; restart) # # If the "reload" option is implemented, move the "force-reload" # option to the "reload" entry above. If not, "force-reload" is # just the same as "restart". # echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON sleep 1 touch_pidfile start-stop-daemon --start --quiet --pidfile $PIDFILE \ --exec $DAEMON -- -D echo "$NAME." ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; *) N=/etc/init.d/$NAME # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $N {start|stop|restart|status|force-reload}" >&2 exit 1 ;; esac exit 0
Сделаем скрипт исполняемым.
chmod +x /etc/init.d/sockd
Перечитаем всех демонов.
systemctl daemon-reload
Добавим sockd в автозапуск и запустим его.
systemctl enable sockd systemctl start sockd
Проверим.
systemctl status sockd