Настройка прокси mtproto для Telegram

Поради та підказки щодо софту, роботи в операційних системах, комплектуючих та зборок комп'ютерів.
Аватар користувача
toxi
Администратор
Администратор
Статті: 0
Повідомлень: 532
З нами з: 12-04-2008 07:58:25
Ваша стать: Чоловічий
І'мя: Roman
Контактна інформація:

Настройка прокси mtproto для Telegram

Повідомлення toxi »

Нам понадобятся средства для сборки mtproxy из исходников, команда для debian

Код: Виділити все

apt-get install git build-essential libssl-dev zlib1g-dev curl
Если у вас ubuntu 16.04 или в системе OpenSSL версии ниже 1.1.0h, то нужно его установить, или собрать ручками.
Проверить текущую версию openssl можно командой openssl version
Для сборки openssl1.1.0h выполним следующие команды

Код: Виділити все

wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz
tar -zxf openssl-1.1.0h.tar.gz
cd openssl-1.1.0h
./config
make
make install
ldconfing /usr/local/lib
echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf
Теперь собираем mtproxy
Вытащим к себе исходники

Код: Виділити все

git clone https://github.com/TelegramMessenger/MTProxy
cd MTProxy
make
Если все прошло без ошибок, то в каталоге MTProxy/objs/bin/ должен быть бинарник mtproto-proxy, копируем его в /usr/local/bin

Код: Виділити все

cp objs/bin/mtproto-proxy /usr/local/bin
Теперь создадим пользователя, каталог для конфигов и логов (логи почему то у меня не писались, может баг)

Код: Виділити все

adduser --system --no-create-home --disabled-login --group mtproxy
mkdir /etc/mtproxy
mkdir /var/log/mtproxy
chown mtproxy:mtproxy /var/log/mtproxy/
Получим необходимые файлы для функционирования mtproxy

Код: Виділити все

cd /etc/mtproxy
Используйте одну из утилит для получения файлов:
curl

Код: Виділити все

curl -s https://core.telegram.org/getProxySecret -o proxy-secret
curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf
либо
wget

Код: Виділити все

wget https://core.telegram.org/getProxySecret -O proxy-secret
wget https://core.telegram.org/getProxyConfig -O proxy-multi.conf
Сгенерируем 16-ричный secret-key

Код: Виділити все

head -c 16 /dev/urandom | xxd -ps
Создадим сервис systemd
nano /etc/systemd/system/mtproxy.service

Код: Виділити все

[Unit]
Description=mtproto-proxy
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mtproto-proxy -u mtproxy -p 8888 -6 -H 443 -l /var/log/mtproxy/mtproxy.log -S <secret-key> --aes-pwd /etc/mtproxy/proxy-secret /etc/mtproxy/proxy-multi.conf -M 1
Restart=on-failure

[Install]
WantedBy=multi-user.target
Расшифровка параметров:
-u mtproxy — процесс запускается от пользователя mtproxy
-p 8888 — локальный порт, можно использовать для получения статистики
-6 — включает ipv6
-H 443 — на каком порту ожидать подключение клиентов, 443 подходит идеально, провайдеры и прочие будут думать что это обычный https траффик
-l /var/log/mtproxy/mtproxy.log — лог файл, но как я писал выше, логи почему то не пишутся, может нужно включить verbose или еще чего, разберусь потом
-S <secret-key> — секретный ключ который мы сгенерировали(надеюсь вы поняли что <secret-key>, нужно заменить на сгенерированную строку, например на 575b04f4b28f72263965d1d371707c06)
--aes-pwd /etc/mtproxy/proxy-secret — конфиг с секретом, что там в нем, черт его знает
/etc/mtproxy/proxy-multi.conf — конфиг файл с ip адресами серверов
-M 1 — количество главных процессов, пишут что хватает одного, если у вас там не супер-пупер нагруженный сервер.

UPD: 12.09.2019
В официальном mtproxy запилили fake-tls, все описано здесь
Что бы этим воспользоваться нужно добавить в команду запуск -D и указать домен, пример такой

Код: Виділити все

ExecStart=/usr/local/bin/mtproto-proxy -u mtproxy -p 8888 -6 -H 443 -D www.facebook.com -S <secret-key> --aes-pwd /etc/mtproxy/proxy-secret /etc/mtproxy/proxy-multi.conf -M 1
Но помните у вас отлетит обычное подключение которое с ключом DD и без DD, <secret-key> тоже станет особенный, сгенерировать его можно вот на этом сайте http://seriyps.ru/mtpgen.html в Fake-TLS domain нужно указать тот же домен который вы указали в -D, в нашем случае www.facebook.com

Активируем сервис и пробуем его запустить

Код: Виділити все

systemctl enable mtproxy && systemctl start mtproxy
Посмотреть состояние можно командой

Код: Виділити все

systemctl status mtproxy
Если у вас нет systemd, используйте следующий init.d
/etc/init.d/mtproxy:

Код: Виділити все

#!/bin/sh
### BEGIN INIT INFO
# Provides: mtproto-proxy
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:
# Short-Description:    MTProxy service
### END INIT INFO

set -e

# Must be a valid filename
NAME=mtproto-proxy
PIDFILE=/var/run/$NAME.pid
#This is the command to be run, give the full pathname
DAEMON=/usr/local/bin/mtproto-proxy
DIR=/etc/mtproxy
DAEMON_OPTS="-u mtproxy -p 8888 -6 -H 443 -l /var/log/mtproxy/mtproxy.log -d -S <secret> -P <proxy-tag> --aes-pwd /etc/mtproxy/proxy-secret /etc/mtproxy/proxy-multi.conf -M 1"
USER=mtproxy

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"

case "$1" in
  start)
        echo -n "Starting daemon: "$NAME
        start-stop-daemon --start --background --pidfile $PIDFILE -d $DIR -m --exec $DAEMON -- $DAEMON_OPTS
        echo "."
        ;;
  stop)
        echo -n "Stopping daemon: "$NAME
        start-stop-daemon --stop --signal TERM --quiet --oknodo --pidfile $PIDFILE
        echo "."
        sleep 3
        ;;
  restart)
        echo -n "Restarting daemon: "$NAME
        start-stop-daemon --stop --signal TERM --quiet --oknodo --retry 30 --pidfile $PIDFILE
        start-stop-daemon --start --background --pidfile $PIDFILE -d $DIR -m --exec $DAEMON -- $DAEMON_OPTS
        echo "."
        ;;

  *)
        echo "Usage: "$1" {start|stop|restart}"
        exit 1
esac

exit 0
Даем права на запуск скрипта

Код: Виділити все

chmod +x /etc/init.d/mtproxy
Активируем автозапуск

Код: Виділити все

update-rc.d mtproxy defaults
Запускаем службу

Код: Виділити все

/etc/init.d/mtproxy start
Теперь настраивайте ваш телеграм клиент.
d415cdf6e7168bdd52044d66e04759664c11b867.jpg
d415cdf6e7168bdd52044d66e04759664c11b867.jpg (12.45 Кіб) Переглянуто 298 разів
UPD 24.02.2019
Что бы прокси было сложнее обнаружить, в клиенте есть возможность динамически изменять размер пакета, добавьте в начале ключа две буквы dd. Должно получится так dd575b04f4b28f72263965d1d371707c06
Если примут коммит то в самом прокси mtproto можно будет запретить подключение без dd флагом "-R".

Если у вас есть канал, то вы можете его продвинуть благодаря прокси, для этого нужно зарегистрировать ваш прокси у бота @MTProxybot, бот вам даст proxy-tag, его нужно будет добавить в запуск сервиса, ExecStart изменить на

Код: Виділити все

ExecStart=/usr/local/bin/mtproto-proxy -u mtproxy -p 8888 -6 -H 443 -l /var/log/mtproxy/mtproxy.log -S <secret-key> -P <proxy-tag> --aes-pwd /etc/mtproxy/proxy-secret /etc/mtproxy/proxy-multi.conf -M 1
-P <proxy-tag> — <proxy-tag> заменить на то, что вам дал бот

1. Пишем @MTProxybot /start
1.1 Он запросит адрес нашего прокси в формате host:port
1.2 Потом запросит secret, отправляем ему
1.3 Если все окей выведет сообщение об успехе Success и proxy tag его надо прописать в ExecStart сервиса -P <proxy-tag>, описывал выше.
ce3a24424a2be4a9bfa5f65528a44d1a0a3e037e.jpg
ce3a24424a2be4a9bfa5f65528a44d1a0a3e037e.jpg (21 Кіб) Переглянуто 298 разів
2. Добавим канал, пользователи которые будут пользоваться вашим прокси автоматически будут «подписаны» на Promoted канал.
2.1 Командой /myproxies запросим список наших прокси(их может быть несколько)
2.2 Выберем необходимый
7a2c4626f8cd9642dcdedb63e97b1dc27aebd5cc.jpg
7a2c4626f8cd9642dcdedb63e97b1dc27aebd5cc.jpg (11.11 Кіб) Переглянуто 298 разів
2.3 И нажмем кнопку Set promotion
2.4 Введем название канала в формате @имя_канала
2.5 Все, примерно через час данные promotion применяться и у пользователей использующих ваши прокси появится ваш канал.
abdc81775b5065b0256bdca4f19bea19fd4184ab.jpg
abdc81775b5065b0256bdca4f19bea19fd4184ab.jpg (21.58 Кіб) Переглянуто 298 разів
Безопасного общения друзья :-)

Написал тут один человек по поводу защиты от примитивных DDos атак, да еще и ссылку кинул, https://javapipe.com/ddos/blog/iptables ... rotection/, полистал и решил почему бы и не добавить в статью, в принципе такая защита должна быть на любом публичном сервере, кто его знает, вдруг поможет.
Свод правил из статьи:

Код: Виділити все

### 1: Drop invalid packets ### 
/sbin/iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP  

### 2: Drop TCP packets that are new and are not SYN ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP 
 
### 3: Drop SYN packets with suspicious MSS value ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP  

### 4: Block packets with bogus TCP flags ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP  

### 5: Block spoofed packets ### 
/sbin/iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP  

### 6: Drop ICMP (you usually don't need this protocol) ### 
#/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP  

### 7: Drop fragments in all chains ### 
/sbin/iptables -t mangle -A PREROUTING -f -j DROP  

### 8: Limit connections per source IP ### 
/sbin/iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset  

### 9: Limit RST packets ### 
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP  

### 10: Limit new TCP connections per second per source IP ### 
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP  

### 11: Use SYNPROXY on all ports (disables connection limiting rule) ### 
# Hidden - unlock content above in "Mitigating SYN Floods With SYNPROXY" section
Закоментировал только правило запрещающающее icmp, иногда все же нужно кого нибудь пингануть.

Источник: https://clsv.ru/telegram/nastrojka_prok ... elegram_68
Правила форуму :: Виконую послуги IT-адміністратора (види послуг).