Initial BERLOGA Kaskad release
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# BERLOGA Kaskad
|
||||
|
||||
Очищенная версия установщика Kaskad для настройки каскадной переадресации TCP/UDP-трафика через VPS.
|
||||
|
||||

|
||||
|
||||
## Что изменено
|
||||
|
||||
- удалены рекламные ссылки, промокоды и рекламный 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. Перед запуском рекомендуется просмотреть его содержимое.
|
||||
|
||||
Исходный проект: <https://github.com/anten-ka/kaskad>
|
||||
@@ -0,0 +1,19 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="500" viewBox="0 0 1280 500" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Заставка BERLOGA в терминале</title>
|
||||
<desc id="desc">Тёмное окно терминала с зелёной блочной надписью BERLOGA.</desc>
|
||||
<rect width="1280" height="500" rx="18" fill="#071521"/>
|
||||
<rect x="18" y="18" width="1244" height="464" rx="12" fill="#06111a" stroke="#17364a" stroke-width="2"/>
|
||||
<circle cx="49" cy="48" r="8" fill="#ff5f57"/>
|
||||
<circle cx="75" cy="48" r="8" fill="#febc2e"/>
|
||||
<circle cx="101" cy="48" r="8" fill="#28c840"/>
|
||||
<text x="138" y="55" fill="#7a93a6" font-family="Consolas, 'Courier New', monospace" font-size="19">root@berloga:~# ./install.sh</text>
|
||||
<g fill="#42e68b" font-family="Consolas, 'Courier New', monospace" font-size="22" font-weight="700" xml:space="preserve">
|
||||
<text x="55" y="145">██████╗ ███████╗██████╗ ██╗ ██████╗ ██████╗ █████╗</text>
|
||||
<text x="55" y="184">██╔══██╗██╔════╝██╔══██╗██║ ██╔═══██╗██╔════╝ ██╔══██╗</text>
|
||||
<text x="55" y="223">██████╔╝█████╗ ██████╔╝██║ ██║ ██║██║ ███╗███████║</text>
|
||||
<text x="55" y="262">██╔══██╗██╔══╝ ██╔══██╗██║ ██║ ██║██║ ██║██╔══██║</text>
|
||||
<text x="55" y="301">██████╔╝███████╗██║ ██║███████╗╚██████╔╝╚██████╔╝██║ ██║</text>
|
||||
<text x="55" y="340">╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝</text>
|
||||
</g>
|
||||
<text x="480" y="410" fill="#7aa8c7" font-family="Consolas, 'Courier New', monospace" font-size="25" letter-spacing="5">VPS INSTALLERS</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
+319
@@ -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
|
||||
Reference in New Issue
Block a user