В данной статье я расскажу как развернуть 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)