Свой быстры и надежный 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>
И не бояться при этом, что на сервере что-то произойдет правомерное.