Гайд Lua - TG Proxy для скриптов.

манул бахус

Известный
Автор темы
223
210
TG Proxy: Полный гайд по обходу блокировок и фиксу уведомлений
Используем альтернативу, или поднимаем свой прокси-сервер на Node.js + Caddy и забываем про блокировку




1. В чем проблема?

В последнее время вы могли заметить, что api.telegram.org заблокирован со стороны РКН или работает крайне нестабильно. Из-за этого пользователи в РФ испытывают сложности с работой скриптов где используется Telegram API.




2. Быстрое решение: Использование tg.bakh.us

Если вы не хотите возиться с серверами, используйте наш публичный прокси-шлюз. Он бесплатный и стабильный.

Как подключить: Просто замените домен в ваших запросах. Пример:
Lua:
-- Было:
local url = "https://api.telegram.org/bot" .. token .. "/sendMessage"

-- Стало:
local url = "https://tg.bakh.us/bot" .. token .. "/sendMessage"




3. Свое решение: Поднимаем прокси с нуля

Для тех, кто хочет полной независимости, вот путь по созданию своей "крепости".

[A] Где брать железо?
  • Сервер (VDS): Лично я использую Timeweb - стабильно, адекватно по ценам, принимают карты РФ. (upd. Телегу в нем забанили, проксирую через waicore)
  • Домен: Я беру на Porkbun, ибо там самые дешевые домены на первый год использования. Важно: нужна иностранная карта (лично я использую свою турецкую), карты РФ там не работают.
  • Примечания: Если у вас нет возможности приобрести домен на Porkbun, берите в другом, например reg.ru. На Timeweb я использую РФ сервер, в котором на мое удивление еще работает TG API.(upd. уже нет :( )

Установка Node.js прокси
Заходим на сервер и ставим окружение:
Bash:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs screen
mkdir tg-proxy && cd tg-proxy
npm init -y && npm install express node-fetch

Создаем index.js:
JavaScript:
import express from "express";
import fetch from "node-fetch";

const app = express();

app.use(async (req, res) => {
  try {
    const url = "https://api.telegram.org" + req.url;
    const response = await fetch(url, { method: req.method });
    const data = await response.text();
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.send(data);
  } catch (err) {
    res.status(500).send("Proxy error");
  }
});

app.listen(3000, () => console.log("TG proxy running on port 3000"));

Запуск через screen (чтобы работал в фоне):
Bash:
screen -S tgproxy
node index.js
# Нажимаем CTRL+A, затем D, чтобы выйти из окна, оставив процесс в фоне

[В] Настройка домена и HTTPS (Caddy)
Telegram требует HTTPS. Чтобы не мучаться с сертификатами вручную, ставим Caddy — он сам сделает SSL.

Установка (Ubuntu):
Bash:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy

Конфиг (/etc/caddy/Caddyfile):
Код:
tg.yourdomain.com {
    reverse_proxy localhost:3000
}
После правки: sudo systemctl reload caddy.





4. Важное замечание по кодировке (Lua)

Чтобы не было кракозябр, используйте этот вариант urlencode. Он правильно переводит CP1251 в UTF-8 и экранирует символы для URL.

Lua:
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

function urlencode(str)
   if str then
      str = u8:encode(str, 'CP1251') -- Фикс кракозябр
      str = str:gsub("([^%w _%%%-%.~])", function(c) 
         return string.format("%%%02X", string.byte(c)) 
      end)
      str = str:gsub(" ", "%%20") -- Фикс плюсиков
   end
   return str
end



Автор - bakhusse
Связь - telegram/vk: @bakhusse
Пример работы -
AFKTools
 
Последнее редактирование:

Mamashin

Сломанный
1,147
641
Молодец Серёжа, хорошо стелишь, думаю стоит так же упомянуть в теме о том, что запуск скрина лучше сразу закидывать в автозапуск сервера
 

Ну погоди!

Известный
242
103
примерно с вчера, что selectel, reg.ru, timeweb/timeweb cloud начали также блокировать домены телеграмма. api.telegram.org тоже в блокировке
1774282062966.png


Рабочий способ сейчас - работа через вебсокет

Молодец Серёжа, хорошо стелишь, думаю стоит так же упомянуть в теме о том, что запуск скрина лучше сразу закидывать в автозапуск сервера
тогда уже, обернуть это в демона или накинуть pm2
 
Последнее редактирование:
  • Нравится
Реакции: Sargon

манул бахус

Известный
Автор темы
223
210
примерно с вчера, что selectel, reg.ru, timeweb/timeweb cloud начали также блокировать домены телеграмма. api.telegram.org тоже в блокировке
Посмотреть вложение 289376

Рабочий способ сейчас - работа через вебсокет


тогда уже, обернуть это в демона или накинуть pm2
по сей день у меня апи ТГ спокойно работает, рф сервер
 

Mamashin

Сломанный
1,147
641
А что мешает развернуть прокси-сервер на сервере и работать с api telegram посредством прокси? Таким образом неважно чей сервер и в какой он стране и что там блокирует его провайдер, помоему автор темы хотел донести именно тунель на сервере, чтобы работать с ним на клиенте, а сервер как-раз выступает утилитой для всего-этого, поправь если ошибаюсь в чем-то
 
  • Нравится
Реакции: манул бахус

Ну погоди!

Известный
242
103
А что мешает развернуть прокси-сервер на сервере и работать с api telegram посредством прокси? Таким образом неважно чей сервер и в какой он стране и что там блокирует его провайдер, помоему автор темы хотел донести именно тунель на сервере, чтобы работать с ним на клиенте, а сервер как-раз выступает утилитой для всего-этого, поправь если ошибаюсь в чем-то
У него этот "туннель" будет работать буквально неделю, может месяц, как великий на территории Российской Федерации РКН решит. На timeweb cloud имеется ТСПУ, как и у любых других официальных хостингов, где прямой доступ имеет РКН, ведь ТСПУ подключается у них.

Если на твой сервер придет "анонимная" жалоба на то, что у тебя будет работать то, что замедляется - тебе тариф просто снесут, ведь это запрещено (как VPN, так и прокси). Сами по себе прокси(условно, это будут HTTP(s) & SOCKS) имеют свои отпечатки и сигнатуры. SOCKS при работе отправляет сигнатуру версии (0x05), если есть авторизация (log/pass) то дополнительно появятся остальные. Если SOCKS без авторизации, то отправится следующее: 0x05 и 0x00, метод CONNECT - 0x01.

Если уже брать сервер за рубежом, то нужно будет признать, что во время белых списков, у тебя ничего не будет работать (также, допустим о том, что новость на белые списки WiFi является реальностью). Да, можно сделать другим способом, гнать траффик через vnext по подобной схеме: CLIENT -> RU_NODE -> VNEXT -> EU_NODE -> api.telegram.org

Но у тебя не будет гарантий, что такая связка долго проживет

Если уже пошла такая тема, то я бы арендовал VPS в условных Нидерландах, Польше, Германии, США, где пинг будет меньше. Туда ставится панель для прокси, по типу x-ui/3x-ui, marzban, remnwave
На них создается vless reality для маскировки, фейк SNI

На твоем устройстве поднимается прокси 127.0.0.1:1080, где он передаст уже на мой сервер в забугор. В итоге, провайдер не видит типичный VPN и прокси

Но проще всего будто, без покупки доп. серверов, использовать WS:
DCПодсетьWebSocket
DC1149.154.160.0/22wss://pluto.web.telegram.org/apiws
DC2149.154.164.0/22wss://aurora.web.telegram.org/apiws
DC3149.154.168.0/22wss://aurora.web.telegram.org/apiws
DC491.108.12.0/22wss://vesta.web.telegram.org/apiws
DC591.108.56.0/22wss://flora.web.telegram.org/apiws
 
Последнее редактирование:
  • Нравится
Реакции: Mamashin

Cheba_Velikiy

Новичок
17
6
Пацаны,так а не проще поднять VPS сервер за границей,настроить через 3x-ui VLESS + Reality,потом через V2RayN подключаться к серверу и спокойно скриптить ? Или поднять там пайтон скрипт(мини-сервер) (на сервере за границей) и потом стучаться на этот скрипт(мини-сервер) через ip адрес сервера,не ?
не,ну можно ещё заморочиться с xor шифрованием,на вход данных один ключ,на выход другой ключ,или прям реально заморочиться и сделать шифрование Вернама. или опять же xor + шифрование Вермана.
 
Последнее редактирование:

Ну погоди!

Известный
242
103
Пацаны,так а не проще поднять VPS сервер за границей,настроить через 3x-ui VLESS + Reality,потом через V2RayN подключаться к серверу и спокойно скриптить ? Или поднять там пайтон скрипт(мини-сервер) (на сервере за границей) и потом стучаться на этот скрипт(мини-сервер) через ip адрес сервера,не ?
не,ну можно ещё заморочиться с xor шифрованием,на вход данных один ключ,на выход другой ключ,или прям реально заморочиться и сделать шифрование Вернама. или опять же xor + шифрование Вермана.
тут подобее этого способа и сделано
 
  • Нравится
Реакции: Mamashin

Cheba_Velikiy

Новичок
17
6
Пацаны,так а не проще поднять VPS сервер за границей,настроить через 3x-ui VLESS + Reality,потом через V2RayN подключаться к серверу и спокойно скриптить ? Или поднять там пайтон скрипт(мини-сервер) (на сервере за границей) и потом стучаться на этот скрипт(мини-сервер) через ip адрес сервера,не ?
не,ну можно ещё заморочиться с xor шифрованием,на вход данных один ключ,на выход другой ключ,или прям реально заморочиться и сделать шифрование Вернама. или опять же xor + шифрование Вермана.


я не стал останавливаться только на теории и решил проверить всё на практике. для этого дела я сделал для Вас полный гайд того,если вы планируете юзать мой способ с мини-сервером на пайтоне(разумеется этот мини-сервер поднят на вашем арендованном vps сервер)
кто собирается повторить это и возникнут ошибки - пишите мне в личку!!! ГАЙД ПИСАЛСЯ В 4 УТРА 17 ЛЕТНИМ ПАЦАНОМ,МОГУТ БЫТЬ ОШИБКИ(НО ВРЯД ЛИ)
в луа есть зависимости(библиотеки),прошу учитывать их в самом начале скрипта(для пайтона мы ставим сразу их в настройках окружения)
(в ближайшее время оформлю как отдельную тему,уже круче,но не сейчас)
(гайд предназначен чисто для разработчиков скриптов с внедрением в них телеграмм,также разраб свои скриптов может вписать несколько ботов и токенов для других скриптов\людей)



1) сам сервер я брал на сервисе aeza,ибо там можно оплачивать картой из РФ с комиссией 2%
2) ставим ubuntu 24.04 версии
3) как поставили - открываем cmd на винде комбинацией WIN + R(или что там за ОС у Вас)
4) пишем: ssh root@ВАШ_IP_КОТОРЫЙ_ДАЛ_AEZA (если вылезет что то про 256 шифрование,везде пишите Y или y)
5) Вам вылезет password,вы копируете тот,что Вам выдал aeza и вставляете на ПКМ в консоль(пароль не видно,не пугайтесь,это Линукс :) )
6) далее у Вас вылезет что то на подобии root@НАЗВАНИЕ_КОТОРЫЕ_ВЫ_ВВЕЛИ_ИЛИ_РАНДОМ_САЙТА:~# (# означает,что вы супер пользователь,а ~ что вы в директории root находитесь)
на этом вход закончен можно приступать дальше к настройки окружения

(я не везде будут писать про сохранение и закрытие файла,учитывайте это)
на ПКМ вставляется содержимое из буфера обмена
CTRL + O сохраняет файл
CTRL + X закрывает файл

sudo systemctl restart cyeta_squad ПЕРЕЗАПУСК службы (после правок в .py)

sudo systemctl stop cyeta_squad ВЫКЛЮЧИТЬ службу на совсем

systemctl status cyeta_squad portsentry fail2ban (проверить все службы на работоспособность, CTRL + C выход)

sudo fail2ban-client status sshd данной командой можно проверить сколько ботов система забанила и сколько атак было совершено

route -n выводит все ip адреса,который забанила система защиты
тут мелькают оооооочень большое количество стран мира а проще говоря - ботнет сети,а это означает,что защита отрабатывает на ура
!H означает,что сервер пускает пакеты в чёрную дыру от айпишника на время бана

199.45.154.176 - 255.255.255.255 !H 0 - 0 -
199.45.154.177 - 255.255.255.255 !H 0 - 0 -
199.45.154.181 - 255.255.255.255 !H 0 - 0 -
199.45.154.183 - 255.255.255.255 !H 0 - 0 -
199.45.154.184 - 255.255.255.255 !H 0 - 0 -
199.45.154.186 - 255.255.255.255 !H 0 - 0 -
199.45.155.77 - 255.255.255.255 !H 0 - 0 -
199.45.155.99 - 255.255.255.255 !H 0 - 0 -
199.45.155.108 - 255.255.255.255 !H 0 - 0 -
200.2.154.250 - 255.255.255.255 !H 0 - 0 -
200.86.3.104 - 255.255.255.255 !H 0 - 0 -
200.113.202.226 - 255.255.255.255 !H 0 - 0 -
202.53.164.46 - 255.255.255.255 !H 0 - 0 -
202.163.107.36 - 255.255.255.255 !H 0 - 0 -
202.239.228.59 - 255.255.255.255 !H 0 - 0 -
203.55.131.3 - 255.255.255.255 !H 0 - 0 -
203.55.131.5 - 255.255.255.255 !H 0 - 0 -
203.163.241.205 - 255.255.255.255 !H 0 - 0 -
204.48.19.67 - 255.255.255.255 !H 0 - 0 -
205.210.31.41 - 255.255.255.255 !H 0 - 0 -
205.210.31.51 - 255.255.255.255 !H 0 - 0 -
205.210.31.66 - 255.255.255.255 !H 0 - 0 -
205.210.31.74 - 255.255.255.255 !H 0 - 0 -
205.210.31.78 - 255.255.255.255 !H 0 - 0 -
205.210.31.86 - 255.255.255.255 !H 0 - 0 -
205.210.31.102 - 255.255.255.255 !H 0 - 0 -
205.210.31.176 - 255.255.255.255 !H 0 - 0 -
205.210.31.182 - 255.255.255.255 !H 0 - 0 -
205.210.31.196 - 255.255.255.255 !H 0 - 0 -
205.210.31.202 - 255.255.255.255 !H 0 - 0 -
205.210.31.209 - 255.255.255.255 !H 0 - 0 -
205.210.31.210 - 255.255.255.255 !H 0 - 0 -
205.210.31.212 - 255.255.255.255 !H 0 - 0 -
205.210.31.238 - 255.255.255.255 !H 0 - 0 -
205.210.31.250 - 255.255.255.255 !H 0 - 0 -
206.189.164.254 - 255.255.255.255 !H 0 - 0 -
209.97.175.77 - 255.255.255.255 !H 0 - 0 -
210.212.28.141 - 255.255.255.255 !H 0 - 0 -
211.219.254.187 - 255.255.255.255 !H 0 - 0 -
212.34.253.242 - 255.255.255.255 !H 0 - 0 -
212.192.158.168 - 255.255.255.255 !H 0 - 0 -
212.192.158.169 - 255.255.255.255 !H 0 - 0 -
212.192.158.171 - 255.255.255.255 !H 0 - 0 -
212.220.211.154 - 255.255.255.255 !H 0 - 0 -
213.130.66.42 - 255.255.255.255 !H 0 - 0 -
216.218.206.68 - 255.255.255.255 !H 0 - 0 -
216.218.206.100 - 255.255.255.255 !H 0 - 0 -
216.218.206.112 - 255.255.255.255 !H 0 - 0 -
216.218.206.126 - 255.255.255.255 !H 0 - 0 -
220.197.78.55 - 255.255.255.255 !H 0 - 0 -
222.185.237.133 - 255.255.255.255 !H 0 - 0 -
222.229.54.54 - 255.255.255.255 !H 0 - 0 -
222.242.174.210 - 255.255.255.255 !H 0 - 0 -
223.74.132.172 - 255.255.255.255 !H 0 - 0 -
223.88.162.62 - 255.255.255.255 !H 0 - 0 -
223.240.94.168 - 255.255.255.255 !H 0 - 0 -


1) обновляем систему и ставим нужные пакеты
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv git screen net-tools fail2ban portsentry -y(у Вас вылезет окно с ОК,нажимаете enter)

2) создаем папку проекта и переходим в неё (вместо cyeta_squad_papka вводите название своей папки)
mkdir ~/cyeta_squad_papka && cd ~/cyeta_squad_papka

3) создаем и активируем виртуальное окружение
python3 -m venv venv
source venv/bin/activate

4) ставим нужны библиотеки для работы пайтон скрипта
pip install fastapi uvicorn httpx
5) запускаем порт и фаервол:
sudo ufw allow ssh ОБЯЗАТЕЛЬНО! чтобы вас не выкинуло из консоли навсегда
sudo ufw allow 59168/tcp открываем порт для нашего пайтона
sudo ufw enable включаем фаервол (нажать Y и Enter)
на этом настройка окружения закончена,идём дальше
1) создаём файл:
вписываем nano cyeta_squad_script.py (если планирует своё название файла,вписывайте nano НАЗВАНИЕ.py)
2) вставляем(ПКМ) в открывшееся окно сам код,сохраняем и закрываем("ТВОЙ_НЕ_ТВОЙ__ИД_АККА_ТГ": "ТОКЕН_БОТА" тут не забывайте прописать свои тг и ботов(тг узнаётся именно в @userinfobot таком тг боте,id состоит и цифр онли),если что можно хоть до бесконечности прописывать,НО,ВАЖНО,ЕСЛИ ВЫ ВПИШЕТЕ ID_TG1:ID_TG_BOT1 а потом ID_TG1:ID_TG_BOT2,то второй бот перезапишет первого!!!:

Python:
import httpx
import random
import json
import uvicorn
from itertools import cycle
from fastapi import FastAPI, Request
from fastapi.responses import PlainTextResponse

key_xor = "716254C976Y7545E876513T37A1382563"

client_bot = {
    "ТВОЙ_ID_ТГ": "ТВОЙ_БОТ_ТГ"
}

browser_agents = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/123.0"
]

class CryptoXorEngine:
    def __init__(self, key: str):
        self.key = key

    def encrypt(self, data: str) -> str:
        b_data = data.encode('utf-8')
        encrypted = bytes([b ^ ord(k) for b, k in zip(b_data, cycle(self.key))])
        return encrypted.hex().upper()
    
    def decrypt(self, hex_data: str) -> str:
        try:
            hex_data = hex_data.replace('"', '').replace("'", "").strip()
            binary_data = bytes.fromhex(hex_data)
            decrypted = bytes([b ^ ord(k) for b, k in zip(binary_data, cycle(self.key))])
            return decrypted.decode('utf-8', errors='ignore')
        except Exception:
            return ""

class SendToTG:
    def __init__(self):
        self.user_agents = browser_agents
    async def send_message(self, token: str, chat_id: str, text: str):
        url = f"https://api.telegram.org/bot{token}/sendMessage"
        headers = {"User-Agent": random.choice(self.user_agents)}
        payload = {"chat_id": chat_id, "text": text}
        async with httpx.AsyncClient() as client:
            return await client.post(url, json=payload, headers=headers)
        
class GateOtvetOTtg:
    def __init__(self):
        self.crypto = CryptoXorEngine(key=key_xor)
        self.tg = SendToTG()
        self.clients = client_bot

    async def process(self, raw_body: bytes):
        decrypto = self.crypto.decrypt(raw_body.decode())
        if not decrypto or "|" not in decrypto:
            return self.crypto.encrypt(json.dumps({"status": "error", "details": "Invalid payload"}))
        
        chat_id, message = decrypto.split("|", 1)
        bot_token = self.clients.get(chat_id)

        if not bot_token:
            return self.crypto.encrypt(json.dumps({"status": "error", "details": "unknown ID client or bot"}))
        try:
            resp = await self.tg.send_message(bot_token, chat_id, message)
            return self.crypto.encrypt(resp.text)
        except Exception as e:
            return self.crypto.encrypt(json.dumps({"status": "error", "details": str(e)}))

gate = GateOtvetOTtg()
app = FastAPI()
@app.post("/gate")

async def handle_gate(request: Request):
    body = await request.body()
    response_hex = await gate.process(body)
    return PlainTextResponse(content=response_hex)

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=59168)
1) вводим cd cyeta_squad_papka (или ваше название папки,которое вы ввели)
2) вводим nano cyeta_squad_script.py и открывается окно редактирования ( или ВАШЕ_НАЗВАНИЕ.py что вы ввели при создании файла) как отредактировали не забываем сохранить и закрыть
3) вводим sudo systemctl restart cyeta_squad для перезапуска нашей службы (если делали другое название,то вместо cyeta_squad вводите то самое название)
1.2) если же вы желаете именно тестировать\отлаживать скрипт,то нужно виртуально окружение активировать(в спойлере настройка окружения есть там такой пункт),перейти в папку(если не перешли до этого через cd) и потом запускать его через python3 cyeta_squad_script.py (или ВАШЕ_НАЗВАНИЕ.py)
РАСПРОСТРАНЯЕТСЯ НА ВАШ ПАЙТОН СКРИПТ И СИСТЕМУ, БУДЬТЕ АККУРАТНЫ!!!
pale-amaranth это название моего сервера
Mar 28 22:46:49 pale-amaranth.ptr.network portsentry[902]: attackalert: Host 104.248.126.175 has been blocked via dropped route using command: "/sbin/route add -host 104.248.126.175 reject"
Mar 28 22:47:32 pale-amaranth.ptr.network portsentry[902]: attackalert: TCP SYN/Normal scan from host: 124.253.214.153/124.253.214.153 to TCP port: 23
Mar 28 22:47:32 pale-amaranth.ptr.network portsentry[902]: attackalert: Host 124.253.214.153 has been blocked via wrappers with string: "ALL: 124.253.214.153 : DENY"
Mar 28 22:47:32 pale-amaranth.ptr.network portsentry[902]: attackalert: Host 124.253.214.153 has been blocked via dropped route using command: "/sbin/route add -host 124.253.214.153 reject"
Mar 28 22:52:27 pale-amaranth.ptr.network portsentry[902]: attackalert: TCP SYN/Normal scan from host: 193.3.53.7/193.3.53.7 to TCP port: 102
Mar 28 22:52:27 pale-amaranth.ptr.network portsentry[902]: attackalert: Host 193.3.53.7 has been blocked via wrappers with string: "ALL: 193.3.53.7 : DENY"
Mar 28 22:52:27 pale-amaranth.ptr.network portsentry[902]: attackalert: Host 193.3.53.7 has been blocked via dropped route using command: "/sbin/route add -host 193.3.53.7 reject"
Mar 28 22:53:40 pale-amaranth.ptr.network portsentry[902]: attackalert: TCP SYN/Normal scan from host: 35.203.210.179/35.203.210.179 to TCP port: 80
Mar 28 22:53:40 pale-amaranth.ptr.network portsentry[902]: attackalert: Host 35.203.210.179 has been blocked via wrappers with string: "ALL: 35.203.210.179 : DENY"
Mar 28 22:53:40 pale-amaranth.ptr.network portsentry[902]: attackalert: Host 35.203.210.179 has been blocked via dropped route using command: "/sbin/route add -host 35.203.210.179 reject"
Status for the jail: sshd
|- Filter
| |- Currently failed: 4
| |- Total failed: 3488
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 6
|- Total banned: 619
`- Banned IP list: 2.57.121.17 45.148.10.157 2.57.122.191 2.57.122.193 45.148.10.151 2.57.122.199
разбираем:
1) Total failed: 3488 это количество атак-запросов за всё время
2) Total banned: 619 это сколько ip адресов было забанено за всё время
3) Banned IP list: 2.57.121.17 45.148.10.157 2.57.122.191 2.57.122.193 45.148.10.151 2.57.122.199 это те,кто сейчас в бане отдыхает
ВАЖНО,КОГДА ЗАКОНЧИТЕ ВСЮ НАСТРОЙКУ,ВВЕДИТЕ ЭТУ КОМАНДУ,ОНА ПЕРЕЗАПУСТИТ СЕРВИСЫ С КОРРЕКТНЫМИ НАСТРОЙКАМИ:
sudo systemctl restart fail2ban && sudo systemctl restart portsentry
1) в командную строку вписываем:
sudo nano /etc/systemd/system/cyeta_squad.service (вместо cyeta_squad вписывайте своё название)
2) в открывшемся окно вставляем этот код,сохраняем и закрываем(ВАЖНО,ВМЕСТО cyeta_squad_papka не забудьте ввести имя той папки,что ввели при создании и имя скрипта(имя скрипта вводится перед app):
INI:
[Unit]
Description=Cyeta Squad Gateway Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/cyeta_squad_papka
ExecStart=/root/cyeta_squad_papka/venv/bin/python3 -m uvicorn cyeta_squad_script:app --host 0.0.0.0 --port 59168 --log-level warning
StandardOutput=append:/var/log/uvicorn.log
StandardError=append:/var/log/uvicorn.log
Restart=always

[Install]
WantedBy=multi-user.target
3) запускаем нашу службу:
sudo touch /var/log/uvicorn.log && sudo chmod 666 /var/log/uvicorn.log
а потом:
sudo systemctl enable cyeta_squad --now

1) вводим nano /etc/default/portsentry и ставим TCP_MODE="atcp" и UDP_MODE="audp" сохраняем и закрываем
2) вводим nano /etc/portsentry/portsentry.conf в открывшемся окне ищем BLOCK_TCP="0" и BLOCK_UDP="0",ставим их в "1"
3) ищем строчку
# iptables support for Linux
# KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"
и раскомментируем KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP" (убираем #) сохраняем и закрываем
4) дабы избежать бана нашего ip,вводим nano /etc/portsentry/portsentry.ignore.static и в самый конец вписываем наш ip адрес(можно узнать на 2ip,но если у Вас динамический ip,кнш мб проблема это будет,но если вы не будете спамить на закрытый порт - вас не забанит система),сохраняем и закрываем

1) вводим nano /etc/fail2ban/filter.d/fastapi.conf ,в открывшемся окне вставляем failregex = ^<HOST>.*" (400|404|405) .* сохраняем и закрываем
2) вводим nano /etc/fail2ban/jail.local и в открывшемся окне вставляем,сохраняем и закрываем:
INI:
[fastapi-app]
enabled = true
port = 59168
filter = fastapi
logpath = /var/log/uvicorn.log
maxretry = 3
bantime = 86400
1) просмотр логов атак: sudo tail -f /var/log/fail2ban.log (CTRL + C выход)
2) просмотр что пишет пайтон скрипт прямо сейчас(там будет только warning и всё,так что смысла нету,если не сменить на info тут: ExecStart=/root/cyeta_squad_papka/venv/bin/python3 -m uvicorn cyeta_squad_script:app --host 0.0.0.0 --port 59168 --log-level warning): sudo tail -f /var/log/uvicorn.log (CTRL + C выход)
3) разбан себя: sudo fail2ban-client set fastapi-app unbanip ТВОЙ_IP (надо с другого ip заходить на сервер!!! учитывайте это!!!)
ВАЖНО,НЕ ЗАБЫВАЕМ ВПИСАТЬ В ПЕРЕМЕННЫЕ НУЖНЫЕ ЗНЧЕНИЯ
local MY_ID_TG = "ТВОЙ_ИД_ТГ"
local SERVER_IP = "АЙПИ_ТВОЕГО_СЕРВЕРА" (если что SERVER_IP это арендованный Ваш сервер)
в скрипте я реализовал команды /mhp и /people для примера работы скриптов

Lua:
script_authors("Cheba","Cyeta Squad")
local vkeys = require 'vkeys'
local bit = require 'bit'
local encoding = require 'encoding'
local effil = require 'effil'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local L_PATH = package.path
local L_CPATH = package.cpath
local MY_ID_TG = "ТВОЙ_ТГ"
local SERVER_IP = "ТВОЙ_ИП_СЕРВЕРА_АРЕНДЫ"
local SERVER_PORT = "59168"
local URL = "http://" .. SERVER_IP .. ":" .. SERVER_PORT .. "/gate"
local KEY_XOR = "716254C976Y7545E876513T37A1382563"
-- шифратор
local function xor_encrypt(str, key)
    local res = {}
    for i = 1, #str do
        local key_idx = (i - 1) % #key + 1
        local key_char = key:sub(key_idx, key_idx)
        local b = bit.bxor(string.byte(str, i), string.byte(key_char))
        table.insert(res, string.format("%02X", b))
    end
    return table.concat(res)
end
-- дешифратор
function xor_decrypt(hex, key)
    if not hex or #hex < 2 then return "" end
    hex = hex:gsub('[^%x]', '')
    local res = {}
    local counter = 1
    for i = 1, #hex, 2 do
        local pair = hex:sub(i, i+1)
        local byte = tonumber(pair, 16)
        if byte then
            local key_idx = (counter - 1) % #key + 1
            local key_char = key:sub(key_idx, key_idx)
            table.insert(res, string.char(bit.bxor(byte, string.byte(key_char))))
            counter = counter + 1
        end
    end
    local result_str = table.concat(res)
    local ok, final = pcall(function() return u8:decode(result_str) end)
    return ok and final or result_str
end
-- многопоточность для запросов (лучше не трогать)
local async_fire = effil.thread(function(url, payload, p, cp)
    package.path = p
    package.cpath = cp .. ";moonloader/lib/socket/?.dll"
 
    local body = {}
    local ok, code, headers, status = pcall(function()
        local http = require 'socket.http'
        local ltn12 = require 'ltn12'
        http.TIMEOUT = 7
   
        local _, c, h, s = http.request({
            url = url,
            method = "POST",
            headers = {
                ["Content-Type"] = "text/plain",
                ["Content-Length"] = tostring(#payload),
                ["Connection"] = "close"
            },
            source = ltn12.source.string(payload),
            sink = ltn12.sink.table(body)
        })
        return c
    end)
    return code, table.concat(body)
end)
function main()
    while not isSampAvailable() do wait(100) end
 
    sampRegisterChatCommand("mhp", function()
        local hp = getCharHealth(PLAYER_PED)
        local text = u8(string.format("моё ХП сейчас: %d", hp))
        send_text_to_tg_and_get(text)
    end)
    sampRegisterChatCommand("people", function()
        local players = {}
        for i = 0, 1000 do
            if sampIsPlayerConnected(i) then
                local result, ped = sampGetCharHandleBySampPlayerId(i)
                if result and doesCharExist(ped) then
                    table.insert(players, sampGetPlayerNickname(i) .. "[" .. i .. "]")
                end
            end
        end
        local text = #players > 0 and u8("в зоне стрима: " .. table.concat(players, ", ")) or u8("в зоне стрима никого нет.")
        send_text_to_tg_and_get(text)
    end)
    sampAddChatMessage("{00FF00}[Cyeta_SQUAD]{FFFFFF} скрипт готов к работе. /mhp и /people", -1)
    wait(-1)
end
-- функция отправки и обработки ответа
function send_text_to_tg_and_get(text)
    local payload = xor_encrypt(MY_ID_TG .. "|" .. text, KEY_XOR)
    local run = async_fire(URL, payload, L_PATH, L_CPATH)
 
    lua_thread.create(function()
        while run:status() == "running" do wait(0) end
        local status, code, body = pcall(function() return run:get() end)
   
        if status and code == 200 then
            local decoded = xor_decrypt(body, KEY_XOR)
            sampAddChatMessage("{FFFFFF} сервер ответил: " .. decoded:sub(1,30), -1) -- обрезано до 30 символов в чат,в консоль полный вывод
            print(decoded)
        else
            local error_msg = tostring(code or "timeout/error")
            sampAddChatMessage("{FFFFFF} ошибка связи! Код: " .. error_msg, -1)
            print("[Error] ответ сервера: " .. tostring(body))
        end
    end)
end
 
Последнее редактирование: