Socks5 proxy на CentOS 7

Введение

Всё чаще возникает необходимость отстаивать базовые конституционные права. Эта статья о том, как защитить право на тайну переписки. Самый базовый и простой вариант - настроить прокси соединение (вариант соединения настраивается отдельно в каждом приложении). Это само по себе не даст гарантии, что вашу переписку не прочтут злые хакеры, но позволит "притвориться", что вы ходите на какой-то обычный сайт по HTTPS. Хотя на самом деле это может быть вовсе не сайт, а сервер, например, Telegram.
Чтобы проделать всё описанное в статье, нужно иметь подопытный сервер с CentOS 7 (хотя инструкция подойдёт и для других ОС GNU/Linux), например, купленный VDS или VPS в какой-нибудь стране, где неукоснительно соблюдаются права человека.

Установка и настройка Dante

Выбор пал на Dante прокси из-за того, что у него оказался готовый пакет для CentOS (в инструкциях к другим прокси рекомендовалось компилировать из исходников). Сначала настройку делал по статье "Установка Dante Socks proxy на Centos 7". Но оказалось, что там не хватает нескольких важных моментов. Также были полезными статьи "Настройка простого SOCKS5 прокси-сервера для личного использования" и "Установка и использование Dante в качестве сервера Socks5 на Ubuntu 16". Итак, установка с нуля (все шаги из той статьи, плюс дополнения):

1. Установка

Добавляем репозиторий (тут и далее все действия от root, либо подставляйте sudo перед командой):
yum install http://mirror.ghettoforge.org/distributions/gf/gf-release-latest.gf.el7.noarch.rpm
Устанавливаем пакет
yum --enablerepo=gf-plus install dante-server

Создаём каталог для pid-файла
mkdir /var/run/sockd

Бэкапим  стандартный конфиг
mv /etc/sockd.conf /etc/sockd.conf.orig

2. Настройка конфига

В какой-то момент у Dante изменился состав опций конфига. В интернете не понятно, о какой версии идёт речь. Старые опции не работают на новой версии. Это добавляет путаницы. Эта инструкция точно работает для версии Dante v1.4.1. Узнать версию уже установленной программы можно так:
sockd -v
Версия программы и потребление ресурсов сервера:

Конфиг для работы на порту 443 (стандартный порт для HTTPS). Это подойдёт вам, если на этом же сервере у вас не работает какая-нидудь другая программа на этом же порту (например, web-сервер Apache или Nginx или любой другой).
nano /etc/sockd.conf

user.privileged: root
user.unprivileged: nobody

# The listening network interface or address.
internal: 0.0.0.0 port=443
#internal: 0.0.0.0 port=1080 # можно указать несколько портов, по умолчанию 1080

# The proxying network interface or address.
external: eth0

logoutput: syslog stdout /var/log/sockd.log
errorlog: /var/log/sockd_err.log
# socks-rules determine what is proxied through the external interface.
# The default of "none" permits anonymous access.
socksmethod: username

# client-rules determine who can connect to the internal interface.
# The default of "none" permits anonymous access.
clientmethod: none

client pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: connect disconnect error
}
  
socks pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: connect disconnect error
}

Этот конфиг делает так, что клиенты смогут подключаться к вашему прокси по имени и паролю пользователей (активных) вашего сервера. Т.е. нужно завести отдельных пользователей, которые собой будут являть данные для подключения к прокси.
Для настройки работы IPv6 есть вот такая страница в помощь - http://www.inet.no/dante/doc/1.4.x/config/ipv6.html. У меня получилось добавить (но это не точно) поддержку IPv6 с помощью добавления:
internal 0:0:0:0:0:0:0:0 port=443
И заменить блок
client pass {
    from: 0/0 to: 0/0
    log: connect disconnect error
}
на блок
client pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: connect disconnect error
}

3. Добавляем пользователей

Добавляем пользователей аккуратно, чтобы им не было разрешено ничего лишнего на сервере (например, подключаться по SSH) :
useradd --shell /usr/sbin/nologin proxyuser
passwd proxyuser
Так можно завести общего пользователя (в данном случае логин: proxyuser), данные которого можно использовать самому и передать близким людям, которым можно доверить это навсегда. Для друзей лучше заводить отдельных пользователей аналогичным образом. В будущем, если нужно будет отлучить пользователя от доступа к прокси, достаточно будет заблокировать пользователя на сервере.
Можно задать пароль пользователю со специальным ключом для автоматической деактивации пользователя по прошествии заданного времени (демо-режим своеобразный настроить):
passwd --inactive10 testuser
А так можно заблокировать определённого пользователя:
passwd --lock testuser
У команды создания паролей много разных полезных опций.
Если не потребуется отслеживать частоту подключений пользователей, то в конфиге можно заменить строки:
log: connect disconnect error
На
log: error
В этом случае в лог /var/log/sockd.log будет складываться меньше записей.

4. Запуск прокси-сервера

Запуск и управление производится стандартным образом с помощью systemd. Запуск:
systemctl start sockd.service
Добавление в автозапуск (на случай перезагрузки сервера):
systemctl enable sockd.service
Перезапуск:
systemctl restart sockd.service

5. Прочие разрешения для Dante на сервере

На удивление, для SeLinux не потребовалось никаких дополнительных действий.
Для файервола нужно разрешить порт 443:
firewall-cmd --zone=public --add-service=https
firewall-cmd --zone=public --permanent --add-service=https
Если бы порт был другой, то правило выглядело бы иначе:
firewall-cmd --permanent --zone=public --add-port=1080/tcp
firewall-cmd --reload
Полезной статьёй про Firewalld оказалась "Настройка брандмауэра FirewallD в CentOS 7".
В процессе настройки прокси сервера возникали случаи, когда перезапускаемый сервис отваливался с ошибкой "Access denied". Помогла статья "systemd in Fedora 22: Failed to restart service: Access Denied", а конкретно, - переинициализация сервисов:
systemctl daemon-reexec

6. Проверка работы

Для начала можно проверить доступность вашего прокси-сервера с другого компьютера так (вместо PASS и SERVER_IP подставить ваши значения):
curl -v -x socks5://proxyuser:PASS@SERVER_IP:443 https://ya.ru
Если тут соединение удалось, значит и в других программах работать будет. Вот, например, можно сделать ссылку для автоматической настройки прокси в Telegram: https://t.me/socks?server=SERVER_IP&port=443&user=proxyuser&pass=PASS (а если домен t.me у вашего провайдера забанен, то можно попробовать http://t-do.ru/socks?server=SERVER_IP&port=443&user=proxyuser&pass=PASS)
Либо тоже самое набрать вручную в настройках:

Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа