Скрипт с интерактивным меню дает возможность установить прокси, переустановить прокси, проверить работу + Плюшка - возможность теста лучшего IP адреса Binance с лучшим пингом и заменой его одной кнопкой.
Инструкция по установке:
- Берем сервер Хабаровска например edgecenter.ru
- Создаём виртуальный сервер Россия, Хабаровск с ОС Ubuntu-20.04-amd64 или выше. Выбираем самый дешевый тариф. Оплачиваем.
- Скачиваем SSH клиент Putty с официального сайта.
- Запускаем Putty, вводим IP адрес сервера и жмем Open
- Вводим пароль
- Вводим команду:
sudo nano 1.sh - Копируем код ниже (весь скрипт)
- Вставляем его в редактор nano (правая кнопка мыши или Shift+Insert)
- Нажимаем CTRL+O, Enter, CTRL+X для сохранения
- Вводим команду:
chmod +x 1.sh - Запускаем скрипт:
sudo ./1.sh
Скрипт для установки прокси
#!/bin/bash
# Проверка на запуск от root
if [ "$EUID" -ne 0 ]; then
echo "Пожалуйста, запустите скрипт с правами root (sudo $0)"
exit 1
fi
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Функция для отображения меню
show_menu() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Установка и настройка Shadowsocks ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
echo "1. Полная установка Shadowsocks-libev"
echo "2. Переустановить Shadowsocks"
echo "3. Показать текущие настройки"
echo "4. Проверить фаервол и порты"
echo "5. Перезапустить сервис"
echo "6. Проверить статус сервиса"
echo "7. Показать логи"
echo "8. Изменить пароль"
echo "9. Открыть порт в фаерволе"
echo "10. Проверить пинг до Binance"
echo "11. Удалить Shadowsocks"
echo "12. Наш Telegram канал"
echo "13. Выход"
echo ""
read -p "Выберите действие [1-13]: " choice
}
# Функция для проверки и установки qrencode
install_qrencode() {
if ! command -v qrencode &> /dev/null; then
echo -e "${YELLOW}Установка qrencode для генерации QR-кода...${NC}"
apt update && apt install -y qrencode
fi
}
# Функция для генерации QR-кода
generate_qr_code() {
local url="$1"
if command -v qrencode &> /dev/null; then
qrencode -t UTF8 "$url"
else
echo -e "${RED}Ошибка: qrencode не установлен. Установите: apt install qrencode${NC}"
return 1
fi
}
# Функция для отображения информации о Telegram канале
show_telegram_channel() {
clear
echo -e "${PURPLE}╔════════════════════════════════════════╗${NC}"
echo -e "${PURPLE}║ Папа Стифлера X Binance ║${NC}"
echo -e "${PURPLE}╚════════════════════════════════════════╝${NC}"
echo ""
echo -e "${CYAN}🎯 Присоединяйтесь к нашему Telegram каналу!${NC}"
echo ""
echo -e "${GREEN}📢 Что вас ждет:${NC}"
echo -e " • ${YELLOW}Эксклюзивные материалы по Binance API${NC}"
echo -e " • ${YELLOW}Обход блокировок и настройка прокси${NC}"
echo -e " • ${YELLOW}Автоматизация торговли${NC}"
echo -e " • ${YELLOW}Советы по безопасности${NC}"
echo -e " • ${YELLOW}Обновления и новости${NC}"
echo ""
# Устанавливаем qrencode если нет
install_qrencode
# Генерируем QR-код
echo -e "${GREEN}📲 QR-код для быстрого перехода:${NC}"
echo ""
if generate_qr_code "https://t.me/stiflersdad"; then
echo ""
fi
echo -e "${GREEN}🔗 Ссылка на канал:${NC}"
echo -e " ${YELLOW}t.me/stiflersdad${NC}"
echo ""
echo -e "${GREEN}🌐 Прямая ссылка:${NC}"
echo -e " ${CYAN}https://t.me/stiflersdad${NC}"
echo ""
echo -e "${GREEN}💡 Для быстрого перехода:${NC}"
echo -e " ${YELLOW}1. Откройте Telegram${NC}"
echo -e " ${YELLOW}2. Нажмите на лупу (поиск)${NC}"
echo -e " ${YELLOW}3. Введите: @stiflersdad${NC}"
echo -e " ${YELLOW}4. Нажмите 'Присоединиться'${NC}"
echo ""
echo -e "${BLUE}🌟 Уже в канале?${NC}"
echo " Рекомендуйте нас друзьям!"
echo ""
echo -e "${YELLOW}⚠️ ВАЖНО: QR-код может некорректно отображаться в некоторых терминалах.${NC}"
echo " В этом случае используйте прямую ссылку выше."
echo ""
read -p "Нажмите Enter для возврата в меню..."
}
# Функция для получения данных из конфига
get_config_data() {
CONFIG_FILE="/var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json"
if [ -f "$CONFIG_FILE" ]; then
ACTUAL_PORT=$(grep '"server_port"' "$CONFIG_FILE" | grep -o '[0-9]*' | head -1)
ACTUAL_PASSWORD=$(grep '"password"' "$CONFIG_FILE" | cut -d'"' -f4)
ACTUAL_METHOD=$(grep '"method"' "$CONFIG_FILE" | cut -d'"' -f4)
fi
ACTUAL_PORT=${ACTUAL_PORT:-8388}
ACTUAL_PASSWORD=${ACTUAL_PASSWORD:-"не установлен"}
ACTUAL_METHOD=${ACTUAL_METHOD:-aes-256-gcm}
}
# Функция для проверки пинга до Binance
check_binance_ping() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Проверка пинга до Binance ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
# Цвета для вывода
local RED='\033[0;31m'
local GREEN='\033[0;32m'
local YELLOW='\033[0;33m'
local BLUE='\033[1;34m'
local CYAN='\033[0;36m'
local NC='\033[0m'
# Настройки
local PING_COUNT=2
local INTERVAL_MS=500
local TIMEOUT_S=2
local IPS=(
"13.35.51.41"
"13.35.55.41"
"13.227.61.59"
"13.225.173.96"
"13.225.164.218"
"18.65.193.131"
"18.65.207.131"
"18.65.212.131"
"18.65.176.132"
"54.240.188.143"
"65.9.40.137"
"99.84.58.138"
"99.84.137.147"
"99.84.140.147"
"143.204.79.125"
"143.204.127.42"
)
local HOSTS_FILE="/etc/hosts"
local RESULT_TSV="/tmp/binance_results.tsv"
local RESULT_SORTED="/tmp/binance_sorted.tsv"
echo -e "${CYAN}Проверка пинга до серверов Binance...${NC}"
echo ""
# Проверка зависимостей
echo -e "${BLUE}Проверка зависимостей...${NC}"
local MISSING_DEPS=()
for cmd in fping bc; do
if ! command -v "$cmd" >/dev/null 2>&1; then
MISSING_DEPS+=("$cmd")
fi
done
# Проверка netcat
if ! command -v nc >/dev/null 2>&1 && ! command -v netcat >/dev/null 2>&1; then
MISSING_DEPS+=("netcat")
fi
if [ ${#MISSING_DEPS[@]} -ne 0 ]; then
echo -e "${YELLOW}Установка недостающих пакетов...${NC}"
# Обновление кэша пакетов
apt-get update >/dev/null 2>&1
# Установка пакетов
for dep in "${MISSING_DEPS[@]}"; do
case $dep in
"fping")
echo "Установка fping..."
apt-get install -y fping >/dev/null 2>&1
;;
"bc")
echo "Установка bc..."
apt-get install -y bc >/dev/null 2>&1
;;
"netcat")
echo "Установка netcat..."
apt-get install -y netcat-openbsd >/dev/null 2>&1
;;
esac
done
echo -e "${GREEN}Все зависимости установлены${NC}"
fi
echo ""
echo -e "${BLUE}Тестируем ${#IPS[@]} IP-адресов...${NC}"
echo ""
: > "$RESULT_TSV"
local TOTAL=${#IPS[@]}
local CURRENT=0
for IP in "${IPS[@]}"; do
CURRENT=$((CURRENT+1))
# Запускаем fping
( fping -i "$INTERVAL_MS" -c "$PING_COUNT" -q "$IP" 2>&1 ) >"/tmp/fping_$IP.log"
local LINE=$(grep 'xmt/rcv/%loss' "/tmp/fping_$IP.log")
# Извлекаем данные из вывода fping
local LOSS=$(echo "$LINE" | sed -nE 's/.*xmt\/rcv\/%loss = [0-9]+\/[0-9]+\/([0-9]+)%.*/\1/p')
local MIN=$( echo "$LINE" | sed -nE 's/.*min\/avg\/max = ([0-9.]+)\/([0-9.]+)\/([0-9.]+).*/\1/p')
local AVG=$( echo "$LINE" | sed -nE 's/.*min\/avg\/max = ([0-9.]+)\/([0-9.]+)\/([0-9.]+).*/\2/p')
local MAX=$( echo "$LINE" | sed -nE 's/.*min\/avg\/max = ([0-9.]+)\/([0-9.]+)\/([0-9.]+).*/\3/p')
[ -z "$LOSS" ] && LOSS=100
[ -z "$MIN" ] && MIN=9999
[ -z "$AVG" ] && AVG=9999
[ -z "$MAX" ] && MAX=9999
# Рассчитываем джиттер
local JITTER=$(echo "scale=2; $MAX - $MIN" | bc -l 2>/dev/null || echo "9999")
[ -z "$JITTER" ] && JITTER=9999
# Проверяем порт 443
if timeout "$TIMEOUT_S" bash -c "cat < /dev/null > /dev/tcp/$IP/443" 2>/dev/null; then
local PORT_STATUS="OK"
else
local PORT_STATUS="FAIL"
fi
# Рассчитываем score
if [ "$PORT_STATUS" = "FAIL" ]; then
local SCORE=0
else
local SCORE=$(echo "scale=2; 100 - ($AVG/10) - ($LOSS*0.5) - ($JITTER/5)" | bc -l 2>/dev/null || echo "0")
# Проверяем границы score
if (( $(echo "$SCORE < 0" | bc -l 2>/dev/null) )); then
SCORE=0
elif (( $(echo "$SCORE > 100" | bc -l 2>/dev/null) )); then
SCORE=100
fi
fi
printf "%s\t%s\t%s\t%s\t%s\t%s\t%.2f\t%s\n" \
"$IP" "$LOSS" "$MIN" "$AVG" "$MAX" "$JITTER" "$SCORE" "$PORT_STATUS" >> "$RESULT_TSV"
# Прогресс
local PROGRESS=$((CURRENT*100/TOTAL))
printf "\rПрогресс: ["
for ((i=0; i<20; i++)); do
if [ $i -lt $((PROGRESS/5)) ]; then
printf "#"
else
printf " "
fi
done
printf "] %3d%% (%d/%d)" "$PROGRESS" "$CURRENT" "$TOTAL"
done
echo -e "\n${GREEN}✓ Тестирование завершено${NC}"
# Сортировка
sort -t $'\t' -k7,7nr "$RESULT_TSV" > "$RESULT_SORTED"
# Текущий IP
local CURRENT_IP=$(grep -E '[[:space:]]fapi\.binance\.com$' "$HOSTS_FILE" 2>/dev/null | awk '{print $1}' | tail -n1)
# Вывод результатов
echo ""
echo -e "${BLUE}════════════════════════════ РЕЗУЛЬТАТЫ ════════════════════════════${NC}"
printf "%-16s %-12s %-8s %-8s %-8s %-10s %-10s %-10s %-2s %-2s\n" \
"IP-адрес" "Потери(%)" "min" "avg" "max" "Джиттер" "Score" "Порт443" "★" "✗"
echo "────────────────────────────────────────────────────────────────────────────────"
local line_no=0
local BEST_IP=$(head -n1 "$RESULT_SORTED" | cut -f1)
while IFS=$'\t' read -r ip loss min avg max jitter score port; do
line_no=$((line_no+1))
local star="" mark="" color="$NC"
# Форматирование SCORE
local score_fmt=$(printf "%.2f" "$score" 2>/dev/null)
if [[ "$score_fmt" =~ ^\. ]]; then
score_fmt="0$score_fmt"
fi
# Форматирование Джиттера
local jitter_fmt=$(printf "%.2f" "$jitter" 2>/dev/null)
if [[ "$jitter_fmt" =~ ^\. ]]; then
jitter_fmt="0$jitter_fmt"
fi
if [ "$line_no" -eq 1 ]; then
star="★"
color="$GREEN"
fi
if [ -n "$CURRENT_IP" ] && [ "$ip" = "$CURRENT_IP" ]; then
mark="✗"
color="$YELLOW"
fi
if [ "$loss" -ge 20 ] 2>/dev/null; then
color="$RED"
fi
printf "${color}%-16s %-12s %-8s %-8s %-8s %-10s %-10s %-10s %-2s %-2s${NC}\n" \
"$ip" "$loss" "$min" "$avg" "$max" "$jitter_fmt" "$score_fmt" "$port" "$star" "$mark"
done < "$RESULT_SORTED"
echo "────────────────────────────────────────────────────────────────────────────────"
echo -e "${CYAN}Лучший IP:${NC} ${GREEN}$BEST_IP${NC}"
echo -e "${CYAN}Текущий IP:${NC} ${YELLOW}${CURRENT_IP:-не установлен}${NC}"
# Предложение обновить hosts
echo ""
if [ -w "$HOSTS_FILE" ] || [ "$EUID" -eq 0 ]; then
if [ -n "$BEST_IP" ] && [ "$BEST_IP" != "$CURRENT_IP" ]; then
read -p "Обновить /etc/hosts на $BEST_IP? (y/N): " choice
if [[ "$choice" =~ ^[Yy]$ ]]; then
# Создаем backup
local BACKUP_FILE="/etc/hosts.backup.$(date +%Y%m%d_%H%M%S)"
cp "$HOSTS_FILE" "$BACKUP_FILE" 2>/dev/null
echo -e "${YELLOW}Создан backup: $BACKUP_FILE${NC}"
# Обновляем hosts
sed -i '/[[:space:]]fapi\.binance\.com$/d' "$HOSTS_FILE"
sed -i '/[[:space:]]api\.binance\.com$/d' "$HOSTS_FILE"
echo "$BEST_IP fapi.binance.com" >> "$HOSTS_FILE"
echo "$BEST_IP api.binance.com" >> "$HOSTS_FILE"
echo -e "✅ ${GREEN}/etc/hosts обновлён.${NC}"
echo -e "${YELLOW}Перезапустите приложение для применения изменений.${NC}"
else
echo "Отмена."
fi
elif [ "$BEST_IP" = "$CURRENT_IP" ]; then
echo -e "${GREEN}✓ Текущий IP уже является лучшим.${NC}"
fi
else
echo -e "${YELLOW}Внимание: Для обновления /etc/hosts требуются права root${NC}"
fi
# Очистка временных файлов
rm -f "$RESULT_TSV" "$RESULT_SORTED" "/tmp/fping_"*.log 2>/dev/null
echo ""
read -p "Нажмите Enter для возврата в меню..."
}
# Функция для отображения текущих настроек
show_current_settings() {
get_config_data
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Текущие настройки ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
echo -e "${GREEN}Конфигурационный файл:${NC}"
echo " /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json"
echo ""
echo -e "${GREEN}Параметры подключения:${NC}"
echo -e " Порт: ${YELLOW}${ACTUAL_PORT}${NC}"
echo -e " Пароль: ${YELLOW}${ACTUAL_PASSWORD}${NC}"
echo -e " Метод шифрования: ${YELLOW}${ACTUAL_METHOD}${NC}"
echo -e " Протокол: ${YELLOW}TCP и UDP${NC}"
echo ""
echo -e "${GREEN}Состояние сервиса:${NC}"
systemctl status shadowsocks-libev-server@config --no-pager | grep -E "(Active:|Loaded:|Main PID:)" | head -3
echo ""
echo -e "${GREEN}Порт в фаерволе:${NC}"
if command -v iptables &> /dev/null; then
if iptables -L INPUT -n 2>/dev/null | grep -q ":${ACTUAL_PORT}\b" || \
iptables-save 2>/dev/null | grep -q "dport ${ACTUAL_PORT}" || \
iptables -L 2>/dev/null | grep -q "${ACTUAL_PORT}"; then
echo -e " ${GREEN}✓ Порт ${ACTUAL_PORT} открыт в iptables${NC}"
else
echo -e " ${RED}✗ Порт ${ACTUAL_PORT} не открыт в iptables${NC}"
echo -e " ${YELLOW} Чтобы открыть, выберите пункт 9 в меню${NC}"
fi
else
echo " iptables не установлен"
echo " Установите: apt install iptables"
fi
echo ""
read -p "Нажмите Enter для продолжения..."
}
# Функция для полной установки
full_installation() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Полная установка ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
# Проверяем, не установлен ли уже сервис
if systemctl is-active --quiet shadowsocks-libev-server@config 2>/dev/null; then
echo -e "\n${YELLOW}⚠ Shadowsocks уже установлен и работает${NC}"
read -p "Хотите переустановить? (y/N): " reinstall
if [[ ! "$reinstall" =~ ^[Yy]$ ]]; then
echo "Установка отменена"
read -p "Нажмите Enter для возврата в меню..."
return
fi
# Останавливаем сервис перед установкой
systemctl stop shadowsocks-libev-server@config
systemctl disable shadowsocks-libev-server@config
fi
# Запрос пароля
echo ""
read -sp "Введите пароль для Shadowsocks (по умолчанию: 123456): " PASSWORD
echo ""
PASSWORD=${PASSWORD:-123456}
# Стандартные значения
SERVER_PORT="8388"
METHOD="aes-256-gcm"
# 1. Обновление пакетов
echo -e "\n${YELLOW}[1/9] Обновление пакетов...${NC}"
apt update && apt upgrade -y
# 2. Установка snapd и shadowsocks-libev
echo -e "\n${YELLOW}[2/9] Установка snapd и shadowsocks-libev...${NC}"
apt install -y snapd
snap install shadowsocks-libev
# 3. Создание директории для конфигурации
echo -e "\n${YELLOW}[3/9] Создание директории для конфигурации...${NC}"
mkdir -p /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev
# 4. Создание и настройка файла конфигурации
echo -e "\n${YELLOW}[4/9] Создание файла конфигурации...${NC}"
cat > /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json << EOF
{
"server":["::0", "0.0.0.0"],
"mode":"tcp_and_udp",
"server_port":${SERVER_PORT},
"local_port":1080,
"password":"${PASSWORD}",
"timeout":60,
"fast_open":true,
"reuse_port": true,
"no_delay": true,
"method":"${METHOD}"
}
EOF
echo -e "${GREEN}✓ Файл конфигурации создан${NC}"
# 5. Создание сервиса автозапуска
echo -e "\n${YELLOW}[5/9] Создание сервиса автозапуска...${NC}"
cat > /etc/systemd/system/shadowsocks-libev-server@.service << EOF
[Unit]
Description=Shadowsocks-Libev Custom Server Service for %I
Documentation=man:ss-server(1)
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/snap run shadowsocks-libev.ss-server -c /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/%i.json
[Install]
WantedBy=multi-user.target
EOF
# 6. Запуск сервиса
echo -e "\n${YELLOW}[6/9] Запуск сервиса...${NC}"
systemctl daemon-reload
systemctl enable --now shadowsocks-libev-server@config
# 7. Проверка статуса сервиса
echo -e "\n${YELLOW}[7/9] Проверка статуса сервиса...${NC}"
if systemctl is-active --quiet shadowsocks-libev-server@config; then
echo -e "${GREEN}✓ Сервис успешно запущен${NC}"
else
echo -e "${RED}✗ Ошибка запуска сервиса${NC}"
systemctl status shadowsocks-libev-server@config --no-pager
fi
# 8. Настройка фаервола
echo -e "\n${YELLOW}[8/9] Настройка фаервола...${NC}"
if command -v iptables &> /dev/null; then
iptables -I INPUT -p tcp --dport ${SERVER_PORT} -j ACCEPT
iptables -I INPUT -p udp --dport ${SERVER_PORT} -j ACCEPT
echo -e "${GREEN}✓ Правила iptables добавлены для порта ${SERVER_PORT}${NC}"
else
echo -e "${YELLOW}⚠ iptables не найден${NC}"
echo "Установите iptables: apt install iptables"
fi
# 9. Настройка файла hosts
echo -e "\n${YELLOW}[9/9] Обновление файла /etc/hosts...${NC}"
if ! grep -q "fapi.binance.com" /etc/hosts; then
echo -e "\n# Binance API\n99.84.140.147 fapi.binance.com\n99.84.140.147 api.binance.com" >> /etc/hosts
echo -e "${GREEN}✓ Записи добавлены в /etc/hosts${NC}"
else
echo -e "${YELLOW}⚠ Записи уже существуют в /etc/hosts${NC}"
fi
# Показываем итоговую информацию
get_config_data
echo -e "\n${GREEN}╔════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ Установка успешно завершена! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════╝${NC}"
echo ""
echo -e "${BLUE}Данные для подключения:${NC}"
echo -e " Порт: ${YELLOW}${ACTUAL_PORT}${NC}"
echo -e " Пароль: ${YELLOW}${ACTUAL_PASSWORD}${NC}"
echo -e " Метод: ${YELLOW}${ACTUAL_METHOD}${NC}"
echo ""
# Добавляем информацию о Telegram канале
echo -e "${PURPLE}🎯 Присоединяйтесь к нашему Telegram каналу!${NC}"
echo -e "${CYAN}Папа Стифлера X Binance${NC}"
echo -e "${YELLOW}t.me/stiflersdad${NC}"
echo ""
read -p "Нажмите Enter для возврата в меню..."
}
# Функция для переустановки
reinstall_shadowsocks() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Переустановка Shadowsocks ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
# Проверяем, установлен ли сервис
if ! systemctl is-active --quiet shadowsocks-libev-server@config 2>/dev/null && \
[ ! -f "/var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json" ]; then
echo -e "\n${RED}✗ Shadowsocks не установлен${NC}"
echo "Сначала выполните полную установку"
echo ""
read -p "Нажмите Enter для возврата в меню..."
return
fi
# Получаем текущий пароль для предложения по умолчанию
OLD_PASSWORD="123456"
if [ -f "/var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json" ]; then
OLD_PASSWORD=$(grep '"password"' "/var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json" | cut -d'"' -f4)
fi
echo ""
read -sp "Введите новый пароль (по умолчанию: $OLD_PASSWORD): " NEW_PASSWORD
echo ""
NEW_PASSWORD=${NEW_PASSWORD:-$OLD_PASSWORD}
echo -e "\n${YELLOW}Начинаем переустановку...${NC}"
# 1. Останавливаем сервис
echo -e "\n${YELLOW}[1/7] Остановка сервиса...${NC}"
systemctl stop shadowsocks-libev-server@config 2>/dev/null
systemctl disable shadowsocks-libev-server@config 2>/dev/null
echo -e "${GREEN}✓ Сервис остановлен${NC}"
# 2. Удаляем старый конфиг
echo -e "\n${YELLOW}[2/7] Удаление старой конфигурации...${NC}"
rm -f /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json
echo -e "${GREEN}✓ Старый конфиг удален${NC}"
# 3. Создаем новый конфиг
echo -e "\n${YELLOW}[3/7] Создание новой конфигурации...${NC}"
cat > /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json << EOF
{
"server":["::0", "0.0.0.0"],
"mode":"tcp_and_udp",
"server_port":8388,
"local_port":1080,
"password":"${NEW_PASSWORD}",
"timeout":60,
"fast_open":true,
"reuse_port": true,
"no_delay": true,
"method":"aes-256-gcm"
}
EOF
echo -e "${GREEN}✓ Новый конфиг создан${NC}"
# 4. Пересоздаем сервис (на случай изменений)
echo -e "\n${YELLOW}[4/7] Обновление сервиса...${NC}"
cat > /etc/systemd/system/shadowsocks-libev-server@.service << EOF
[Unit]
Description=Shadowsocks-Libev Custom Server Service for %I
Documentation=man:ss-server(1)
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/snap run shadowsocks-libev.ss-server -c /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/%i.json
[Install]
WantedBy=multi-user.target
EOF
echo -e "${GREEN}✓ Сервис обновлен${NC}"
# 5. Перезагружаем демон и запускаем сервис
echo -e "\n${YELLOW}[5/7] Перезапуск демона systemd...${NC}"
systemctl daemon-reload
echo -e "${GREEN}✓ Демон перезагружен${NC}"
echo -e "\n${YELLOW}[6/7] Запуск сервиса...${NC}"
systemctl enable --now shadowsocks-libev-server@config
sleep 2
# 6. Проверка статуса
echo -e "\n${YELLOW}[7/7] Проверка статуса...${NC}"
if systemctl is-active --quiet shadowsocks-libev-server@config; then
echo -e "${GREEN}✓ Сервис успешно переустановлен и запущен${NC}"
else
echo -e "${RED}✗ Ошибка запуска сервиса${NC}"
systemctl status shadowsocks-libev-server@config --no-pager
fi
# Показываем итоговую информацию
get_config_data
echo -e "\n${GREEN}╔════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ Переустановка успешно завершена! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════╝${NC}"
echo ""
echo -e "${BLUE}Новые данные для подключения:${NC}"
echo -e " Порт: ${YELLOW}${ACTUAL_PORT}${NC}"
echo -e " Пароль: ${YELLOW}${ACTUAL_PASSWORD}${NC}"
echo -e " Метод: ${YELLOW}${ACTUAL_METHOD}${NC}"
echo ""
# Добавляем информацию о Telegram канале
echo -e "${PURPLE}🎯 Присоединяйтесь к нашему Telegram каналу!${NC}"
echo -e "${CYAN}Папа Стифлера X Binance${NC}"
echo -e "${YELLOW}t.me/stiflersdad${NC}"
echo ""
read -p "Нажмите Enter для возврата в меню..."
}
# Функция для удаления Shadowsocks
uninstall_shadowsocks() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Удаление Shadowsocks ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo -e "\n${RED}ВНИМАНИЕ: Это действие удалит Shadowsocks с вашего сервера!${NC}"
echo ""
read -p "Вы уверены, что хотите удалить Shadowsocks? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "Удаление отменено"
read -p "Нажмите Enter для возврата в меню..."
return
fi
echo -e "\n${YELLOW}Начинаем удаление...${NC}"
# 1. Останавливаем сервис
echo -e "\n${YELLOW}[1/5] Остановка сервиса...${NC}"
systemctl stop shadowsocks-libev-server@config 2>/dev/null
systemctl disable shadowsocks-libev-server@config 2>/dev/null
echo -e "${GREEN}✓ Сервис остановлен${NC}"
# 2. Удаляем сервис
echo -e "\n${YELLOW}[2/5] Удаление сервиса...${NC}"
rm -f /etc/systemd/system/shadowsocks-libev-server@.service
systemctl daemon-reload
echo -e "${GREEN}✓ Сервис удален${NC}"
# 3. Удаляем конфигурацию
echo -e "\n${YELLOW}[3/5] Удаление конфигурации...${NC}"
rm -rf /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev
echo -e "${GREEN}✓ Конфигурация удалена${NC}"
# 4. Удаляем snap пакет
echo -e "\n${YELLOW}[4/5] Удаление snap пакета...${NC}"
snap remove shadowsocks-libev 2>/dev/null
echo -e "${GREEN}✓ Snap пакет удален${NC}"
# 5. Удаляем правила iptables
echo -e "\n${YELLOW}[5/5] Удаление правил фаервола...${NC}"
if command -v iptables &> /dev/null; then
iptables -D INPUT -p tcp --dport 8388 -j ACCEPT 2>/dev/null
iptables -D INPUT -p udp --dport 8388 -j ACCEPT 2>/dev/null
echo -e "${GREEN}✓ Правила фаервола удалены${NC}"
fi
echo -e "\n${GREEN}╔════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ Удаление успешно завершено! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════╝${NC}"
echo ""
echo "Shadowsocks полностью удален с вашего сервера."
echo ""
# Добавляем информацию о Telegram канале
echo -e "${PURPLE}🎯 Остались вопросы? Присоединяйтесь к нашему Telegram каналу!${NC}"
echo -e "${CYAN}Папа Стифлера X Binance${NC}"
echo -e "${YELLOW}t.me/stiflersdad${NC}"
echo ""
read -p "Нажмите Enter для возврата в меню..."
}
# Функция для перезапуска сервиса
restart_service() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Перезапуск сервиса ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
if systemctl restart shadowsocks-libev-server@config; then
echo -e "${GREEN}✓ Сервис успешно перезапущен${NC}"
else
echo -e "${RED}✗ Ошибка перезапуска сервиса${NC}"
fi
echo ""
systemctl status shadowsocks-libev-server@config --no-pager
echo ""
read -p "Нажмите Enter для продолжения..."
}
# Функция для проверки статуса сервиса
check_service_status() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Статус сервиса ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
systemctl status shadowsocks-libev-server@config --no-pager
echo ""
read -p "Нажмите Enter для продолжения..."
}
# Функция для показа логов
show_logs() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Логи сервиса ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
echo "Последние 50 строк логов:"
echo "--------------------------------------------------"
journalctl -u shadowsocks-libev-server@config -n 50 --no-pager
echo ""
echo "Для просмотра логов в реальном времени:"
echo "journalctl -u shadowsocks-libev-server@config -f"
echo ""
read -p "Нажмите Enter для продолжения..."
}
# Функция для изменения пароля
change_password() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Изменение пароля ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
CONFIG_FILE="/var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json"
if [ ! -f "$CONFIG_FILE" ]; then
echo -e "${RED}✗ Файл конфигурации не найден${NC}"
echo "Выполните полную установку сначала"
echo ""
read -p "Нажмите Enter для продолжения..."
return
fi
# Получаем текущий пароль
CURRENT_PASS=$(grep '"password"' "$CONFIG_FILE" | cut -d'"' -f4)
echo -e "Текущий пароль: ${YELLOW}${CURRENT_PASS}${NC}"
echo ""
read -sp "Введите новый пароль: " NEW_PASS
echo ""
if [ -z "$NEW_PASS" ]; then
echo -e "${RED}✗ Пароль не может быть пустым${NC}"
read -p "Нажмите Enter для продолжения..."
return
fi
# Сохраняем старый конфиг и заменяем пароль
TEMP_FILE=$(mktemp)
sed "s/\"password\":\"${CURRENT_PASS}\"/\"password\":\"${NEW_PASS}\"/" "$CONFIG_FILE" > "$TEMP_FILE"
if mv "$TEMP_FILE" "$CONFIG_FILE"; then
echo -e "${GREEN}✓ Пароль успешно изменен${NC}"
# Перезапускаем сервис
if systemctl restart shadowsocks-libev-server@config; then
echo -e "${GREEN}✓ Сервис перезапущен с новым паролем${NC}"
else
echo -e "${YELLOW}⚠ Ошибка при перезапуске сервиса${NC}"
fi
echo ""
echo -e "Новый пароль: ${YELLOW}${NEW_PASS}${NC}"
else
echo -e "${RED}✗ Ошибка при изменении пароля${NC}"
fi
echo ""
read -p "Нажмите Enter для продолжения..."
}
# Функция для открытия порта в фаерволе
open_firewall_port() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Открытие порта в фаерволе ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
if ! command -v iptables &> /dev/null; then
echo -e "${RED}✗ iptables не установлен${NC}"
read -p "Установить iptables? (y/N): " install_iptables
if [[ "$install_iptables" =~ ^[Yy]$ ]]; then
apt install -y iptables
else
echo "Пропускаем настройку фаервола"
read -p "Нажмите Enter для продолжения..."
return
fi
fi
get_config_data
echo -e "Текущий порт в конфигурации: ${YELLOW}${ACTUAL_PORT}${NC}"
echo ""
# Проверяем, открыт ли уже порт
PORT_OPEN=false
if iptables -L INPUT -n 2>/dev/null | grep -q ":${ACTUAL_PORT}\b"; then
PORT_OPEN=true
echo -e "${YELLOW}⚠ Порт ${ACTUAL_PORT} уже открыт в iptables${NC}"
fi
if [ "$PORT_OPEN" = false ]; then
read -p "Открыть порт ${ACTUAL_PORT} в фаерволе? (y/N): " confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
# Добавляем правила для TCP и UDP
iptables -A INPUT -p tcp --dport ${ACTUAL_PORT} -j ACCEPT
iptables -A INPUT -p udp --dport ${ACTUAL_PORT} -j ACCEPT
# Также добавляем через -I для двойной гарантии
iptables -I INPUT -p tcp --dport ${ACTUAL_PORT} -j ACCEPT
iptables -I INPUT -p udp --dport ${ACTUAL_PORT} -j ACCEPT
echo -e "${GREEN}✓ Порт ${ACTUAL_PORT} открыт в iptables${NC}"
# Сохраняем правила если установлен iptables-persistent
if command -v netfilter-persistent &> /dev/null; then
netfilter-persistent save
echo -e "${GREEN}✓ Правила сохранены для перезагрузки${NC}"
elif command -v iptables-save &> /dev/null && [ -d /etc/iptables ]; then
iptables-save > /etc/iptables/rules.v4
echo -e "${GREEN}✓ Правила сохранены в /etc/iptables/rules.v4${NC}"
fi
fi
fi
echo ""
echo "Текущие правила iptables для порта ${ACTUAL_PORT}:"
echo "--------------------------------------------------"
iptables -L INPUT -n 2>/dev/null | grep -E "(${ACTUAL_PORT}|dpt:${ACTUAL_PORT})" || echo "Правила не найдены"
echo ""
echo -e "${YELLOW}Примечание:${NC}"
echo "Если вы используете cloud-сервер (AWS, GCP, DigitalOcean, etc.),"
echo "вам также нужно открыть порт в настройках безопасности облачного провайдера."
echo ""
read -p "Нажмите Enter для продолжения..."
}
# Функция для проверки фаервола
check_firewall() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Проверка фаервола ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
get_config_data
echo -e "${YELLOW}Проверка порта ${ACTUAL_PORT} в фаерволе:${NC}"
echo ""
# Проверка iptables
echo "1. Проверка iptables:"
if command -v iptables &> /dev/null; then
echo " Статус: Установлен"
echo ""
echo " Правила для порта ${ACTUAL_PORT}:"
iptables -L INPUT -n 2>/dev/null | grep -E "(${ACTUAL_PORT}|dpt:${ACTUAL_PORT})" | while read line; do
echo " - $line"
done
if iptables -L INPUT -n 2>/dev/null | grep -q ":${ACTUAL_PORT}\b"; then
echo -e " ${GREEN}✓ Порт открыт в iptables${NC}"
else
echo -e " ${RED}✗ Порт не найден в iptables${NC}"
fi
else
echo -e " ${RED}✗ iptables не установлен${NC}"
fi
echo ""
echo "2. Проверка ufw (если используется):"
if command -v ufw &> /dev/null; then
echo " Статус: Установлен"
ufw status | grep ${ACTUAL_PORT}
else
echo " ufw не установлен"
fi
echo ""
echo "3. Проверка netstat/ss:"
if command -v ss &> /dev/null; then
echo " Прослушиваемые порты:"
ss -tulpn 2>/dev/null | grep ":${ACTUAL_PORT}" || echo " Порт не слушается"
fi
echo ""
echo "4. Быстрая проверка доступности:"
echo " Локально:"
if timeout 2 bash -c "echo > /dev/tcp/localhost/${ACTUAL_PORT}" 2>/dev/null; then
echo -e " ${GREEN}✓ Порт доступен локально${NC}"
else
echo -e " ${RED}✗ Порт недоступен локально${NC}"
fi
echo ""
echo -e "${YELLOW}Рекомендации:${NC}"
echo "- Если порт не открыт в iptables, используйте пункт 9 в меню"
echo "- Если используете облачный сервер, проверьте Security Groups/Firewall rules"
echo "- Для проверки извне: nc -zv ваш_публичный_IP ${ACTUAL_PORT}"
echo ""
read -p "Нажмите Enter для продолжения..."
}
# Главный цикл меню
while true; do
show_menu
case $choice in
1)
full_installation
;;
2)
reinstall_shadowsocks
;;
3)
show_current_settings
;;
4)
check_firewall
;;
5)
restart_service
;;
6)
check_service_status
;;
7)
show_logs
;;
8)
change_password
;;
9)
open_firewall_port
;;
10)
check_binance_ping
;;
11)
uninstall_shadowsocks
;;
12)
show_telegram_channel
;;
13)
clear
echo -e "${GREEN}До свидания!${NC}"
echo -e "${CYAN}Присоединяйтесь к нашему Telegram каналу: t.me/stiflersdad${NC}"
exit 0
;;
*)
echo -e "${RED}Неверный выбор. Попробуйте снова.${NC}"
sleep 2
;;
esac
done
Примечание: Скопируйте весь скрипт выше и вставьте его в файл 1.sh на вашем сервере.