190 lines
8.0 KiB
Plaintext
190 lines
8.0 KiB
Plaintext
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 (поменяйте имя при необходимости)" |