Dante - установка и настройка SOCKS прокси-сервера.

Сегодня я опишу процесс установки и настройки SOCKS прокси-сервера Dante в Ubuntu Server 16.04. Собирать и устанавливать прокси-сервер буду из исходников, потому что в системных репозиториях Ubuntu отсутствует last-версия с нужными плюшками.

Я полагаю что у вас уже есть VPS/VDS сервер расположенный за рубежом или вы его вот-вот заведете. Если у вас совсем туго с финансами, то есть вариант за 1 евро в месяц, но с лимитированным в 2 ТБ месячным объемом трафика (ссылку не даю, ибо там нет партнерки, а за бесплатно рекламу не делаю, кто гуглит - тот всегда найдет).

Установка Dante

Поскольку Dante будет собираться из исходников, то прежде установим необходимый для сборки набор софта и библиотек.

apt-get install -y autoconf automake libtool pkg-config checkinstall libwrap0 libwrap0-dev libpam0g-dev

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

mkdir dante && cd ~/dante

Скачиваем исходники последней версии Dante с официального сайта.

wget https://www.inet.no/dante/files/dante-1.4.2.tar.gz

Распаковываем архив с исходниками и переходим в распакованный каталог.

tar -zxvf dante-1.4.2.tar.gz

cd dante-1.4.2

Задаем конфигурацию сборки. При желании можно изменить каталог для установки.

./configure --prefix=/etc/dante

В конце должно быть что-то похожее на это:

                     Configure status:

Client:            Enabled
Server:            Enabled
Preloading:        Enabled
Libwrap:           Enabled
BSD Auth:          Disabled, usable bsd_auth.h not found
PAM:               Enabled
GSSAPI:            Not found/disabled
KRB5:              Not found/disabled
SASL:              Not found/disabled
UPNP:              Not found/disabled
Compatability:     issetugid setproctitle strlcpy strvis

                     Modules:

redirect:          Not found
bandwidth:         Not found
ldap:              Not found

Это минимальная конфигурация необходимая для работы прокси-сервера. На модули не обращаем внимания, они платные и не нужны для обычной работы.

Компилируем исходники.

make

Устанавливаем собранный сервер. Обратите внимание что я делаю это с помощью checkinstall, а не make install, сервер будет установлен в виде deb пакета.

checkinstall

# Нажмите y, а потом Enter для создания каталога с документацией.
The package documentation directory ./doc-pak does not exist. 
Should I create a default set of package docs?  [y]: y

Preparing package documentation...OK

# Описание можно не задавать, везде нажимаем Enter
Please write a description for the package.
End your description with an empty line or EOF.
>> 

По завершению установки будет создан deb пакет (dante_1.4.2-1_amd64.deb), который в любое время можно установить на другую машину, но уже без предварительной конфигурации и сборки.

**********************************************************************

 Done. The new package has been installed and saved to

 /root/dante/dante-1.4.2/dante_1.4.2-1_amd64.deb

 You can remove it from your system anytime using: 

      dpkg -r dante

**********************************************************************

Удалить установленный пакет можно с помощью пакетного менеджера dpkg.

dpkg -r dante

На всякий случай проверим установку и работоспособность сервера.

/etc/dante/sbin/sockd -v
Dante v1.4.2.  Copyright (c) 1997 - 2014 Inferno Nettverk A/S, Norway

Конфигурационный файл сервера

Напишем минимальный конфигурационный файл. Он должен находиться в каталоге /etc и называться sockd.conf.

nano /etc/sockd.conf

Подробный разбор всех опций конфигурационного файла приводится на странице описывающей конфигурацию сервера. Я приведу минимальную конфигурацию которая работает везде.

Содержимое конфигурационного файла.

# Лог файлы
errorlog: /var/log/sockd-error.log
logoutput: /var/log/sockd.log

# Входной/выходной интерфейс, порт, ip-адрес
internal: enp0s3 port = 1080
external: enp0s3

# Пользовательские привилегии
user.privileged: root
user.notprivileged: nobody

# Аутентификация
socksmethod: username


#allow connections from local network 
client pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
	    log: error connect disconnect
}


#generic pass statement - bind/outgoing traffic
socks pass {  
        from: 0.0.0.0/0 to: 0.0.0.0/0
        command: bind connect udpassociate
        log: error connect disconnect iooperation
}

Обратить внимание стоит на следующие позиции:

  • internal - входной сетевой интерфейс
  • external - выходной сетевой интерфейс
  • port - порт на котором работает прокси-сервер
  • socksmethod - метод аутентификации пользователя (username - доступ по имени пользователя и паролю)

Обязательно измените internal и external и впишите имя своего сетевого интерфейса. У меня он называется enp0s3, у вас может называться по другому. При необходимости можно изменить значение рабочего порта.

Способ аутентификации изменять не стоит. Вы же не хотите чтобы вашим сервером пользовались все подряд?

Автозапуск сервера

Напишем скрипт который будет запускать сервер при загрузке системы. Скрипт должен располагаться в каталоге /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=/etc/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

● sockd.service - LSB: Start the dante SOCKS server.
   Loaded: loaded (/etc/init.d/sockd; bad; vendor preset: enabled)
   Active: active (running) since Fri 2018-04-27 20:04:15 MSK; 5s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 18597 ExecStart=/etc/init.d/sockd start (code=exited, status=0/SUCCESS)
    Tasks: 20
   Memory: 2.4M
      CPU: 38ms
   CGroup: /system.slice/sockd.service
           ├─18611 /etc/dante/sbin/sockd -D
           ├─18612 sockd: monitor-child    
           ├─18613 sockd: negotiate-child: 
           ├─18614 sockd: request-child: 0 
           ├─18615 sockd: request-child: 0 
           ├─18616 sockd: request-child: 0 
           ├─18617 sockd: request-child: 0 
           ├─18618 sockd: request-child: 0 
           ├─18619 sockd: request-child: 0 
           ├─18620 sockd: request-child: 0 
           ├─18621 sockd: request-child: 0 
           ├─18622 sockd: request-child: 0 
           ├─18623 sockd: request-child: 0 
           ├─18624 sockd: request-child: 0 
           ├─18625 sockd: request-child: 0 
           ├─18626 sockd: request-child: 0 
           ├─18627 sockd: request-child: 0 
           ├─18628 sockd: request-child: 0 
           ├─18629 sockd: request-child: 0 
           └─18630 sockd: io-child: 0/32 ( 

Apr 27 20:04:15 local systemd[1]: Starting LSB: Start the dante SOCKS server....
Apr 27 20:04:15 local sockd[18597]: Starting Dante SOCKS daemon: sockd.
Apr 27 20:04:15 local systemd[1]: Started LSB: Start the dante SOCKS server..

Теперь прокси-сервером можно управлять с помощью стандартных systemctl команд.

Создание пользователей для прокси-сервера

Осталось создать пользователя от имени которого будем подключаться к серверу. Создаем обычного системного пользователя (username заменить на нужное имя).

useradd -s /usr/sbin/nologin username

Зададим пароль для пользователя и подтвердим его.

passwd username

С помощью этого пользователя, точнее его логина и пароля, можно подключаться к прокси-серверу. Таких пользователей может быть создано сколько угодно. Например, если захотите дать доступ к серверу кому-то из друзей или знакомых.

Чтобы сервер не разжирался оперативной памятью будем перезапускать его каждые сутки ровно в 23:55. Добавим задание в cron.

crontab -e
 
Добавить в файл, сохранить и выйти.
 
# Перезапуск dante в 23:55
55 23 * * * systemctl restart sockd

На этом все. Благодарю за внимание.

Ответить:

Please enter your comment!
Please enter your name here