Увеличиваем канал, но снижаем пинг. Часть 2

Увеличиваем канал, но снижаем пинг. Часть 2

Есть вариант ускорить интернет через туннель. Но тогда надо использовать не вебсокет, а grpc.

Я понимаю, что скорее всего и вебсокет был не очень понятен, а тут и еще одие протокол. Разница здесь в том, что наш xray-клиент начинает работать по более быстрому протоколу, который адаптирован под передачу данных.

В такой конфигурации мы можем получить прирост в скорости примерно на 10-20 процентов (это субъективные данные), но мы потеряем в пинге (опять же субъективно). Это проверялось вручную.

Для настройки потребуются еще дополнительные сервисы.

Cloudflare умеет проксировать (передавать) grpc только через внешний интернет и без своего собственного тоннеля. Обычно именно так и настраивают Cloudflare для того, чтобы показывать свои сайты в интернете. Тоннель дает ряд преимуществ, такие как возможность разместить VPN за роутером. Вообще не иметь собственный внешний адрес. С grpc такое не получится сделать. Но если нам надо просто настроить VPN для доступа с виртуальной машины, то этот способ тоже хорош.

Добавляем в наш default.conf дополнительную конфигурацию:

server {
    listen  0.0.0.0:443 ssl so_keepalive=on;
    http2 on;
    server_name {{ grpc_domain }};
    resolver 127.0.0.11;
    index index.html;
    root /var/www/html;

    client_header_timeout 52w;
    keepalive_timeout 52w;

    ssl_certificate /etc/letsencrypt/live/{{ grpc_domain }}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{{ grpc_domain }}/privkey.pem;

    location /grpc/Tun {
        if ($content_type !~ "application/grpc") {
            return 404;
        }
        grpc_set_header X-Real-IP $remote_addr;
        client_max_body_size 0;
        client_body_buffer_size 512k;
        client_body_timeout 1w;
        grpc_read_timeout 1w;
        grpc_send_timeout 1w;
        grpc_pass grpc://3x-ui:8888;
    }

    location / {
        try_files $uri $uri/ =404;
    }
}

{{ grpc_domain }} - меняем на наш grpc-домен. Это не должен быть тот же домен, который мы использовали в прошлой статье. Надо добавить перед доменом что-то. Например grpc.my-secret-domain.ru.

    ssl_certificate /etc/letsencrypt/live/{{ grpc_domain }}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{{ grpc_domain }}/privkey.pem;

Здесь тоже надо поменять на этот grpc домен ту часть с фигурными скобками.

Обратите внимание на то, что теперь у нас используются сертификаты. Это обязательно нужно и важно для проксирования grpc через Cloudflare. Он умеет проксировать только шифрованный трафик.

Для этого нам надо выписать собственный сертификат через Cloudflare.

Мы будем использовать Cloudflare для получения бесплатного сертификата. Заходим в Cloudflare, Websites, выбираем наш домен. Видим какие-то графики, справа внизу находим "Get your API Token":

Видим Global API Token. Нажимаем View. Вводим свой пароль от панели Cloudflare. Копируем токен.

На нашей виртуалки теперь создаем файлик cloudflare.ini с одной строчкой:

dns_cloudflare_api_token = наш_токен_из_cloudflare

Теперь получаем наш сертификат и сохраняем его на сервер. На виртуалке выполняем команду:

docker run --rm --name certbot -v /root/certbot_etc:/etc/letsencrypt -v /root/cloudflare.ini:/root/cloudflare.ini certbot/dns-cloudflare certonly --dns-cloudflare --dns-cloudflare-credentials /root/cloudflare.ini --dns-cloudflare-propagation-seconds 15 --email [email protected] --agree-tos --no-eff-email --force-renewal -d {{ grpc_domain }}

[email protected] - меняем на ваш email, с которым зарегались в Cloudflare.

{{ grpc_domain }} - меняем на наш домен с grpc (как было в примере типа grpc.my-secret-domain.ru)

Ждем. Сертификат получен. Теперь меняем наш docker-compose.yaml, чтобы проксировать grpc и дать возможность обращаться к нашей виртуалке напрямую. Это надо, чтобы Cloudflare направил к нам трафик:

---
version: "3"
services:
  3x-ui:
    image: ghcr.io/mhsanaei/3x-ui:latest
    container_name: 3x-ui
    hostname: 3x-ui
    ports:
      - "2053:2053"
    volumes:
      - $PWD/db/:/etc/x-ui/
    environment:
      XRAY_VMESS_AEAD_FORCED: "false"
    tty: true
    restart: unless-stopped
    networks:
      - my-network
  nginx:
    image: nginx:alpine
    container_name: nginx
    hostname: nginx
    ports:
      - "443:443"
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - ./certbot_etc:/etc/letsencrypt
    restart: unless-stopped
    networks:
      - my-network
  cloudflare-tunnel:
    image: cloudflare/cloudflared:latest
    container_name: cloudflare-tunnel
    hostname: cloudflare-tunnel
    command:
      - tunnel
      - --no-autoupdate
      - run
    environment:
      TUNNEL_TOKEN: {{ tunnel_token }}
    restart: unless-stopped
    networks:
      - my-network
networks:
  my-network:
     driver: bridge

Что было добавлено:

  1. Прокинута папка с сертификатом в nginx
  2. Открыт порт 443 от nginx наружу.

Теперь рестартим наши контейнеры:

docker compose down
docker compose up -d

Заходим в панель администрирования 3x-ui, которую мы настроили в предыдущей статье по нашему секретному адресу.

В предыдущем примере это был адрес https://my-secret-domain.ru/4UVM4fzVTnfVuEFe6mxl.

Добавляем новый inbound тем же способом, что в предыдущей статье, но применяем такие параметры:

Протокол: vless
Port: 8888
Transmission: gRPC
ServiceName: grpc

Не забываем нажать по меню с клиентом, чтобы создать первого клиента. ID клиентов будут отличаться от тех, что использовались в предыдущей настройке. Под каждый inbound создается разный ID.

Теперь надо настроить Clodflare для проксирования.

Заходим в панель Cloudflare. Заходим в Websites. Выбираем наш домен, далее нажимаем DNS и переходим в Records.

Там добавляем наш grpc domain для проксирования:

В IPv$ address вбиваем IP нашей виртуалки. Proxy status должен быть включен.

Теперь переходим в настройку SSL/TLS:

Справа видим настройку нашего домена. Нажимаем кнопку Configure справа

Тут ставим настройку в Full. Это очень важно, иначе проксирование не заработает:

Сохраняем. Дальше настраиваем наш nekoray для работы по grpc:

Сервер указываем с grpc. Например grpc.my-secret-domain.ru
Порт: 443
Логин: ID нашего клиента, который мы создали для этого Inbound
Кодирование пакетов: xudp
Сеть: grpc
Шифрование транспортного уровня: tls

Далее листаем вниз и находим uTLS Fingerprint. Там ставим любой популярный браузер, например chrome:

Сохраняем. Выбираем новый профиль, запускаем. Должно работать.

Опять для провайдера мы идем на Cloudflare, но по факту все видят адрес нашей виртуалки в другой стране.