Увеличиваем канал, но снижаем пинг. Часть 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
Что было добавлено:
- Прокинута папка с сертификатом в nginx
- Открыт порт 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, но по факту все видят адрес нашей виртуалки в другой стране.