Первое, что нужно сделать: зарегистрироваться у нас и получить доступы.

Далее для Для Ubuntu 24 LTS создаем файл /etc/sstp/sstp-connect.sh
#!/bin/bash
# --- КОНФИГУРАЦИЯ ---
SERVER_HOSTNAME="ВАШ адрес сервера"
USERNAME="Логин"
PASSWORD="Пароль"
INTERFACE_UNIT="1"
VPN_INTERFACE="ppp${INTERFACE_UNIT}"
# Домены OpenAI и Google AI для резолва
OPENAI_DOMAINS=(
"api.openai.com"
"platform.openai.com"
"openai.com"
"chat.openai.com"
"auth0.openai.com"
)
GOOGLE_AI_DOMAINS=(
"generativelanguage.googleapis.com"
"ai.googleapis.com"
"palm.googleapis.com"
"bard.google.com"
"gemini.google.com"
)
SSH_ROUTE_TABLE=100
VPN_ROUTE_TABLE=150
# Файл для кэширования IP (чтобы не резолвить каждый раз)
IP_CACHE_FILE="/tmp/vpn_ip_cache.txt"
CACHE_TTL=3600 # 1 час в секундах
# --- ДОБАВЛЕНО: ПАРАМЕТРЫ ПЕРЕПОДКЛЮЧЕНИЯ ---
RECONNECT_DELAY=10 # Задержка перед переподключением (секунд)
# 0. РАЗРЕШЕНИЕ DNS
echo "🔍 Разрешение DNS для $SERVER_HOSTNAME..."
SERVER_ADDRESS=$(dig +short "${SERVER_HOSTNAME}" | head -n 1)
if [ -z "${SERVER_ADDRESS}" ]; then
echo "❌ Ошибка: Не удалось разрешить IP-адрес для ${SERVER_HOSTNAME}."
exit 1
fi
echo "🔗 IP-адрес SSTP-сервера: ${SERVER_ADDRESS}"
# --- ПРОВЕРКИ ---
if [ "$(id -u)" != "0" ]; then
echo "🚫 Скрипт должен быть запущен с правами root."
exit 1
fi
if ! command -v sstpc &> /dev/null; then
echo "⚠️ sstp-client не найден."
exit 1
fi
# 1. СОХРАНЕНИЕ СТАРОГО МАРШРУТА
OLD_DEFAULT_ROUTE=$(ip route show default | grep -m 1 "default via")
if [ -z "${OLD_DEFAULT_ROUTE}" ]; then
echo "❌ Не найден существующий маршрут по умолчанию."
exit 1
fi
OLD_GATEWAY=$(echo "${OLD_DEFAULT_ROUTE}" | awk '{print $3}')
OLD_DEV=$(echo "${OLD_DEFAULT_ROUTE}" | awk '{print $5}')
SERVER_LOCAL_IP=$(ip a show dev "${OLD_DEV}" | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1 | head -n 1)
if [ -z "${SERVER_LOCAL_IP}" ]; then
echo "❌ Не удалось получить локальный IP-адрес на ${OLD_DEV}."
exit 1
fi
echo "📊 Сетевые настройки: устройство=$OLD_DEV, шлюз=$OLD_GATEWAY, IP=$SERVER_LOCAL_IP"
# --- ФУНКЦИЯ РЕЗОЛВА ДОМЕНОВ С КЭШИРОВАНИЕМ ---
resolve_domains() {
echo "🔍 Резолвинг доменов OpenAI и Google AI..."
# Проверяем кэш
if [ -f "$IP_CACHE_FILE" ] && [ $(($(date +%s) - $(stat -c %Y "$IP_CACHE_FILE"))) -lt $CACHE_TTL ]; then
echo "📁 Используем кэшированные IP (файл меньше $((CACHE_TTL/3600)) часа)"
CACHED_IPS=$(cat "$IP_CACHE_FILE")
else
echo "🔄 Обновляем кэш IP..."
CACHED_IPS=""
fi
# Удаляем старый ipset если существует
ipset destroy vpn_nets 2>/dev/null || true
# Создаем новый ipset
ipset create vpn_nets hash:ip
local total_ips=0
local new_ips=""
# Функция для резолва одного домена
resolve_domain() {
local domain=$1
echo "📡 Резолвим $domain..."
# Пробуем разные DNS серверы для надежности
local ips=$(dig +short "$domain" A @1.1.1.1 | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$')
if [ -z "$ips" ]; then
ips=$(dig +short "$domain" A @8.8.8.8 | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$')
fi
if [ -z "$ips" ]; then
echo "⚠️ Не удалось разрешить $domain"
return 1
fi
for ip in $ips; do
# Проверяем есть ли IP в кэше (если используем кэш)
if [ -n "$CACHED_IPS" ] && echo "$CACHED_IPS" | grep -q "$ip"; then
echo "ℹ️ Из кэша: $ip ($domain)"
else
echo "🆕 Новый IP: $ip ($domain)"
new_ips="$new_ips$ip"$'\n'
fi
if ipset add vpn_nets "$ip" 2>/dev/null; then
((total_ips++))
fi
done
return 0
}
# Резолвим OpenAI домены
echo "--- OpenAI ---"
for domain in "${OPENAI_DOMAINS[@]}"; do
resolve_domain "$domain"
done
# Резолвим Google AI домены
echo "--- Google AI ---"
for domain in "${GOOGLE_AI_DOMAINS[@]}"; do
resolve_domain "$domain"
done
# Обновляем кэш если есть новые IP
if [ -n "$new_ips" ] || [ ! -f "$IP_CACHE_FILE" ]; then
echo "💾 Обновляем кэш IP..."
ipset list vpn_nets | grep -E '^[0-9]' > "$IP_CACHE_FILE"
fi
# Добавляем тестовые IP если ничего не нашлось
if [ "$total_ips" -eq 0 ]; then
echo "⚠️ Не найдено IP, добавляем тестовые..."
ipset add vpn_nets "8.8.8.8" 2>/dev/null
ipset add vpn_nets "1.1.1.1" 2>/dev/null
total_ips=2
fi
echo "✅ Всего IP в ipset: $total_ips"
# Показываем что получилось
echo "📋 Актуальные IP:"
ipset list vpn_nets | grep -E '^[0-9]' | head -15
}
# --- ФУНКЦИЯ ОБНОВЛЕНИЯ IPSET В РЕАЛЬНОМ ВРЕМЕНИ ---
start_ipset_updater() {
echo "🔄 Запуск фонового обновления ipset..."
while true; do
sleep 300 # Проверяем каждые 5 минут
# Проверяем актуальность ключевых доменов
for domain in "api.openai.com" "generativelanguage.googleapis.com"; do
current_ips=$(dig +short "$domain" A | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$')
for ip in $current_ips; do
if ! ipset test vpn_nets "$ip" 2>/dev/null; then
echo "🆕 Обнаружен новый IP: $ip ($domain) - добавляем в ipset"
ipset add vpn_nets "$ip" 2>/dev/null && echo "✅ Добавлен $ip"
# Обновляем кэш
ipset list vpn_nets | grep -E '^[0-9]' > "$IP_CACHE_FILE" 2>/dev/null
fi
done
done
done &
UPDATER_PID=$!
echo "📡 Фоновое обновление запущено (PID: $UPDATER_PID)"
}
# --- ФУНКЦИЯ ВОССТАНОВЛЕНИЯ ---
cleanup() {
echo -e "\n--------------------------------------------------------"
echo "🔄 Восстановление маршрутов и удаление правил..."
# Убиваем фоновый процесс обновления
[ -n "$UPDATER_PID" ] && kill $UPDATER_PID 2>/dev/null
# Удаляем NAT правила
iptables -t nat -D POSTROUTING -m mark --mark 0x2 -j MASQUERADE 2>/dev/null || true
# Удаляем правила маршрутизации для VPN
iptables -t mangle -D OUTPUT -m set --match-set vpn_nets dst -j MARK --set-mark 0x2 2>/dev/null || true
iptables -t mangle -D PREROUTING -m set --match-set vpn_nets dst -j MARK --set-mark 0x2 2>/dev/null || true
ip rule del fwmark 0x2 2>/dev/null || true
ip route flush table $VPN_ROUTE_TABLE 2>/dev/null || true
# Удаляем ipset
ipset destroy vpn_nets 2>/dev/null || true
# Восстанавливаем SSH маршрутизацию
ip rule del from "${SERVER_LOCAL_IP}" table ${SSH_ROUTE_TABLE} 2>/dev/null || true
ip route flush table ${SSH_ROUTE_TABLE} 2>/dev/null || true
# Восстанавливаем основной маршрут по умолчанию
ip route del default 2>/dev/null || true
ip route add default via "${OLD_GATEWAY}" dev "${OLD_DEV}" 2>/dev/null
# Удаляем статический маршрут к VPN-серверу
ip route del "${SERVER_ADDRESS}" 2>/dev/null || true
# Завершаем pppd
pkill -f "sstpc" 2>/dev/null || true
sleep 2
echo "✅ Все правила удалены, маршруты восстановлены."
}
trap cleanup EXIT INT TERM
# --- ДОБАВЛЕНО: ФУНКЦИЯ ДЛЯ ПЕРЕПОДКЛЮЧЕНИЯ --- reconnect_ppp() { echo "🔄 Переподключение VPN..." # 1. Убиваем старые процессы pkill -f "sstpc" 2>/dev/null sleep 2 # 2. Удаляем старый интерфейс ip link delete "$VPN_INTERFACE" 2>/dev/null # 3. Запускаем SSTP заново sstpc \ --cert-warn \ --user "${USERNAME}" \ --password "${PASSWORD}" \ "${SERVER_HOSTNAME}" \ usepeerdns \ require-mschap-v2 \ noauth \ noipdefault \ refuse-eap \ noccp \ unit "${INTERFACE_UNIT}" & local sstp_pid=$! # 4. Ждем интерфейс local attempts=0 while ! ip a show dev "${VPN_INTERFACE}" &> /dev/null; do if (( attempts >= 30 )); then echo "❌ Не удалось переподключиться" kill $sstp_pid 2>/dev/null return 1 fi sleep 1 attempts=$((attempts + 1)) done echo "✅ Интерфейс ${VPN_INTERFACE} восстановлен" # 5. Получаем новый peer IP local new_peer_ip="" attempts=0 while [ -z "${new_peer_ip}" ] && (( attempts < 20 )); do new_peer_ip=$(ip a show dev "${VPN_INTERFACE}" | grep 'peer' | awk '{print $4}' | cut -d'/' -f1) sleep 0.5 attempts=$((attempts + 1)) done if [ -z "${new_peer_ip}" ]; then echo "⚠️ Не получили новый peer IP" return 1 fi echo "🔗 Новый peer IP: ${new_peer_ip}" # 6. Обновляем ТОЛЬКО VPN маршрут в таблице 150 ip route flush table $VPN_ROUTE_TABLE 2>/dev/null ip route add "${SERVER_ADDRESS}" via "${OLD_GATEWAY}" dev "${OLD_DEV}" table $VPN_ROUTE_TABLE ip route add default via "${new_peer_ip}" dev "${VPN_INTERFACE}" table $VPN_ROUTE_TABLE # 7. Восстанавливаем правило fwmark (на всякий случай) ip rule del fwmark 0x2 2>/dev/null || true ip rule add fwmark 0x2 lookup $VPN_ROUTE_TABLE prio 1000 return 0 } # --- ДОБАВЛЕНО: ПРОВЕРКА VPN СОЕДИНЕНИЯ --- check_vpn_active() { # Простая проверка - интерфейс существует и поднят if ip a show dev "${VPN_INTERFACE}" 2>/dev/null | grep -q "UP"; then return 0 fi return 1 } # --- РЕЗОЛВИМ ДОМЕНЫ ПЕРЕД ПОДКЛЮЧЕНИЕМ --- resolve_domains # --- ЗАПУСК SSTP И ОЖИДАНИЕ ИНТЕРФЕЙСА --- echo "🚀 Запуск SSTP-подключения..." # Убиваем старые процессы pkill -f "sstpc" 2>/dev/null || true sleep 2 sstpc \ --cert-warn \ --user "${USERNAME}" \ --password "${PASSWORD}" \ "${SERVER_HOSTNAME}" \ usepeerdns \ require-mschap-v2 \ noauth \ noipdefault \ refuse-eap \ noccp \ unit "${INTERFACE_UNIT}" & SSTPC_PID=$! echo "⏳ Ожидание ${VPN_INTERFACE}..." ATTEMPTS=0 MAX_ATTEMPTS=30 while ! ip a show dev "${VPN_INTERFACE}" &> /dev/null; do if (( ATTEMPTS >= MAX_ATTEMPTS )); then echo "❌ Превышено время ожидания интерфейса ${VPN_INTERFACE}." kill $SSTPC_PID 2>/dev/null || true exit 1 fi sleep 1 ATTEMPTS=$((ATTEMPTS + 1)) done echo "✅ Интерфейс ${VPN_INTERFACE} появился." # --- ПОЛУЧЕНИЕ IP ПИРА VPN --- echo "🔍 Получение IP-адреса пира VPN..." NEW_PEER_IP="" ATTEMPTS=0 while [ -z "${NEW_PEER_IP}" ] && (( ATTEMPTS < 20 )); do NEW_PEER_IP=$(ip a show dev "${VPN_INTERFACE}" | grep 'peer' | awk '{print $4}' | cut -d'/' -f1) if [ -n "${NEW_PEER_IP}" ]; then break fi sleep 0.5 ATTEMPTS=$((ATTEMPTS + 1)) done if [ -z "${NEW_PEER_IP}" ]; then echo "❌ Не удалось получить IP-адрес пира VPN." kill $SSTPC_PID exit 1 fi echo "🔗 IP-адрес пира VPN: ${NEW_PEER_IP}" # --- НАСТРОЙКА МАРШРУТИЗАЦИИ И NAT --- echo "🛣 Настройка маршрутизации и NAT..." # 1. Source-Based Routing для SSH echo "💾 Настройка SSH маршрутизации..." ip route flush table $SSH_ROUTE_TABLE 2>/dev/null || true ip route add default via "${OLD_GATEWAY}" dev "${OLD_DEV}" table $SSH_ROUTE_TABLE ip rule del from "${SERVER_LOCAL_IP}" table $SSH_ROUTE_TABLE 2>/dev/null || true ip rule add from "${SERVER_LOCAL_IP}" table $SSH_ROUTE_TABLE
# 2. Статический маршрут к VPN-серверу
echo "🔗 Добавление статического маршрута к VPN-серверу..."
ip route del "${SERVER_ADDRESS}" 2>/dev/null || true
ip route add "${SERVER_ADDRESS}" via "${OLD_GATEWAY}" dev "${OLD_DEV}"
# 3. Основной маршрут по умолчанию - через основной шлюз
echo "🌐 Основной маршрут по умолчанию - через $OLD_DEV"
ip route del default 2>/dev/null || true
ip route add default via "${OLD_GATEWAY}" dev "${OLD_DEV}"
# 4. Настраиваем таблицу маршрутизации для VPN
echo "🔧 Настройка таблицы маршрутизации для VPN..."
ip route flush table $VPN_ROUTE_TABLE 2>/dev/null || true
# Добавляем маршрут к VPN серверу через основной интерфейс
ip route add "${SERVER_ADDRESS}" via "${OLD_GATEWAY}" dev "${OLD_DEV}" table $VPN_ROUTE_TABLE
# Добавляем маршрут по умолчанию через VPN
ip route add default via "${NEW_PEER_IP}" dev "${VPN_INTERFACE}" table $VPN_ROUTE_TABLE
# 5. Настраиваем правило для маркированного трафика
echo "🎯 Настройка правил маршрутизации..."
ip rule del fwmark 0x2 2>/dev/null || true
ip rule add fwmark 0x2 lookup $VPN_ROUTE_TABLE prio 1000
# 6. Настраиваем iptables для маркировки
echo "🏷 Настройка маркировки пакетов..."
iptables -t mangle -D OUTPUT -m set --match-set vpn_nets dst -j MARK --set-mark 0x2 2>/dev/null || true
iptables -t mangle -D PREROUTING -m set --match-set vpn_nets dst -j MARK --set-mark 0x2 2>/dev/null || true
iptables -t mangle -A OUTPUT -m set --match-set vpn_nets dst -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -m set --match-set vpn_nets dst -j MARK --set-mark 0x2
# 7. КРИТИЧЕСКИ ВАЖНО: Настраиваем NAT для маркированного трафика
echo "🔀 Настройка NAT для VPN трафика..."
iptables -t nat -D POSTROUTING -m mark --mark 0x2 -j MASQUERADE 2>/dev/null || true
iptables -t nat -A POSTROUTING -m mark --mark 0x2 -j MASQUERADE
echo "✅ Маршрутизация и NAT настроены"
# --- ЗАПУСКАЕМ ФОНОВОЕ ОБНОВЛЕНИЕ IPSET ---
start_ipset_updater
# --- ПРОВЕРКА СВЯЗНОСТИ ---
echo "🔍 Проверка связи..."
echo "1. Пинг через основной интерфейс:"
ping -c 2 -I $OLD_DEV 8.8.8.8
echo "2. Пинг через VPN:"
iptables -t mangle -Z
iptables -t nat -Z
echo "Пинг OpenAI:"
API_IP=$(dig +short api.openai.com | head -1)
echo "IP api.openai.com: $API_IP"
ping -c 2 $API_IP
echo "Пинг Google AI:"
GAI_IP=$(dig +short generativelanguage.googleapis.com | head -1)
echo "IP generativelanguage.googleapis.com: $GAI_IP"
ping -c 2 $GAI_IP
echo "3. Проверка через curl:"
echo "OpenAI:"
curl -s --max-time 5 -I https://api.openai.com/v1/models | head -1
echo "Google AI:"
curl -s --max-time 5 -I https://generativelanguage.googleapis.com/v1/models | head -1
echo "--------------------------------------------------------"
echo "🌐 VPN настроен для OpenAI и Google AI"
echo "🔄 Автообновление IP каждые 5 минут"
echo "🔀 NAT включен для VPN трафика"
echo "🔄 АВТОПЕРЕПОДКЛЮЧЕНИЕ ВКЛЮЧЕНО"
echo "📊 Основной трафик: через $OLD_DEV"
echo "🔒 VPN трафик: через $VPN_INTERFACE"
echo "🖱 Нажмите Ctrl+C для отключения"
echo "--------------------------------------------------------"
# --- ИЗМЕНЕНО: БЕСКОНЕЧНОЕ ОЖИДАНИЕ С ПРОВЕРКОЙ ---
while true; do
# Ждем 15 секунд перед следующей проверкой
sleep 15
# Проверяем активность VPN
if ! check_vpn_active; then
echo "⚠️ VPN соединение разорвано! Пытаюсь переподключиться через $RECONNECT_DELAY секунд..."
sleep $RECONNECT_DELAY
if reconnect_ppp; then
echo "✅ VPN успешно переподключен"
# Даем время на установку
sleep 5
else
echo "❌ Не удалось переподключиться, следующая попытка через 30 секунд..."
sleep 30
fi
fi
done
И демона, который управляет этим файлом
cat /etc/systemd/system/sstp-vpn.service
[Unit]
Description=SSTP VPN Connection with SSH Preservation
After=network-online.target
Wants=network-online.target
[Service]
# Тип "simple" подходит, т.к. ваш скрипт выполняется в активном цикле (wait $SSTPC_PID)
Type=simple
# Скрипт выполняется с правами root
User=root
# Путь к вашему скрипту
ExecStart=/etc/sstp/sstp-connect.sh
# Перезапускать автоматически в случае обрыва соединения/сбоя скрипта
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
и теперь трафик до Google AI и OpenAI маршрутизируется через VPN
root@:~# systemctl start sstp-vpn
root@:~# systemctl status sstp-vpn
● sstp-vpn.service - SSTP VPN Connection with SSH Preservation
Loaded: loaded (/etc/systemd/system/sstp-vpn.service; enabled; preset: enabled)
Active: active (running) since Thu 2025-12-11 04:29:18 UTC; 23min ago
Main PID: 14237 (sstp-connect.sh)
Tasks: 6 (limit: 2274)
Memory: 3.7M (peak: 6.8M)
CPU: 1.218s
CGroup: /system.slice/sstp-vpn.service
├─14237 /bin/bash /etc/sstp/sstp-connect.sh
├─14593 /bin/bash /etc/sstp/sstp-connect.sh
├─14804 sstpc --cert-warn --user vpn --password xxxxxxxxxxxx nl-2.newvpn.io usepeerdns require-mschap-v2 noauth noipdefault refuse-eap noccp unit 1
├─14809 /dev/pts/1 38400 user vpn_alexfaq8_8465 file /tmp//sstp-pppd.mzjjbV usepeerdns require-mschap-v2 noauth noipdefault refuse-eap noccp unit 1
├─15270 sleep 300
└─15384 sleep 15
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: 🆕 Обнаружен новый IP: 142.250.185.138 (generativelanguage.googleapis.com) - добавляем в ipset
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: ✅ Добавлен 142.250.185.138
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: 🆕 Обнаружен новый IP: 142.250.185.202 (generativelanguage.googleapis.com) - добавляем в ipset
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: ✅ Добавлен 142.250.185.202
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: 🆕 Обнаружен новый IP: 142.251.141.106 (generativelanguage.googleapis.com) - добавляем в ipset
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: ✅ Добавлен 142.251.141.106
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: 🆕 Обнаружен новый IP: 142.250.184.202 (generativelanguage.googleapis.com) - добавляем в ipset
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: ✅ Добавлен 142.250.184.202
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: 🆕 Обнаружен новый IP: 142.250.185.234 (generativelanguage.googleapis.com) - добавляем в ipset
Dec 11 04:39:22 vps254609 sstp-connect.sh[14593]: ✅ Добавлен 142.250.185.234
Перед этим еще поставить пакеты
apt install sstp-client ipset