Поднимаем приватный socks/proxy-сервер на базе 3Proxy для работы Telegram

На волне блокировки Telegram настроим приватный socks/proxy сервер для работы мессенджера.
В остальном, прокси-сервер может решать любые другие задачи в работе администратора или разработчика.

Поскольку вся инфраструктура моего проекта и компании завязана на Telegram, то обойтись без этого удобного инструмента будет очень сложно, переходить на другие мессенджеры - не вижу смысла, нормальных аналогов нет под требуемые задачи, вывод - использовать proxy, как временное решение.

Блокировка мессенджера планируется на территории РФ, в связи с этим будем использовать любой зарубежный сервер, подойдет самая простая VDS в минимальной конфигурации. (Если вам требуется такая VDS - свяжитесь со мной info@bogachev.biz или Telegram)

Шаг 1. Настройка сервера

На данном этапе выполняем настройку сервера для безопасного соединения.

Отключаем SElinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
# reboot
Изменяем порт подключения к сервису SSH
sed -i -r "s/#Port 22/Port 54997/" /etc/ssh/sshd_config
Указываем работу только по IPv4 протоколу на определенном адресе
sed -i -r "s/#AddressFamily any/AddressFamily inet/" /etc/ssh/sshd_config
sed -i -r "s/#ListenAddress 0.0.0.0/ListenAddress $SERVER_IP_ADDR$/" /etc/ssh/sshd_config

Где $SERVER_IP_ADDR$ - реальный IP-адрес сервера.

Отключаем IPv6 протокол
cat << EOT > /etc/sysctl.d/01-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOT
sysctl -p /etc/sysctl.d/01-ipv6.conf
Принудительно устанавливаем вторую версию протокола SSH

В SSH2 используются мощные алгоритмы шифрования, кроме того поддерживается возможность обнаружения умышленного искажения данных. (Протокол SSH, версии 2 - AES-128, AES-192, AES-256, blowfish, CAST-128, ArcFour)

sed -i -r -e "s/#Protocol 2/Protocol 2/" /etc/ssh/sshd_config
Ограничиваем количество неудачных попыток входа
sed -i -r "s/#MaxAuthTries 6/MaxAuthTries 2/" /etc/ssh/sshd_config
Перезагружаем сервис SSH и проверяем:
systemctl restart sshd
# lsof -i :54997 -P -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 8396 root 3u IPv4 58553 0t0 TCP 195.209.58.112:54997 (LISTEN)
Добавляем правила на файрвол для нового порта, а также убираем дефолт
firewall-cmd --permanent --zone=public --add-port=54997/tcp
firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --reload

Шаг 2. Отключение логирования

Конечно же в целях сохранения дискового пространства :)

Отключаем хранение истории
unset HISTFILE
echo 'unset HISTFILE' >> /etc/bashrc
rm -f ~/.bash_history
Отключаем сервисы syslog/rsyslog и аудит системы
systemctl stop rsyslog && systemctl disable rsyslog

С сервисом Auditd придется немного пошаманить, поскольку просто так его отключить нельзя.

sed -i -r "s/RefuseManualStop=yes/RefuseManualStop=no/" /usr/lib/systemd/system/auditd.service
# reboot
auditctl -D
systemctl stop auditd && systemctl disable auditd
Удаляем объекты директорий
unlink /var/log/messages && ln -s /dev/null /var/log/messages
unlink /var/log/secure && ln -s /dev/null /var/log/secure
unlink /var/log/wtmp && ln -s /dev/null /var/log/wtmp
unlink /var/log/lastlog && ln -s /dev/null /var/log/lastlog
unlink /var/log/audit/audit.log && ln -s /dev/null /var/log/audit/audit.log
unlink /var/log/btmp && ln -s /dev/null /var/log/btmp
unlink /var/log/maillog && ln -s /dev/null /var/log/maillog

Шаг 3. Установка 3proxy

Установим необходимые пакеты, которые понадобятся в процессе сборки.

yum groupinstall "Development tools" -y

Клонируем исходные файлы с git и компилируем:

git clone https://github.com/z3APA3A/3proxy.git
cd 3proxy/
sed -i '1s/^/#define ANONYMOUS 1\n/' ./src/proxy.h # Определяем анонимность сервера
make -f Makefile.Linux
mkdir -p /usr/local/etc/3proxy/bin
touch /usr/local/etc/3proxy/3proxy.pid
cp ./src/3proxy /usr/local/etc/3proxy/bin
cp ./scripts/rc.d/proxy.sh /etc/init.d/3proxy
cp ./cfg/3proxy.cfg.sample /usr/local/etc/3proxy/3proxy.cfg
ln -s /usr/local/etc/3proxy/3proxy.cfg /etc/3proxy.cfg
chmod +x /etc/init.d/3proxy

Шаг 4. Настройка 3proxy

Выполняем настройку нашего прокси-сервера к конфигурационном файле nano /etc/3proxy.cfg

#!/usr/local/etc/3proxy/bin
daemon
pidfile /usr/local/etc/3proxy/3proxy.pid
nserver 8.8.8.8
nserver 8.8.4.4
nscache 65536
timeouts 1 5 30 60 180 1800 15 60
users roman:CL:roman
users "test:CR:$1$kf3$4c2AOGcRWsc74kMNZyRzi0"
#include /usr/local/etc/3proxy/users.conf <<-- Можем подключить файл с логинами/паролям.
log /dev/null
auth strong
auth strong
flush
allow test,roman
maxconn 64
socks -p51105 -n -a -u2
proxy -p12732 -n -a
dnspr
setgid 65534
setuid 65534

Список пользователей задается с помощью команды users.

С помощью одной команды можно задать несколько пользователей, можно давать несколько команд users. USERDESC - описание пользователя.

Описание пользователя состоит из трех полей разделенных двоеточием - имени, типа пароля и пароля. Например:

users admin:CL:mysecret test:CL:yourpassword test1:CL:password1
users "test:CR:b771$b8745ed1295840eca15e55feb9e"
users test3:NT:BD7DFBF29A93F93C63CB84790DA00E63

Обратите внимание на двойные кавычки - они необходимы для второго пользователя, т.к. в его пароле встречается знак $, который для файла 3proxy.cfg означает включение другого файла.

Поддерживаются следующие типы паролей:

  • тип не указан - использовать системную авторизацию для данного пользователя (пока не реализовано).
  • CL - пароль в открытом тексте
  • CR - пароль в формате crypt() (только MD5)
  • NT - пароль в формате NT в шестнадцатеричной кодировке

NT и crypt пароли могут быть использованы для импорта учетных записей из Windows/Samba и Unix соответственно (для Windows можно использовать утилиты семейства pwdump). Учетные записи удобно хранить в отдельном файле (в таком случае можно хранить их построчно в формате, типичном для файлов паролей).

Создать пароль можем командой:

openssl passwd -1 -salt xyz yourpass

Сохраняем конфигурационный файл и заупускаем сервис:

service 3proxy start

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

chkconfig 3proxy on

Шаг 5. Настройка файрвола

# Открываем порт для socks-прокси:
firewall-cmd --permanent --zone=public --add-port=51105/tcp
# Открываем порт для http-прокси:
firewall-cmd --permanent --zone=public --add-port=12732/tcp
# Блокируем ICMP трафик для того, чтоб наш сервер не отвечал на пинги:
firewall-cmd --zone=public --add-icmp-block=echo-reply --permanent
firewall-cmd --zone=public --add-icmp-block=echo-request --permanent
firewall-cmd --reload

Шаг 6. Настройка Telegram на работу через socks

Также можно использовать socks-прокси на все подключение.

Проверяем:

Настройка завершена.

Troubleshooting

ERR_SOCKS_CONNECTION_FAILED в Google Chrome

Google Chrome не работает через SOCKS с авторизацией. Пока не нашел как исправить, но придумаю костыль какой-нибудь.

Too many authentication failures for username

Используйте параметр IdentitiesOnly=yes при подключении по SSH

$ ssh -o IdentitiesOnly=yes root@195.209.58.112 -p 54997
root@195.209.58.112's password:
[root@mytelegramproxy ~]#
Поделиться Комментарии