mirror of
https://github.com/hackdiaz-dev/free-turn-proxy.git
synced 2026-10-12 09:41:53 +02:00
300 lines
12 KiB
Bash
300 lines
12 KiB
Bash
#!/usr/bin/env bash
|
|
# Free Turn Proxy Server Installation Script
|
|
|
|
set -e
|
|
|
|
# --- Цвета ---
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
|
|
# --- Функции логирования ---
|
|
info() { echo -e "${CYAN}[*]${NC} $1"; }
|
|
success() { echo -e "${GREEN}[+]${NC} $1"; }
|
|
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
|
|
error() { echo -e "${RED}[x]${NC} $1"; exit 1; }
|
|
|
|
# --- Проверки ---
|
|
if [ "$EUID" -ne 0 ]; then
|
|
error "Пожалуйста, запустите скрипт от имени root (sudo bash install-server.sh)"
|
|
fi
|
|
|
|
echo -e "${CYAN}"
|
|
cat << "EOF"
|
|
______ _____ ____
|
|
/ ____/_______ ___ /_ __/_ ___________ / __ \_________ _ ____ __
|
|
/ /_ / ___/ _ \/ _ \ / / / / / / ___/ __ \/ /_/ / ___/ __ \| |/_/ / / /
|
|
/ __/ / / / __/ __/ / / / /_/ / / / / / / ____/ / / /_/ /> </ /_/ /
|
|
/_/ /_/ \___/\___/ /_/ \__,_/_/ /_/ /_/_/ /_/ \____/_/|_|\__, /
|
|
/____/
|
|
EOF
|
|
echo -e "${NC}"
|
|
info "Вас приветствует интерактивный установщик Free Turn Proxy Server!"
|
|
echo ""
|
|
|
|
# Установка базовых утилит
|
|
info "Проверка базовых утилит..."
|
|
if command -v apt-get >/dev/null; then
|
|
apt-get update -y -qq >/dev/null
|
|
apt-get install -y -qq curl jq openssl >/dev/null
|
|
elif command -v yum >/dev/null; then
|
|
yum install -y -q curl jq openssl >/dev/null
|
|
else
|
|
warn "Не удалось определить пакетный менеджер (apt/yum). Убедитесь, что curl и jq установлены."
|
|
fi
|
|
success "Утилиты проверены."
|
|
|
|
# Определение архитектуры
|
|
ARCH=$(uname -m)
|
|
case "$ARCH" in
|
|
x86_64|amd64) GOARCH="amd64" ;;
|
|
aarch64|arm64) GOARCH="arm64" ;;
|
|
*) error "Неподдерживаемая архитектура: $ARCH" ;;
|
|
esac
|
|
|
|
# Шаг 1. Метод установки (Docker vs Systemd)
|
|
echo ""
|
|
info "Выберите метод установки сервера:"
|
|
echo -e " ${GREEN}1) Docker Compose (Рекомендуется)${NC}"
|
|
echo -e " 2) Systemd (Прямой запуск бинарника)"
|
|
read -p "Ваш выбор [1/2] (по умолчанию 1): " INSTALL_METHOD
|
|
INSTALL_METHOD=${INSTALL_METHOD:-1}
|
|
|
|
if [ "$INSTALL_METHOD" == "1" ]; then
|
|
if ! command -v docker >/dev/null; then
|
|
warn "Docker не найден."
|
|
read -p "Установить Docker сейчас? [Y/n]: " INSTALL_DOCKER
|
|
INSTALL_DOCKER=${INSTALL_DOCKER:-Y}
|
|
if [[ "$INSTALL_DOCKER" =~ ^[Yy]$ ]]; then
|
|
info "Установка Docker..."
|
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
sh get-docker.sh >/dev/null 2>&1
|
|
rm -f get-docker.sh
|
|
success "Docker успешно установлен."
|
|
else
|
|
error "Для этого метода требуется Docker. Отмена."
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Шаг 2. WireGuard
|
|
echo ""
|
|
info "Проверка WireGuard..."
|
|
WG_PORT=""
|
|
if ! command -v wg >/dev/null; then
|
|
warn "WireGuard не найден."
|
|
read -p "Установить пакет WireGuard? (Скрипт установит только пакет, настраивать нужно будет вручную) [Y/n]: " INSTALL_WG
|
|
INSTALL_WG=${INSTALL_WG:-Y}
|
|
if [[ "$INSTALL_WG" =~ ^[Yy]$ ]]; then
|
|
info "Установка WireGuard..."
|
|
if command -v apt-get >/dev/null; then
|
|
apt-get install -y -qq wireguard >/dev/null
|
|
elif command -v yum >/dev/null; then
|
|
yum install -y -q epel-release >/dev/null
|
|
yum install -y -q wireguard-tools >/dev/null
|
|
fi
|
|
success "WireGuard установлен."
|
|
fi
|
|
else
|
|
success "WireGuard уже установлен."
|
|
# Пытаемся найти порт
|
|
if wg show all listen-port >/dev/null 2>&1; then
|
|
WG_PORT=$(wg show all listen-port | head -n 1 | awk '{print $2}')
|
|
fi
|
|
if [ -z "$WG_PORT" ]; then
|
|
if [ -n "$(ls -A /etc/wireguard/*.conf 2>/dev/null)" ]; then
|
|
WG_PORT=$(grep -i ListenPort /etc/wireguard/*.conf | head -n 1 | awk -F '=' '{print $2}' | tr -d ' ')
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Шаг 3. Конфигурация прокси
|
|
echo ""
|
|
info "Конфигурация Free Turn Proxy"
|
|
|
|
# Режим
|
|
read -p "Режим работы туннеля (udp - для WireGuard/AmneziaWG, tcp - для Xray) [udp]: " PROXY_MODE
|
|
PROXY_MODE=${PROXY_MODE:-udp}
|
|
|
|
# Порт бэкенда
|
|
if [ -n "$WG_PORT" ]; then
|
|
read -p "Порт вашего VPN / бэкенда (найден WireGuard на порту $WG_PORT) [$WG_PORT]: " BACKEND_PORT
|
|
BACKEND_PORT=${BACKEND_PORT:-$WG_PORT}
|
|
else
|
|
if [ "$PROXY_MODE" == "udp" ]; then
|
|
DEF_B="51820"
|
|
else
|
|
DEF_B="443"
|
|
fi
|
|
read -p "Порт вашего VPN / бэкенда (например, $DEF_B) [$DEF_B]: " BACKEND_PORT
|
|
BACKEND_PORT=${BACKEND_PORT:-$DEF_B}
|
|
fi
|
|
CONNECT_ADDR="127.0.0.1:$BACKEND_PORT"
|
|
|
|
# Внешний порт
|
|
read -p "Внешний порт (на котором Free Turn Proxy будет принимать соединения) [56000]: " LISTEN_PORT
|
|
LISTEN_PORT=${LISTEN_PORT:-56000}
|
|
|
|
# Обфускация
|
|
read -p "Включить маскировку (rtpopus)? [Y/n]: " USE_OBF
|
|
USE_OBF=${USE_OBF:-Y}
|
|
OBF_PROFILE="none"
|
|
OBF_KEY=""
|
|
|
|
if [[ "$USE_OBF" =~ ^[Yy]$ ]]; then
|
|
OBF_PROFILE="rtpopus"
|
|
read -p "Сгенерировать случайный ключ обфускации? [Y/n]: " GEN_KEY
|
|
GEN_KEY=${GEN_KEY:-Y}
|
|
if [[ "$GEN_KEY" =~ ^[Yy]$ ]]; then
|
|
OBF_KEY=$(openssl rand -hex 32)
|
|
success "Ключ сгенерирован: $OBF_KEY"
|
|
else
|
|
read -p "Введите ваш 64-символьный hex ключ: " OBF_KEY
|
|
if [ -z "$OBF_KEY" ]; then
|
|
error "Ключ не может быть пустым."
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Авторизация по Client ID
|
|
read -p "Включить авторизацию по Client ID? (Потребуется создать клиентов) [y/N]: " USE_AUTH
|
|
USE_AUTH=${USE_AUTH:-N}
|
|
CLIENTS_FILE_CONF=""
|
|
if [[ "$USE_AUTH" =~ ^[Yy]$ ]]; then
|
|
CLIENTS_FILE_CONF="/opt/free-turn-proxy/clients.json"
|
|
fi
|
|
|
|
# Шаг 4. Настройка Firewall (UFW / iptables)
|
|
echo ""
|
|
info "Настройка брандмауэра..."
|
|
read -p "Открыть порт $LISTEN_PORT/udp в UFW/iptables? [Y/n]: " CONF_FW
|
|
CONF_FW=${CONF_FW:-Y}
|
|
if [[ "$CONF_FW" =~ ^[Yy]$ ]]; then
|
|
if command -v ufw >/dev/null && ufw status | grep -q "Status: active"; then
|
|
ufw allow $LISTEN_PORT/udp >/dev/null
|
|
success "Порт открыт через UFW."
|
|
elif command -v iptables >/dev/null; then
|
|
iptables -I INPUT -p udp --dport $LISTEN_PORT -j ACCEPT
|
|
if command -v netfilter-persistent >/dev/null; then
|
|
netfilter-persistent save >/dev/null 2>&1
|
|
fi
|
|
success "Порт открыт через iptables."
|
|
else
|
|
warn "Брандмауэр (ufw/iptables) не найден, пожалуйста, откройте порт $LISTEN_PORT/udp вручную."
|
|
fi
|
|
fi
|
|
|
|
# Шаг 5. Установка
|
|
echo ""
|
|
info "Начинаем установку..."
|
|
|
|
mkdir -p /opt/free-turn-proxy
|
|
|
|
# Инициализация clients.json если нужно
|
|
if [ -n "$CLIENTS_FILE_CONF" ]; then
|
|
if [ ! -f "$CLIENTS_FILE_CONF" ]; then
|
|
echo "[]" > "$CLIENTS_FILE_CONF"
|
|
success "Создан пустой список клиентов $CLIENTS_FILE_CONF"
|
|
fi
|
|
fi
|
|
|
|
if [ "$INSTALL_METHOD" == "1" ]; then
|
|
# DOCKER INSTALL
|
|
info "Генерация docker-compose.yml..."
|
|
cat > /opt/free-turn-proxy/docker-compose.yml <<EOF
|
|
services:
|
|
free-turn-proxy:
|
|
image: ghcr.io/samosvalishe/free-turn-proxy:latest
|
|
container_name: free-turn-proxy
|
|
network_mode: "host"
|
|
restart: unless-stopped
|
|
environment:
|
|
- CONNECT_ADDR=$CONNECT_ADDR
|
|
- LISTEN_ADDR=0.0.0.0:$LISTEN_PORT
|
|
- MODE=$PROXY_MODE
|
|
- OBF_PROFILE=$OBF_PROFILE
|
|
- OBF_KEY=$OBF_KEY
|
|
EOF
|
|
if [ -n "$CLIENTS_FILE_CONF" ]; then
|
|
echo " - CLIENTS_FILE=$CLIENTS_FILE_CONF" >> /opt/free-turn-proxy/docker-compose.yml
|
|
echo " volumes:" >> /opt/free-turn-proxy/docker-compose.yml
|
|
echo " - $CLIENTS_FILE_CONF:$CLIENTS_FILE_CONF" >> /opt/free-turn-proxy/docker-compose.yml
|
|
fi
|
|
|
|
cd /opt/free-turn-proxy
|
|
info "Запуск контейнера..."
|
|
docker compose up -d
|
|
else
|
|
# SYSTEMD INSTALL
|
|
info "Скачивание последнего релиза (server-linux-$GOARCH)..."
|
|
LATEST_URL=$(curl -s https://api.github.com/repos/samosvalishe/free-turn-proxy/releases/latest | jq -r ".assets[] | select(.name == \"server-linux-$GOARCH\") | .browser_download_url")
|
|
if [ -z "$LATEST_URL" ]; then
|
|
error "Не удалось найти бинарник server-linux-$GOARCH в последнем релизе."
|
|
fi
|
|
if ! curl -fL -o /opt/free-turn-proxy/server "$LATEST_URL" >/dev/null 2>&1; then
|
|
error "Не удалось скачать бинарник по адресу $LATEST_URL"
|
|
fi
|
|
chmod +x /opt/free-turn-proxy/server
|
|
|
|
info "Генерация systemd сервиса..."
|
|
CMD_ARGS="-listen 0.0.0.0:$LISTEN_PORT -connect $CONNECT_ADDR -mode $PROXY_MODE"
|
|
if [ "$OBF_PROFILE" != "none" ]; then
|
|
CMD_ARGS="$CMD_ARGS -obf-profile $OBF_PROFILE -obf-key $OBF_KEY"
|
|
fi
|
|
if [ -n "$CLIENTS_FILE_CONF" ]; then
|
|
CMD_ARGS="$CMD_ARGS -clients-file $CLIENTS_FILE_CONF"
|
|
fi
|
|
|
|
cat > /etc/systemd/system/free-turn-proxy.service <<EOF
|
|
[Unit]
|
|
Description=Free TURN Proxy Server
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
ExecStart=/opt/free-turn-proxy/server $CMD_ARGS
|
|
Restart=always
|
|
RestartSec=5
|
|
User=nobody
|
|
Group=nogroup
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable --now free-turn-proxy.service >/dev/null 2>&1
|
|
fi
|
|
|
|
echo ""
|
|
success "Установка успешно завершена!"
|
|
echo "--------------------------------------------------------"
|
|
echo -e "${CYAN}Конфигурация для подключения (Client):${NC}"
|
|
|
|
EXT_IP=$(curl -s ifconfig.me || echo "IP_ВАШЕГО_СЕРВЕРА")
|
|
echo " Сервер (peer): $EXT_IP:$LISTEN_PORT"
|
|
if [ "$OBF_PROFILE" != "none" ]; then
|
|
echo " Профиль обфускации: $OBF_PROFILE"
|
|
echo " Ключ обфускации: $OBF_KEY"
|
|
fi
|
|
echo " Режим: $PROXY_MODE"
|
|
|
|
if [ -n "$CLIENTS_FILE_CONF" ]; then
|
|
echo ""
|
|
echo -e "${YELLOW}Внимание: Включена авторизация по Client ID.${NC}"
|
|
echo "Чтобы клиент мог подключиться, вам нужно добавить его на сервере."
|
|
if [ "$INSTALL_METHOD" == "1" ]; then
|
|
echo "Управление клиентами (через Docker):"
|
|
echo " Добавить: docker exec -it free-turn-proxy /app/server clients add <ваш_id_клиента>"
|
|
echo " Список: docker exec -it free-turn-proxy /app/server clients list"
|
|
else
|
|
echo "Управление клиентами (systemd):"
|
|
echo " Добавить: /opt/free-turn-proxy/server -clients-file $CLIENTS_FILE_CONF clients add <ваш_id_клиента>"
|
|
echo " Список: /opt/free-turn-proxy/server -clients-file $CLIENTS_FILE_CONF clients list"
|
|
fi
|
|
fi
|
|
echo "--------------------------------------------------------"
|
|
echo -e "Подробная документация: https://github.com/samosvalishe/free-turn-proxy"
|