root@5862577-oj93961:~# cat /usr/local/bin/check-vpn-limits #!/bin/bash echo "┌──────────────────────────────────────────────────┐" echo "│ AmneziaWG Traffic Control v1.2 │" echo "└──────────────────────────────────────────────────┘" echo "" # === Auto-detect container and interface === # Supported container names in order of preference POSSIBLE_CONTAINERS=("amnezia-awg" "amnezia-awg2") CONTAINER="" for name in "${POSSIBLE_CONTAINERS[@]}"; do if docker ps --format '{{.Names}}' 2>/dev/null | grep -xq "$name"; then CONTAINER="$name" break fi done # helper to run docker exec if container found docker_exec() { if [ -z "$CONTAINER" ]; then return 1 fi docker exec "$CONTAINER" "$@" } # detect interface name inside container (prefer wg*, tun*, amnezia*, veth*) IF="" if [ -n "$CONTAINER" ]; then IF=$(docker_exec sh -c "ip -o link show 2>/dev/null | awk -F': ' '{print \$2}'" 2>/dev/null | \ egrep -o '^(wg[0-9]+|wg|amnezia[0-9]*|tun[0-9]+|veth[0-9]+)' | head -n1 || true) # fallback: pick first iface that has an ipv4 address inside container if [ -z "$IF" ]; then IF=$(docker_exec sh -c "ip -o -4 addr show 2>/dev/null | awk '{print \$2}'" 2>/dev/null | head -n1 || true) fi fi # final fallback to wg0 for backwards-compatibility (if nothing found) IF=${IF:-wg0} # 1. Состояние системы echo "📊 СИСТЕМНЫЙ СТАТУС:" if systemctl is-active amnezia-tc.service >/dev/null 2>&1; then echo " Сервис: ✅ активен" else echo " Сервис: ❌ неактивен" fi if systemctl is-active amnezia-tc.timer >/dev/null 2>&1; then next_time=$(systemctl list-timers --all | grep amnezia 2>/dev/null | head -1 | awk '{print $2, $3, $4, $5}') if [ -n "$next_time" ]; then echo " Таймер: ✅ активен (след. запуск: $next_time)" else echo " Таймер: ✅ активен (расписание не найдено)" fi else echo " Таймер: ❌ неактивен" fi # container status (if found) if [ -n "$CONTAINER" ]; then container_status=$(docker ps --filter "name=^${CONTAINER}$" --format '{{.Status}}' 2>/dev/null) echo " Контейнер: ✅ ${CONTAINER} — ${container_status}" else # Try to detect if any amnezia container exists at all (for clearer message) any_amnezia=$(docker ps --format '{{.Names}}' 2>/dev/null | grep -i amne || true) if [ -n "$any_amnezia" ]; then echo " Контейнер: ❌ ожидается amnezia-awg/awg2, но не найден в списке запущенных контейнеров. Найдены: $any_amnezia" else echo " Контейнер: ❌ не запущен" fi fi echo "" # 2. Клиенты echo "👥 ПОДКЛЮЧЕННЫЕ КЛИЕНТЫ:" if [ -n "$CONTAINER" ]; then docker_exec wg show 2>/dev/null | awk ' BEGIN {count=0} /^peer:/ {peer=$2} /allowed ips:/ {ip=$3; gsub("/32","",ip)} /latest handshake:/ { if ($3 == "Never") { status="❌ отключен" time="никогда" } else { time=$3" "$4 if ($4 ~ /second|minute/) status="✅ онлайн" else if ($4 ~ /hour/) status="⚠ давно" else status="✅ онлайн" } } /transfer:/ { rx=$3; tx=$6 printf " • %-15s %-15s %8s ↓ / %8s ↑\n", ip, status, rx, tx count++ }' if ! docker ps --format '{{.Names}}' 2>/dev/null | grep -q -x "$CONTAINER"; then echo " Контейнер не запущен" fi else echo " Контейнер не запущен — не могу показать клиентов (wg)." fi echo "" # 3. Ограничения TC echo "⏸️ ОГРАНИЧЕНИЯ ТРАФИКА (70 Мбит/с):" if [ -n "$CONTAINER" ]; then count=$(docker_exec sh -c "tc class show dev ${IF} 2>/dev/null | grep -c 'rate 70Mbit'" 2>/dev/null || true) if [ -n "$count" ] && [ "$count" -gt 0 ]; then echo " Классы TC:" docker_exec sh -c "tc class show dev ${IF} 2>/dev/null | grep 'rate 70Mbit'" 2>/dev/null | \ while read -r line; do class_id=$(echo "$line" | awk '{print $2}' | cut -d: -f2) if [ -n "$class_id" ]; then echo " • Класс 1:$class_id → 70 Мбит/с" fi done echo " ✅ Ограничения активны для $count клиентов" else echo " ❌ Нет активных ограничений" fi else echo " Контейнер не запущен" fi echo "" # 4. Статистика фильтров echo "📈 СТАТИСТИКА ФИЛЬТРОВ:" if [ -n "$CONTAINER" ]; then docker_exec sh -c "tc -s filter show dev ${IF} parent 1: 2>/dev/null" 2>/dev/null | \ grep -B1 -A1 "flowid" | while read -r line1; do if echo "$line1" | grep -q "flowid"; then read -r line2 read -r line3 class=$(echo "$line1" | grep -o "flowid 1:[0-9]*" | cut -d: -f2) hex_ip=$(echo "$line2" | grep -o "match [0-9a-f]*" | awk '{print $2}') success=$(echo "$line3" | grep -o "success [0-9]*" | awk '{print $2}') if [ -n "$hex_ip" ] && [ -n "$class" ]; then ip=$(printf "%d.%d.%d.%d" \ 0x${hex_ip:0:2} \ 0x${hex_ip:2:2} \ 0x${hex_ip:4:2} \ 0x${hex_ip:6:2} 2>/dev/null) if [ -n "$success" ] && [ "$success" -gt 0 ]; then echo " • $ip → активен ($success пакетов)" else echo " • $ip → ожидание трафика" fi fi fi done if ! docker_exec sh -c "tc -s filter show dev ${IF} parent 1: 2>/dev/null" 2>/dev/null | grep -q "flowid"; then echo " Нет активных фильтров" fi else echo " Контейнер не запущен" fi echo "" # 5. Последние события echo "🔄 ПОСЛЕДНИЕ СОБЫТИЯ:" if [ -f "/var/log/amnezia-tc.log" ]; then tail -3 /var/log/amnezia-tc.log | while read -r line; do message=$(echo "$line" | cut -d']' -f2-) echo " $message" done else echo " Лог-файл не найден" fi echo "" echo "┌──────────────────────────────────────────────────┐" echo "│ СИСТЕМА ГОТОВА К ЭКСПЛУАТАЦИИ! 🎉 │" echo "│ │" echo "│ Проверено: │" echo "│ ✅ Автозапуск после перезагрузки │" echo "│ ✅ Автоматическое восстановление правил │" echo "│ ✅ Ограничение 70 Мбит/с на клиента │" echo "│ ✅ Обнаружение новых клиентов │" echo "└──────────────────────────────────────────────────┘" echo "" echo "📋 Команды управления:" echo " check-vpn-limits - этот отчет" echo " systemctl restart amnezia-tc.service - перезапуск" echo " journalctl -u amnezia-tc.service -f - логи" echo " docker restart ${CONTAINER:-amnezia-awg2} - перезапуск WG (поменяйте имя при необходимости)"