Сегодня я опишу процесс установки и настройки 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
На этом все. Благодарю за внимание.