Поднимаем SOCKS5 на серверах Amazon

28-05-2018 @ 08:33


В данной статье я расскажу как развернуть SOCKS5-сервер на мощностях Amazon Web Services. Не знаю зачем Вам это может пригодиться, но постараюсь объяснить как можно проще и без лишней терминологии как это сделать 🙂 Будет очень много текста, картинок и листинга кода.
Итак, первым делом необходимо зарегистрироваться на AWS Амазона. Для этого переходим по ссылке:
https://aws.amazon.com/ru/ и жмем Регистрация справа сверху.
Не думаю что возникнут проблемы на этом этапе, однако при регистрации Вас попросят указать данные кредитки. Спишут $1 для проверки работоспособности карты, потом вернут. Советую пользоваться какой-нибудь виртуальной картой, вроде, Qiwi или Яндекс.Денег. Процедура обязательна.

Далее логинимся с указанными при регистрации данными и идем в консоль AWS по ссылке:
https://eu-central-1.console.aws.amazon.com/ec2/v2/home?region=eu-central-1
Это регион Франкфурта, но создать сервер можно в любом из перечисленных ниже регионов:

Выберите то что ближе к Вам. От этого будет зависить пинг до сервера.
Далее переходим в раздел INSTANCES — Instances и щелкаем Launch Instance

Следом, в Step 1 появится список образов операционных систем, которые можно установить, но т.к. у нас бесплатный вариант (Free tier eligible) — выберем то что гарантированно запустится: Ubuntu Server 16.04 LTS (HVM)
Жмем Select напротив этого образа.

В появившемся после выбора операционной системы окне (Step 2) ничего не нажимаем кроме кнопки Next: Configure Instance Details

Следующее окно (Step 3) также пропускаем, жмем Next: Add storage

В окне Step 4 предлагается увеличить пространство с 8 гигабайт до разрешенного на free tier лимита. По идее должно быть не более 30 гигабайт, но нам хватит и 8, поэтому жмем Next: Add Tags

Также пропускаем предлагаемые настройки из Step 5 и жмем Next: Configure Security Group

В меню конфигурации групп безопасности Step 6 можно установить IP-адрес с которого будет разрешен доступ по SSH. Для этого в колонке Source укажите Ваш IP-адрес. По-умолчанию значение данного поля равно 0.0.0.0/0, т.е. доступ к серверу отовсюду.
Далее добавим правило для SOCKS5. Будем использовать порт 1080. Нажимаем на кнопку Add rule, выбираем Custom TCP rule и порт 1080, source-доступ отовсюду (0.0.0.0/0). Далее жмем кнопку Review and Launch.

Я намеренно не меняю остальные параметры и не вношу лишних изменений. Разумеется, по хорошему, конфигурировать сервер нужно так чтобы доступ к нему из-вне был минимальный. Т.е. менять стандартные порты подключения, указывать IP-адреса и порты с которых сервер будет доступен. Цель данной статьи не создать безопасный сервер, а создать сервер.


В следующем окошке Step 7 проверяем настройки, если что-то не так — возвращаемся назад, нажав Previous, если всё верно — жмем Launch.

Следующий этап — создание пары ключей по которым Вы будете авторизовываться на сервер по SSH для его настройки и конфигурации. Для этого система предложит Вам создать пару:

Здесь из ниспадающего меню выбираем Create a new key pair и ниже вводим наименование этой пары. После чего жмем Download Key Pair и забираем ключик с введенным выше именем *.pem к себе на компьютер. Далее просто жмем на Launch Instances для запуска сервера.
Если всё хорошо, то Вас автоматически перебросит на главную страницу (https://eu-central-1.console.aws.amazon.com/ec2/v2/home?region=eu-central-1), где в Instances у Вас появится созданная Вами машина.

Вам необходимо будет найти IPv4 Public IP адрес сервера (на скриншоте указал стрелочкой) и запомнить его.

Переходим к генерации второй половины ключа.
Помимо того что Вы забрали *.pem ключ Вам также будет необходимо сгенерировать *.ppk ключ с которым Вы будете проходить авторизацию на сервере.
Вам понадобятся Putty и puttygen. Обе программы доступны по ссылке:
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
Скачивайте под нужную Вам разрядность операционной системы (х86 или х64) в папку, где Вы сохранили *.pem ключ.
Запускаем puttygen и из меню выбираем Ваш ключик Conversions — Import key:

Далее заполняем Key passphrase и повторяем его в поле Confirm passphrase — это фраза по которой будет проходить аутентификация. Для более простого понимания — пароль. После заполнения жмем Save private key и сохраняем *.ppk файл рядом с *.pem файлом.

Больше puttygen нам не понадобится. Открываем putty и заполняем следующие поля:
Hostname or IP address — там указываем IP адрес созданого сервера.
Port оставляем по-умолчанию — 22.
Переходим в дерево настроек слева и раскрываем ветку Connection — SSH — Auth. В поле Private key file for authenication (в самом низу) указываем расположение *.ppk файла.

После чего возвращаемся по дереву слева на ветку Sessions и вводим в поле Saved Sessions название вашего подключения. Делается это для дальнейшего удобства доступа к серверу, чтобы по сто раз не набирать IP адрес и не выбирать *.ppk файл.
Пробуем открыть подключение, нажав на кнопку Open в самом низу.

При первом запуске возникнет окошко с Security Alert, соглашаемся с тем что доверяем данному серверу и жмем Да.
Имя пользователя по-умолчанию ubuntu, вводим его и жмем Enter. Далее сервер запросит passphrase ключа, который мы создавали ранее. Необходимо будет его ввести. Имейте в виду что вводится вслепую, т.е. Вы не увидите привычного перемещения курсора при наборе «пароля».

После успешного входа появится окно, в котором будет минимальная информация о сервере:

Обновим сервер. Для этого введем команду:

sudo apt-get update && sudo apt-get upgrade

В случае необходимости соглашайтесь на скачивание и обновление файлов нажав y и Enter

Теперь установим сам socks5-сервер. В официальных репозиториях Ubuntu старая версия данного сервера, поэтому целесообразно собрать его вручную из исходников. Для этого выполним следующие команды:

cd /opt
sudo wget http://www.inet.no/dante/files/dante-1.4.2.tar.gz
sudo tar -xvf dante-1.4.2.tar.gz
cd dante-1.4.2/

Затем установим необходимые утилиты и зависимости Dante для компиляции в Ubuntu

sudo apt-get install gcc libwrap0 libwrap0-dev libpam0g-dev make checkinstall

Произведем подготовку к компилляции

sudo mkdir /opt/dante
sudo ./configure --prefix=/opt/dante

После компиляции будет выведено на экран терминала нечто похожее:

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

Следом компилируем:

sudo make

Теперь выполним команду упаковки в единый пакет и установки собственно сервера:

sudo checkinstall

После установки на экране появится следующее:

Давайте осуществим настройку сервера. Для этого выполним команду

sudo nano /etc/sockd.conf

и вставим туда следующее содержимое:

logoutput: stderr

# Сетевой интерфейс и порт на котором будут клиенты socks
internal: eth0 port = 1080
# С какого IP или интерфейса выходим во внешний мир
external: eth0

# Используемый метод авторизации клиентов. none - без авторизации.
socksmethod: username

user.privileged: root
user.notprivileged: nobody

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
}

По комментариям, думаю понятно что к чему. Остальные настройки по правилам доступа можно почитать на официальной странице. Сохраняем, нажав последовательно Ctrl+O, Enter и закрываем Ctrl+X

Предположим, что у датацентра Амазона внезапно кончилось электричество. При его подаче сервера должны автоматически запуститься, но наш socks-сервер не запустится, т.к. этого делать пока не умеет, поэтому научим его этому. Выполним команду:

sudo nano /etc/init.d/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

Сохраняем, нажав последовательно Ctrl+O, Enter и закрываем Ctrl+X

Теперь сделаем этот скрипт исполняемым:

sudo chmod +x /etc/init.d/sockd

Обновим конфигурацию демонов и включим скрипт

sudo systemctl daemon-reload && sudo systemctl enable sockd

Далее запускаем сам сервер Dante:

sudo systemctl start sockd

И последний шаг — создадим пользователя: логин и пароль по которому будет проходить авторизация на сервере:

sudo useradd -s /bin/false USERNAME && sudo passwd USERNAME

Вместо USERNAME вставьте желаемое имя пользователя
Пароль вводится без перемещения курсора, поэтому вводите его аккуратно. Ввести придется дважды.

Собственно всё. Вы можете авторизоваться на socks5-сервере со следующими данными:
IP адрес: адрес сервера который вы запоминали и к которому подключались.
Port: 1080
Username: созданный %USERNAME%
Password: введенный к этому %USERNAME% пароль

Сервер будет доступен примерно 744 часа в месяц, ровно 1 год. Что потом — не знаю. Вероятно free tier закончится. Однако понять как работает, исправить если что-то не получилось и воспользоваться созданным у Вас вполне будет возможность.

P.S. Скажу еще что можно купить сервер за 1 доллар в месяц (Centos 7) с выделенным IP адресом и установить всё одной командой:

wget --no-check-certificate https://raw.github.com/Lozy/danted/master/install.sh -O install.sh && bash install.sh

Но ковыряться во всём это же интереснее, правда? 🙂

За помощь в создании данной заметки хочу искренне поблагодарить Vyacheslav N. Boyko (bvn13.tk)