commit 479ea2b71d07ba9b5c6471edd4bba2a87898872b Author: AlexChard Date: Sat Aug 29 13:00:35 2026 +0400 Initial BERLOGA Kaskad release diff --git a/README.md b/README.md new file mode 100644 index 0000000..8fbdcc2 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# BERLOGA Kaskad + +Очищенная версия установщика Kaskad для настройки каскадной переадресации TCP/UDP-трафика через VPS. + +![Заставка BERLOGA в терминале](assets/berloga-terminal.svg) + +## Что изменено + +- удалены рекламные ссылки, промокоды и рекламный QR-код; +- удалён искусственный отсчёт; +- добавлена фирменная заставка `BERLOGA`; +- основные возможности управления правилами сохранены. + +## Установка + +```bash +wget -O install.sh https://git.chardb.ru/AlexChard/kaskad-custom/raw/branch/main/install.sh && chmod +x install.sh && sudo ./install.sh +``` + +Повторный запуск после установки: + +```bash +sudo gokaskad +``` + +## Возможности + +- AmneziaWG/WireGuard по UDP; +- VLESS/XRay по TCP; +- MTProto/TProxy по TCP; +- пользовательские правила с разными входящим и исходящим портами; +- просмотр и удаление активных правил iptables. + +## Требования и безопасность + +- Debian/Ubuntu VPS; +- права `root` или `sudo`; +- открытые нужные порты в firewall и панели хостинга. + +Скрипт включает IP forwarding, BBR и меняет правила iptables. Перед запуском рекомендуется просмотреть его содержимое. + +Исходный проект: diff --git a/assets/berloga-terminal.svg b/assets/berloga-terminal.svg new file mode 100644 index 0000000..a09cb7e --- /dev/null +++ b/assets/berloga-terminal.svg @@ -0,0 +1,19 @@ + + Заставка BERLOGA в терминале + Тёмное окно терминала с зелёной блочной надписью BERLOGA. + + + + + + root@berloga:~# ./install.sh + + ██████╗ ███████╗██████╗ ██╗ ██████╗ ██████╗ █████╗ + ██╔══██╗██╔════╝██╔══██╗██║ ██╔═══██╗██╔════╝ ██╔══██╗ + ██████╔╝█████╗ ██████╔╝██║ ██║ ██║██║ ███╗███████║ + ██╔══██╗██╔══╝ ██╔══██╗██║ ██║ ██║██║ ██║██╔══██║ + ██████╔╝███████╗██║ ██║███████╗╚██████╔╝╚██████╔╝██║ ██║ + ╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ + + VPS INSTALLERS + diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..d13626e --- /dev/null +++ b/install.sh @@ -0,0 +1,319 @@ +#!/bin/bash + +# --- ЦВЕТА --- +RED='\033[0;31m' +GREEN='\033[0;32m' +CYAN='\033[0;36m' +YELLOW='\033[1;33m' +MAGENTA='\033[0;35m' +WHITE='\033[1;37m' +NC='\033[0m' + +check_root() { + if [ "$EUID" -ne 0 ]; then + echo -e "${RED}[ERROR] Запустите скрипт с правами root!${NC}" + exit 1 + fi +} + +# --- ПОДГОТОВКА СИСТЕМЫ --- +prepare_system() { + # Автоматическое создание глобальной команды gokaskad + if [ "$0" != "/usr/local/bin/gokaskad" ]; then + cp -f "$0" "/usr/local/bin/gokaskad" + chmod +x "/usr/local/bin/gokaskad" + fi + + # Включение IP Forwarding + if ! grep -q "net.ipv4.ip_forward=1" /etc/sysctl.conf; then + echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf + else + sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf + fi + + # Активация Google BBR + if ! grep -q "net.core.default_qdisc=fq" /etc/sysctl.conf; then + echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf + fi + if ! grep -q "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf; then + echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf + fi + sysctl -p > /dev/null + + # Установка зависимостей + export DEBIAN_FRONTEND=noninteractive + if ! dpkg -s iptables-persistent >/dev/null 2>&1; then + apt-get update -y > /dev/null + apt-get install -y iptables-persistent netfilter-persistent > /dev/null + fi +} + +# --- ЗАСТАВКА --- +show_berloga() { + clear + echo -e "${GREEN}" + cat <<'BERLOGA' +██████╗ ███████╗██████╗ ██╗ ██████╗ ██████╗ █████╗ +██╔══██╗██╔════╝██╔══██╗██║ ██╔═══██╗██╔════╝ ██╔══██╗ +██████╔╝█████╗ ██████╔╝██║ ██║ ██║██║ ███╗███████║ +██╔══██╗██╔══╝ ██╔══██╗██║ ██║ ██║██║ ██║██╔══██║ +██████╔╝███████╗██║ ██║███████╗╚██████╔╝╚██████╔╝██║ ██║ +╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ + + VPS INSTALLERS +BERLOGA + echo -e "${NC}" + read -p "Нажмите Enter для настройки каскадного скрипта..." +} + +# --- ИНСТРУКЦИЯ (ТЕКСТ ВНУТРИ КОДА) --- +show_instructions() { + clear + echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${MAGENTA}║ 📚 ИНСТРУКЦИЯ: КАК НАСТРОИТЬ КАСКАД ║${NC}" + echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" + echo -e "${CYAN}ШАГ 1: Подготовка${NC}" + echo -e "У вас должны быть данные от зарубежного сервера (VPN/Прокси и т.д.):" + echo -e " - ${YELLOW}IP адрес${NC} (зарубежный)" + echo -e " - ${YELLOW}Порт${NC} (на котором работает целевой сервис)" + echo "" + echo -e "${CYAN}ШАГ 2: Настройка этого сервера${NC}" + echo -e "1. Выберите нужный пункт (${GREEN}1-3${NC} для стандартных или ${GREEN}4${NC} для кастомных)." + echo -e "2. Введите ${YELLOW}IP${NC} и ${YELLOW}Порты${NC} (входящий и исходящий)." + echo -e "3. Скрипт создаст 'мост' через этот VPS." + echo "" + echo -e "${CYAN}ШАГ 3: Настройка Клиента (Важно!)${NC}" + echo -e "1. Откройте приложение клиента." + echo -e "2. В настройках соединения найдите поле ${YELLOW}Endpoint / Адрес сервера${NC}." + echo -e "3. Замените зарубежный IP на ${GREEN}IP ЭТОГО СЕРВЕРА${NC}." + echo -e "4. Если вы использовали разные порты в правиле №4, укажите Входящий порт." + echo "" + echo -e "${GREEN}Готово! Теперь трафик идет: Клиент -> Этот Сервер -> Зарубеж.${NC}" + echo "" + read -p "Нажмите Enter, чтобы вернуться в меню..." +} + +# --- СТАНДАРТНАЯ НАСТРОЙКА (ПОРТ ВХОДА = ПОРТ ВЫХОДА) --- +configure_rule() { + local PROTO=$1 + local NAME=$2 + + echo -e "\n${CYAN}--- Настройка $NAME ($PROTO) ---${NC}" + + while true; do + echo -e "Введите IP адрес назначения:" + read -p "> " TARGET_IP + if [[ -n "$TARGET_IP" ]]; then break; fi + done + + while true; do + echo -e "Введите Порт (одинаковый для входа и выхода):" + read -p "> " PORT + if [[ "$PORT" =~ ^[0-9]+$ ]] && [ "$PORT" -le 65535 ]; then break; fi + echo -e "${RED}Ошибка: порт должен быть числом!${NC}" + done + + apply_iptables_rules "$PROTO" "$PORT" "$PORT" "$TARGET_IP" "$NAME" +} + +# --- КАСТОМНАЯ НАСТРОЙКА (РАЗНЫЕ ПОРТЫ) --- +configure_custom_rule() { + echo -e "\n${CYAN}--- 🛠 Универсальное кастомное правило ---${NC}" + echo -e "${WHITE}Подходит для перенаправления ЛЮБЫХ протоколов (SSH, RDP, нестандартные порты)." + echo -e "Позволяет сделать так, чтобы клиент подключался к одному порту," + echo -e "а трафик уходил на другой порт зарубежного сервера.${NC}\n" + + while true; do + echo -e "Выберите протокол (${YELLOW}tcp${NC} или ${YELLOW}udp${NC}):" + read -p "> " PROTO + if [[ "$PROTO" == "tcp" || "$PROTO" == "udp" ]]; then break; fi + echo -e "${RED}Ошибка: введите tcp или udp!${NC}" + done + + while true; do + echo -e "Введите IP адрес назначения (куда отправляем трафик):" + read -p "> " TARGET_IP + if [[ -n "$TARGET_IP" ]]; then break; fi + done + + while true; do + echo -e "Введите ${YELLOW}ВХОДЯЩИЙ Порт${NC} (на этом сервере):" + read -p "> " IN_PORT + if [[ "$IN_PORT" =~ ^[0-9]+$ ]] && [ "$IN_PORT" -le 65535 ]; then break; fi + echo -e "${RED}Ошибка: порт должен быть числом!${NC}" + done + + while true; do + echo -e "Введите ${YELLOW}ИСХОДЯЩИЙ Порт${NC} (на конечном сервере):" + read -p "> " OUT_PORT + if [[ "$OUT_PORT" =~ ^[0-9]+$ ]] && [ "$OUT_PORT" -le 65535 ]; then break; fi + echo -e "${RED}Ошибка: порт должен быть числом!${NC}" + done + + apply_iptables_rules "$PROTO" "$IN_PORT" "$OUT_PORT" "$TARGET_IP" "Custom Rule" +} + +# --- ПРИМЕНЕНИЕ ПРАВИЛ IPTABLES --- +apply_iptables_rules() { + local PROTO=$1 + local IN_PORT=$2 + local OUT_PORT=$3 + local TARGET_IP=$4 + local NAME=$5 + + IFACE=$(ip route get 8.8.8.8 | awk -- '{printf $5}') + if [[ -z "$IFACE" ]]; then + echo -e "${RED}[ERROR] Не удалось определить интерфейс!${NC}" + exit 1 + fi + + echo -e "${YELLOW}[*] Применение правил...${NC}" + + # Удаление старых правил (по входящему порту) + iptables -t nat -D PREROUTING -p "$PROTO" --dport "$IN_PORT" -j DNAT --to-destination "$TARGET_IP:$OUT_PORT" 2>/dev/null + iptables -D INPUT -p "$PROTO" --dport "$IN_PORT" -j ACCEPT 2>/dev/null + iptables -D FORWARD -p "$PROTO" -d "$TARGET_IP" --dport "$OUT_PORT" -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 2>/dev/null + iptables -D FORWARD -p "$PROTO" -s "$TARGET_IP" --sport "$OUT_PORT" -m state --state ESTABLISHED,RELATED -j ACCEPT 2>/dev/null + + # Новые правила + iptables -A INPUT -p "$PROTO" --dport "$IN_PORT" -j ACCEPT + iptables -t nat -A PREROUTING -p "$PROTO" --dport "$IN_PORT" -j DNAT --to-destination "$TARGET_IP:$OUT_PORT" + + if ! iptables -t nat -C POSTROUTING -o "$IFACE" -j MASQUERADE 2>/dev/null; then + iptables -t nat -A POSTROUTING -o "$IFACE" -j MASQUERADE + fi + + iptables -A FORWARD -p "$PROTO" -d "$TARGET_IP" --dport "$OUT_PORT" -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT + iptables -A FORWARD -p "$PROTO" -s "$TARGET_IP" --sport "$OUT_PORT" -m state --state ESTABLISHED,RELATED -j ACCEPT + + # Настройка UFW если активен + if command -v ufw &> /dev/null && ufw status | grep -q "Status: active"; then + ufw allow "$IN_PORT"/"$PROTO" >/dev/null + sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw + ufw reload >/dev/null + fi + + netfilter-persistent save > /dev/null + + echo -e "${GREEN}[SUCCESS] $NAME настроен!${NC}" + echo -e "$PROTO: Вход $IN_PORT -> Выход $TARGET_IP:$OUT_PORT" + read -p "Нажмите Enter для возврата в меню..." +} + +# --- СПИСОК ПРАВИЛ --- +list_active_rules() { + echo -e "\n${CYAN}--- Активные переадресации ---${NC}" + echo -e "${MAGENTA}ПОРТ (ВХОД)\tПРОТОКОЛ\tЦЕЛЬ (IP:ВЫХОД)${NC}" + iptables -t nat -S PREROUTING | grep "DNAT" | while read -r line ; do + l_port=$(echo "$line" | grep -oP '(?<=--dport )\d+') + l_proto=$(echo "$line" | grep -oP '(?<=-p )\w+') + l_dest=$(echo "$line" | grep -oP '(?<=--to-destination )[\d\.:]+') + if [[ -n "$l_port" ]]; then echo -e "$l_port\t\t$l_proto\t\t$l_dest"; fi + done + echo "" + + read -p "Нажмите Enter..." +} + +# --- УДАЛЕНИЕ ОДНОГО ПРАВИЛА --- +delete_single_rule() { + echo -e "\n${CYAN}--- Удаление правила ---${NC}" + declare -a RULES_LIST + local i=1 + while read -r line; do + l_port=$(echo "$line" | grep -oP '(?<=--dport )\d+') + l_proto=$(echo "$line" | grep -oP '(?<=-p )\w+') + l_dest=$(echo "$line" | grep -oP '(?<=--to-destination )[\d\.:]+') + if [[ -n "$l_port" ]]; then + RULES_LIST[$i]="$l_port:$l_proto:$l_dest" + echo -e "${YELLOW}[$i]${NC} Вход: $l_port ($l_proto) -> Выход: $l_dest" + ((i++)) + fi + done < <(iptables -t nat -S PREROUTING | grep "DNAT") + + if [ ${#RULES_LIST[@]} -eq 0 ]; then + echo -e "${RED}Нет активных правил.${NC}" + read -p "Нажмите Enter..." + return + fi + + echo "" + read -p "Номер правила для удаления (0 отмена): " rule_num + if [[ "$rule_num" == "0" || -z "${RULES_LIST[$rule_num]}" ]]; then return; fi + + # Разбираем строку + IFS=':' read -r d_port d_proto d_dest <<< "${RULES_LIST[$rule_num]}" + local target_ip="${d_dest%:*}" + local target_port="${d_dest#*:}" + + iptables -t nat -D PREROUTING -p "$d_proto" --dport "$d_port" -j DNAT --to-destination "$d_dest" 2>/dev/null + iptables -D INPUT -p "$d_proto" --dport "$d_port" -j ACCEPT 2>/dev/null + iptables -D FORWARD -p "$d_proto" -d "$target_ip" --dport "$target_port" -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 2>/dev/null + iptables -D FORWARD -p "$d_proto" -s "$target_ip" --sport "$target_port" -m state --state ESTABLISHED,RELATED -j ACCEPT 2>/dev/null + + netfilter-persistent save > /dev/null + echo -e "${GREEN}[OK] Правило удалено.${NC}" + read -p "Нажмите Enter..." +} + +# --- ПОЛНАЯ ОЧИСТКА --- +flush_rules() { + echo -e "\n${RED}!!! ВНИМАНИЕ !!!${NC}" + echo "Сброс ВСЕХ настроек iptables." + read -p "Вы уверены? (y/n): " confirm + if [[ "$confirm" == "y" ]]; then + iptables -P INPUT ACCEPT + iptables -P FORWARD ACCEPT + iptables -P OUTPUT ACCEPT + iptables -t nat -F + iptables -t mangle -F + iptables -F + iptables -X + netfilter-persistent save > /dev/null + echo -e "${GREEN}[OK] Очищено.${NC}" + fi + read -p "Нажмите Enter..." +} + +# --- МЕНЮ --- +show_menu() { + while true; do + clear + echo -e "${MAGENTA}=== KASKAD — управление переадресацией ===${NC}" + echo -e "------------------------------------------------------" + + echo -e "1) Настроить ${CYAN}AmneziaWG / WireGuard${NC} (UDP)" + echo -e "2) Настроить ${CYAN}VLESS / XRay${NC} (TCP)" + echo -e "3) Настроить ${CYAN}TProxy / MTProto${NC} (TCP)" + echo -e "4) 🛠 Создать ${YELLOW}Кастомное правило${NC} (Разные порты, SSH, RDP...)" + echo -e "5) Посмотреть активные правила" + echo -e "6) ${RED}Удалить одно правило${NC}" + echo -e "7) ${RED}Сбросить ВСЕ настройки${NC}" + echo -e "8) ${YELLOW}Показать заставку BERLOGA${NC}" + echo -e "9) ${MAGENTA}📚 ИНСТРУКЦИЯ (Как настроить)${NC}" + echo -e "0) Выход" + echo -e "------------------------------------------------------" + read -p "Ваш выбор: " choice + + case $choice in + 1) configure_rule "udp" "AmneziaWG" ;; + 2) configure_rule "tcp" "VLESS" ;; + 3) configure_rule "tcp" "MTProto/TProxy" ;; + 4) configure_custom_rule ;; + 5) list_active_rules ;; + 6) delete_single_rule ;; + 7) flush_rules ;; + 8) show_berloga ;; + 9) show_instructions ;; + 0) exit 0 ;; + *) ;; + esac + done +} + +# --- ЗАПУСК --- +check_root +prepare_system +show_berloga +show_menu