-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNLBInstaller.sh
More file actions
138 lines (117 loc) · 5.13 KB
/
NLBInstaller.sh
File metadata and controls
138 lines (117 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/bash
# Стили и цвета
BOLD='\033[1m'
B_CYAN='\033[1;36m'
B_GREEN='\033[1;32m'
B_YELLOW='\033[1;33m'
B_RED='\033[1;31m'
NC='\033[0m'
if [ "$EUID" -ne 0 ]; then
echo -e "${B_RED}Ошибка: Запустите от имени root.${NC}"
exit 1
fi
echo -e "${B_CYAN}Конфигурация NLB (Not LTE Blocker)${NC}"
# --- Запрос API Key ---
echo -e "${B_YELLOW}Введите ваш API Key от proxycheck.io (оставьте пустым для бесплатного режима):${NC}"
read -p "Ключ: " API_KEY
# -----------------------------
echo -e "\nВыберите метод интеграции:"
echo -e "1) UFW (через before.rules + RAW Table)"
echo -e "2) iptables (прямая таблица RAW)"
read -p "Ваш выбор [1-2]: " FW_CHOICE
case $FW_CHOICE in
1)
MODE="ufw"
# 1. Устанавливаем UFW, если его нет
if ! command -v ufw >/dev/null; then
echo -e "${B_YELLOW}Установка UFW...${NC}"
apt-get update -qq && apt-get install -y ufw -qq
fi
# 2. Удаляем iptables-persistent, чтобы он не перезаписывал правила UFW
if dpkg -l | grep -q iptables-persistent; then
echo -e "${B_YELLOW}Удаление конфликтующего iptables-persistent...${NC}"
apt-get purge -y iptables-persistent -qq
fi
;;
2)
MODE="iptables"
# Для чистого iptables нам как раз нужны утилиты сохранения
echo -e "${B_YELLOW}Настройка компонентов iptables...${NC}"
# Сообщаем системе, что установка будет неинтерактивной
export DEBIAN_FRONTEND=noninteractive
# Предустанавливаем ответы "Yes" (правда) для iptables-persistent
mkdir -p /etc/iptables
echo "iptables-persistent iptables-persistent/autosave_v4 boolean true" | debconf-set-selections
echo "iptables-persistent iptables-persistent/autosave_v6 boolean true" | debconf-set-selections
apt-get update -qq && apt-get install -y curl iptables jq iptables-persistent -qq
;;
*) echo "Неверный выбор. Выход."; exit 1 ;;
esac
# Устанавливаем общие зависимости
apt-get install -y jq -qq
S="/usr/local/bin/update-nlb.sh"
# Создаем скрипт с плейсхолдерами для MODE и API_KEY
cat << 'EOF' > "$S"
#!/bin/bash
MODE="__MODE_PLACEHOLDER__"
API_KEY="__API_KEY_PLACEHOLDER__"
LOG_FILE="/usr/local/x-ui/access.log"
# Формируем URL с ключом, если он задан
BASE_URL="https://proxycheck.io/v2"
[ -n "$API_KEY" ] && QUERY_URL="$BASE_URL/\$ip?key=$API_KEY&vpn=1&asn=1" || QUERY_URL="$BASE_URL/\$ip?vpn=1&asn=1"
IPS=$(tail -n 500 "$LOG_FILE" 2>/dev/null | tac | awk '{print $4}' | sed -E 's/(tcp:|udp:)//g' | cut -d: -f1 | grep -v '127.0.0.1' | awk '!x[$0]++' | head -n 10)
if [ "$MODE" = "ufw" ]; then
for ip in $IPS; do
[ -z "$ip" ] && continue
if ! ufw status | grep -q "$ip"; then
# Подставляем IP в URL
CURRENT_URL=$(echo $QUERY_URL | sed "s/\$ip/$ip/")
RESULT=$(curl -s "$CURRENT_URL")
TYPE=$(echo "$RESULT" | jq -r ".\"$ip\".type // \"Unknown\"")
if [ "$TYPE" = "Business" ] || [ "$TYPE" = "Residential" ]; then
ufw insert 1 deny from "$ip" comment 'NLB-Block'
fi
fi
done
ufw reload
else
for ip in $IPS; do
[ -z "$ip" ] && continue
if ! iptables -t raw -C PREROUTING -s "$ip" -j DROP &>/dev/null; then
CURRENT_URL=$(echo $QUERY_URL | sed "s/\$ip/$ip/")
RESULT=$(curl -s "$CURRENT_URL")
TYPE=$(echo "$RESULT" | jq -r ".\"$ip\".type // \"Unknown\"")
if [ "$TYPE" = "Business" ] || [ "$TYPE" = "Residential" ]; then
iptables -t raw -I PREROUTING -s "$ip" -j DROP 2>/dev/null
fi
fi
done
[ -d /etc/iptables ] && iptables-save > /etc/iptables/rules.v4
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') [SUCCESS] NLB updated via $MODE (API Key: ${API_KEY:-None})"
EOF
# Подстановка значений
sed -i "s/__MODE_PLACEHOLDER__/$MODE/" "$S"
sed -i "s/__API_KEY_PLACEHOLDER__/$API_KEY/" "$S"
chmod +x "$S"
$S
C_JOB="*/15 * * * * $S >> /var/log/nlb_update.log 2>&1"
(crontab -l 2>/dev/null | grep -v "$S" ; echo "$C_JOB") | crontab -
read -p "Создать службу systemd для обновления при старте системы? [y/N]: " SYSTEMD_CHOICE
if [[ "$SYSTEMD_CHOICE" =~ ^[Yy]$ ]]; then
cat << EOF > /etc/systemd/system/nlb-update.service
[Unit]
Description=Update NLB (Not LTE Blocker) on Boot
After=network.target
[Service]
Type=oneshot
ExecStart=$S
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable nlb-update.service
echo -e "${B_YELLOW}Служба systemd создана и включена.${NC}"
fi
echo -e "${B_GREEN}NLB успешно настроен через $MODE!${NC}"