#!/bin/sh set -e CLIENT_NAME="" CLIENT_PRIVATE_KEY="" CLIENT_IP="" CLIENT_IPV6="" SERVER_PUBLIC_KEY="" ENDPOINT_PORT=13255 KEEPALIVE=25 MTU=1420 FALLBACK_CONFIG="" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" } error() { echo "[ERROR] $*" >&2 log "ERROR: $*" } usage() { cat </dev/null 2>&1; then missing="$missing $cmd" fi done if [ -n "$missing" ]; then error "Missing required utilities:$missing" return 1 fi return 0 } parse_args() { while [ $# -gt 0 ]; do case "$1" in --client-name) CLIENT_NAME="$2" shift 2 ;; --client-private-key) CLIENT_PRIVATE_KEY="$2" shift 2 ;; --client-ip) CLIENT_IP="$2" shift 2 ;; --client-ipv6) CLIENT_IPV6="$2" shift 2 ;; --server-public-key) SERVER_PUBLIC_KEY="$2" shift 2 ;; --endpoint-port) ENDPOINT_PORT="$2" shift 2 ;; --keepalive) KEEPALIVE="$2" shift 2 ;; --mtu) MTU="$2" shift 2 ;; --fallback-config) FALLBACK_CONFIG="$2" shift 2 ;; --help) usage ;; *) error "Unknown option: $1" usage ;; esac done if [ -z "${CLIENT_NAME}" ] || [ -z "${CLIENT_PRIVATE_KEY}" ] || \ [ -z "${CLIENT_IP}" ] || [ -z "${CLIENT_IPV6}" ] || \ [ -z "${SERVER_PUBLIC_KEY}" ]; then error "Missing required parameters" usage fi } check_existing_interface() { local interface_name="phobos_wg" if uci -q get network.${interface_name} >/dev/null 2>&1; then log "Найден существующий интерфейс: ${interface_name}" return 0 else log "Существующий интерфейс Phobos не найден" return 1 fi } remove_existing_interface() { local interface_name="phobos_wg" log "Удаление существующего интерфейса ${interface_name}..." uci -q delete network.${interface_name} || true local peers=$(uci show network | grep "wireguard_${interface_name}" | cut -d'.' -f2 | cut -d'=' -f1 | sort -u) for peer in $peers; do uci -q delete network.$peer || true done uci commit network log "Существующий интерфейс удален" } configure_wireguard_interface() { local interface_name="phobos_wg" log "Настройка интерфейса ${interface_name} через UCI..." uci set network.${interface_name}=interface uci set network.${interface_name}.proto='wireguard' uci set network.${interface_name}.private_key="${CLIENT_PRIVATE_KEY}" uci set network.${interface_name}.mtu="${MTU}" uci add_list network.${interface_name}.addresses="${CLIENT_IP}" if [ "${CLIENT_IPV6}" != "none" ] && [ -n "${CLIENT_IPV6}" ]; then uci add_list network.${interface_name}.addresses="${CLIENT_IPV6}" fi local peer_name="wgpeer_${interface_name}" uci add network wireguard_${interface_name} uci rename network.@wireguard_${interface_name}[-1]="${peer_name}" uci set network.${peer_name}.public_key="${SERVER_PUBLIC_KEY}" uci set network.${peer_name}.description="Phobos VPS Server" uci set network.${peer_name}.endpoint_host='127.0.0.1' uci set network.${peer_name}.endpoint_port="${ENDPOINT_PORT}" uci set network.${peer_name}.persistent_keepalive="${KEEPALIVE}" uci set network.${peer_name}.route_allowed_ips='0' uci add_list network.${peer_name}.allowed_ips='0.0.0.0/0' uci add_list network.${peer_name}.allowed_ips='::/0' uci commit network log "Интерфейс ${interface_name} настроен ✓" return 0 } configure_firewall_zone() { local zone_name="phobos" local interface_name="phobos_wg" log "Настройка файрволла для зоны ${zone_name}..." if uci -q get firewall.${zone_name} >/dev/null 2>&1; then log "Зона ${zone_name} уже существует, обновляем..." uci delete firewall.${zone_name} fi uci add firewall zone uci rename firewall.@zone[-1]="${zone_name}" uci set firewall.${zone_name}.name="${zone_name}" uci add_list firewall.${zone_name}.network="${interface_name}" uci set firewall.${zone_name}.input='REJECT' uci set firewall.${zone_name}.output='ACCEPT' uci set firewall.${zone_name}.forward='REJECT' uci set firewall.${zone_name}.masq='0' uci set firewall.${zone_name}.mtu_fix='1' uci commit firewall log "Файрволл зона ${zone_name} настроена ✓" return 0 } restart_network_services() { log "Перезапуск сетевых сервисов..." /etc/init.d/network reload >/dev/null 2>&1 || true sleep 3 ifup phobos_wg >/dev/null 2>&1 || true sleep 2 /etc/init.d/firewall reload >/dev/null 2>&1 || true sleep 1 log "Сетевые сервисы перезапущены ✓" } verify_interface_created() { log "Проверка создания интерфейса WireGuard..." local max_attempts=5 local attempt=1 while [ $attempt -le $max_attempts ]; do if ip link show phobos_wg >/dev/null 2>&1; then log "Интерфейс phobos_wg найден (попытка $attempt/$max_attempts)" if wg show phobos_wg >/dev/null 2>&1; then log "WireGuard интерфейс phobos_wg активен" if uci -q get network.phobos_wg >/dev/null 2>&1; then log "UCI конфигурация phobos_wg найдена" return 0 else log "UCI конфигурация phobos_wg не найдена, но интерфейс работает" return 0 fi else log "Интерфейс найден, но WireGuard не активен (попытка $attempt/$max_attempts)" fi else log "Интерфейс phobos_wg еще не создан (попытка $attempt/$max_attempts)..." fi if [ $attempt -lt $max_attempts ]; then sleep 2 fi attempt=$((attempt + 1)) done error "Интерфейс phobos_wg не найден после $max_attempts попыток" return 1 } show_fallback_instructions() { cat </dev/null | sed 's/^/ /' || true log "" exit 0 else log "" log "Не удалось подтвердить создание интерфейса WireGuard" log "" log "Проверьте вручную:" log " ip link show phobos_wg" log " wg show phobos_wg" log " uci show network.phobos_wg" log "" log "Если интерфейс существует (ip link show phobos_wg работает)," log "то настройка прошла успешно, несмотря на ошибку проверки." log "" exit 1 fi } main "$@"