April 14, 2019

Как поднять прокси для тележеньки. (Спойлер - просто!)

Однажды настал момент когда я устал от нестабильного соединения в Telegram. Я никогда не был сторонником бесплатных и публичных решений и поэтому решил быстренько купить себе VPS и поднять мне и друзьям прокси.

15 минут и машина с Ubuntu 16.04 LTS на борту готова. В качестве прокси будем использовать Dante Server 1.4.2, эта версия поддерживает работу с авторизованными пользователями и в ней исправлены многие ошибки.

SOCKS — сетевой протокол, который позволяет клиент-серверным приложениям прозрачно использовать сервисы за фаерволами. SOCKS базируется на стандарте TCP/IP и позволяет работать с любыми протоколами (версия Socks 4 – с TCP, Socks 5 – с TCP и UDP). SOCKS proxy просто передает данные от клиента к серверу, не вникая в содержимое самих данных (поэтому он может работать с HTTP, FTP, SMTP, POP3, NNTP, etc.).

1. Установка Dante Server

Скачаем и разархивируем исходники сервера:

cd /opt
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/

Установим необходимые утилиты и зависимости:

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

Подготовим файлы dante для компиляции:

mkdir /opt/dante
./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

Компилируем:

make

Упаковываем в пакет и устанавливаем:

checkinstall

Проверяем работу:

/opt/dante/sbin/sockd -v
Dante v1.4.2.  Copyright (c) 1997 - 2014 Inferno Nettverk A/S, Norway

2. Настройка сервера

Создадим пользователи и установим пароль:

useradd -s /bin/nologin telegram
passwd telegram

Узнаем название сетевого интерфейса:

ifconfig

eth0      Link encap:Ethernet  HWaddr 00:50:56:bd:74:65
lo        Link encap:Local Loopback

В моем случае он называется eth0. Пропишем его в конфигурационном файле:

nano /etc/sockd.conf

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

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

# На каком сетевом интерфейсе и порту обслуживаем socks клиентов
internal: eth0 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
}

Ещё один вариант настройки конфигурации:

logoutput: syslog stdout /var/log/sockd.log
internal: x.x.x.x port = 1080
external: x.x.x.x
socksmethod: username 
user.privileged: root
user.unprivileged: nobody
user.libwrap: nobody
client pass
{
from: 0.0.0.0/0 to: 0.0.0.0/0
log: error
}
client block {
from: 0.0.0.0/0 to: 127.0.0.0/8
log: connect error
}
socks pass
{
from: 0.0.0.0/0 to: 0.0.0.0/0
command: connect
log: error
socksmethod: username
}

3. Автоматический запуск сервера

Для того, чтобы запуск сервера происходил при старте системы, соберём модуль запуска. Для этого необходимо создать файл /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  [email protected] 

# 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

Сделаем скрипт запуска исполняемым:

chmod +x /etc/init.d/sockd

Обновим конфигурацию демонов:

systemctl daemon-reload

И включим модуль:

systemctl enable sockd

Запустим Dante server:

systemctl start sockd

Перезагрузим конфигурацию:

systemctl enable danted && systemctl restart danted 

4. Формируем ссылку для Telegram

https://t.me/socks?server=example.com&port=9999&user=username&pass=password

Оригинальная статья https://levashove.ru/kak-podnyat-svoj-socks5-server-dlya-telegram/amp/