Свой быстры и надежный proxy сервер

Свой быстры и надежный proxy сервер

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

В данный статье будет рассмотрен принцип создания собственного прокси на базе SSH туннеля и полноценного VDS/VPS сервера.

SSH Туннель

Этот вид proxy наиболее простой и для его использования достаточно иметь ssh подключение к серверу в глобальном интернете, через который необходимо заходить в сеть. В таких ситуация подойдет полноценный сервер, виртуальный сервер или даже обычный хостинг, куда будет производиться подключение.

Есть несколько видов подключения по по ssh туннелю, мы же будем рассматривать только один вариант — динамический туннель. В отличие от туннелей с явным указанием правил трансляции, динамический туннель работает совсем по другому принципу. Вместо указания однозначного сопоставления вида адрес:порт для каждого адреса и порта назначения, открывается сокет на локальной стороне SSH сессии, который превращает ваш хост в прокси-сервер,   работающий по протоколу SOCKS4/SOCKS5. В следствии этого, такое подключение является не безопасным т.к. данный сокет открыт «внешнему миру» и к нему могут подключиться сторонние устройства.

Принцип реализации на ОС Windows очень прост, достаточно установить PuTTY и во вкладке Connection->SSH->Tunnels добавить подключение по ssh к необходимому серверу.

Для устройств под управлением ОС Linux необходимо открыть терминал и вбить команду 

ssh -fC2qTnN -D <порт> -p <порт> <удаленный_пользователь>@<удаленный_сервер>
  • -f Запросит ssh перейти в фоновый режим только перед выполнением команды.
  • -C Включит сжатие всех данных (включая stdin, stdout, stderr и данные для перенаправленных Х11 и TCP/IP соединений).
  • -2 Принуждает ssh использовать только протокол версии 2.
  • -q Тихий режим. Подавляет все предупреждения и диагностические сообщения. Будут отображены только фатальные ошибки.
  • -T Отменить переназначение терминала.
  • -n Перенаправляет стандартный ввод из /dev/null (фактически, предотвращает чтение из стандартного ввода).
  • -N Не выполнять удаленную команду.
  • -D [локальный ] порт
  • -p [удаленный ] порт

 

VDS/VPS сервер

Что бы поднять прокси сервер достаточно самой простой виртуальной машины, даже за 1 евро в месяц от arubacloud.com, при условии, что от данного сервиса можно получить бесплатно на 2 месяца пробный виртуальный сервер — это очень хороший вариант.

Все операции производимые на сервере будет происходить через root пользователя.

Первым делом после покупки сервера необходимо его обновить

apt-get update
apt-get upgrade

После чего базовый минимум для дальнейшей работы

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

создадим пользователя для подключения и добавим его в новую групп для которой запретим подключение по ssh

useradd -m usr_socks && passwd usr_socks
groupadd no-ssh
usermod -G no-ssh usr_socks
nano /etc/ssh/sshd_config

В редакторе nano в конце файла «/etc/ssh/sshd_config» дописываем строчку «DenyGroups no-ssh» и перезагружаем ssh сервер командой

service ssh restart

Теперь все первичные настройки для установки proxy сервера готовы.

Приступаем к установке «dante-server»

cd /opt/
mkdir dante
wget http://www.inet.no/dante/files/dante-1.4.2.tar.gz
tar -xvf dante-1.4.2.tar.gz
cd dante-1.4.2/
./configure --prefix=/opt/dante
make
checkinstall
/opt/dante/sbin/sockd -v

Собственно сервер готов, теперь его необходимо настроить, для этого скачиваем конфигурационный файл

wget -c https://bvn13.tk/files/85 -O /etc/sockd.conf

Содержимое файла:

#logoutput: /var/log/socks.log
logoutput: stderr

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

# Используемый метод авторизации клиентов. none - без авторизации.
socksmethod: username
#socksmethod: username none
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
}

Добавляем автоматический запуск Dante Server. Для этого надо создать и отредактировать файл «/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

Добавляем запуск демона:

nano /etc/systemd/system/sockd.service

И записываем в файл

[Unit]
Description=Sockd Service
[Service]
 Type=normal
ExecStart=/opt/dante/sbin/sockd
[Install]
WantedBy=multi-user.target

Делаем скрипт выполняемым и обновляем демона:

chmod +x /etc/init.d/sockd
systemctl disable sockd
systemctl daemon-reload
systemctl enable sockd

После чего запускаем сервер

systemctl start sockd
netstat -nlpt

Proxy готово, теперь его можно использовать как полноценный SOCKS5 сервер.

Для того что бы применить настройки, к примеру, в telegram достаточно передать ссылку вида

tg://socks?server=<IP>&port=1080&user=usr_socks&pass=<pass>

И не бояться при этом, что на сервере что-то произойдет правомерное.

Опубликовано:
Пожертвование
На развите проекта, продление хостинга и на корм бобику - Дикуше :)