Не Стимдеком единым

Привет, первый мой пост тут - я не силён в графомании, так что прошу сильно ногами не бить :)

Введение

В моём окружении частенько появляются темы о том как кто-то заказал себе стримдек, делится опытом использования, какие аксессуары к нему прилепить и тд.
Естественно я заинтересовался концепцией данного агрегата — поэтому решил попробовать альтернативу в виде интерактивного видеопотока.

TLDR:
В посте опишу как настраивать свой VPN Wireguard для удалённого подключения к локальной сети с игровым ПК и стриминг с него.

Идея

Сразу скажу, что всё ниженаписанное применимо к весьма мощной системе — у вас имеется:

  • игровая видеокарта (уровня GTX 650 и выше);
  • «взрослый» процессор (уровня i3, r3);
  • 4Gb ОЗУ;
  • хорошее интернет соединение (стабильные 100 мбит);
  • роутер в качестве VPN-сервера;
  • соединение ПК с роутером по кабелю, либо сетью Wi-Fi 5-6;
  • мобильное устройство, телефон, планшет, ноутбук с поддержкой 4G, Wi-Fi 5-6;

В ином случае могут возникнуть проблемы.

Так же предполагаются небольшие траты (~150 руб/месяц).

Хотелки - я хочу играть в игры на любом устройстве, будь то смартфон, планшет, ноутбук, где бы я ни находился, при этом с минимальными тратами времени, денег и вот этого всего.

Есть ли решение? Конечно! Стриминговые сервисы (GFN и ещё какие-то другие) с радостью предоставят свои мощности за весьма скромные 13500 руб. в год (половина стоимости стримдеки).

Но что если у меня уже имеется хорошее железо? Будем делать собственный стриминговый сервис!

Поднимаем VPN
Поднимаем VPN

И тут я буду всё ооочень подробно объяснять - если вы и так всё знаете, можете смело пропускать шаги.

Реализация

Сломать что-то у вас вряд ли получится, но всё же скажу что автор не несёт никакой ответственности за проделанные вами действия.

1. Создание виртуальной локальной сети

Итак, поднимаем собственную VPN для того чтобы играть в любом месте где имеется доступ к сети интернет.
Сеть будем организовывать на протоколе Wireguard так как он обладает одним из лучших сочетаний скорости/пинга среди других протоколов.
Увы, у меня не имеется других роутеров кроме Keenetic (ещё есть очень старый Asus, но он совсем нЕмощный), поэтому буду делать инструкцию для него.
В принципе, плюс-минус логика на всех роутерах будет одинаковой.

Первым делом — у нас должен быть белый ip адрес. Обычно провайдер выделяет серый ip для своих клиентов, такой вариант нас не устраивает, он может меняться время от времени. У моего провайдера (Beeline) услуга белого ip стоит 150 рублей в месяц, подключается всё довольно быстро. В личном кабинете отображается ваш внешний ip адрес, его мы запоминаем, он нам пригодится в дальнейшем.

Выданный ip адрес выглядит как-то так.
Выданный ip адрес выглядит как-то так.

Настройка VPN-сервера

Роутер у нас будет выступать в качестве VPN-сервера.

  1. Удостоверимся что у роутера загружен компонент отвечающий за поднятие VPN:
    В админке роутера переходим по пути "Managment >> System settings >> Component options" в появившемся листе компонентов в разделе «Network functions» находим »Wireguard VPN», устанавливаем.
  2. Заходим в раздел меню "Internet >> Other connections", жамкаем кнопку "Add connection".
  3. Обзываем наше соединение.
  4. Генерируем пары ключей нажав на соответствующую кнопку.
  5. Сохраняем публичный ключ хоста.
  6. Вписываем ip-адрес хоста, это тот ip адрес на котором будет располагаться наш VPN-сервер (в диапазоне от 172.16.0.0, до 172.31.255.255) в виртуальной сети, например: 172.16.82.1/24.
  7. "Listen port" — можно и не вписывать, wireguard может обозначить его сам,, например: 16632.
  8. Добавим пира нажав на соответствующую кнопку.
  9. Тут мы его как-нибудь обзовём.
  10. Поле "Public key" пока оставим — оно важное, скоро к нему вернёмся.
  11. В поле "Allowed IPs" вписываем: 172.16.82.2/32
  12. «Persistent keepalive»: 15
  13. Теперь нужно скачать клиент wireguard на наше устройство, которое будем включать в сеть.

Настройка VPN-клиента

В качестве клиента выступает телефон на android, интерфейс приложения не отличается на iOS, так что шаги те же

  1. В приложении нажимаем на "+", выбираем пункт "Create form scratch" (сервер на роутере не генерирует qr-код, с быстрой настройкой, поэтому приходится делать всё вручную).
  2. Обзываем соединение.
  3. Генерируем пары ключей и запоминаем публичный ключ клиента.
    Помните то поле, которое не заполнили в настройках сервера? Вот туда и вписывается этот публичный ключ, скопируем и вставим его в это поле.
  4. Address — вписываем ip нашего клиента, если брали значения по примеру это будет 172.16.82.2/24.
  5. Добавляем пира — это будут настройки нашего подключения к серверу.
  6. Вставляем публичный ключ сервера.
  7. «Persistent keepalive»: 15
  8. «Endpoint» — тут то и пригодится наш публичный адрес вписываем его и через двоеточие — номер порта, в итоге получается что-то вроде: публичный_ip_адрес:16632
  9. «Allowed IPs» — тут мы прописываем адреса дозволенные к подключению, впишем, если придерживались примера: 172.16.82.1/32 и через запятую ip адрес локальной сети сервера, ну допустим 192.168.1.0/24

На клиенте и на сервере активируйте соединение — вы великолепны.

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

Настройка файрволла

  • Вкладка "Network rules>>Firewall>>Выбираем соединение которое мы создали (может быть скрыто в списке)".
  • Добавляем правило.
  • Вписываем описание — "AllAccess" назовём его так.
  • Action: Permit
  • Source IP, Destination IP: Any
  • Protocol: IP
  • Work schedule: Always on

Таким образом мы позволяем видеть устройства локальной сети виртуальной.

Важно!

  • Никому не распространяйте свой внешний IP, приватный и публичный ключи VPN! Если такое произошло - регенерируем ключи на VPN-сервере.
  • Задайте статический ip в локальной сети вашему игровому ПК — мы не хотим чтобы роутер гонял его по разным адресам.
    Делается это через «My networks and Wi-Fi>>Device lists«, находим в списке ваш ПК, регистрируем, в списках зарегистрированных девайсов опять же нажимаем на него, ставим галочку »Static IP» и вписываем IP адрес в вашей локальной сети.
    Допустим если у вас сеть в диапазоне 192.168.1.0/24 (веб интерфейс роутера по адресу 192.168.1.1), то ставим что-то вроде 192.168.1.10

2. Стриминг

Crypt of the NecroDancer - почему бы и нет?

Итак, у нас имеется доступ к VPN, имеется Steam и имеется приложение Steam Link — просто как два плюс два, подключаетесь к VPN, играйте.

В принципе, да, это всё, если вам этого достаточно — пользуйтесь, я всего лишь показал как настроить свой VPN с низкими задержками.

Но до недавнего времени я не знал что существует альтернатива в виде Sunshine.
Что это такое — это хост стим-сервиса, альтернатива недавно закрывшемуся Nvidia Gamestream, которая работает в том числе и на видеокартах AMD.

Moonlight — клиент данного хоста. Ещё в прошлом году можно было без проблем стримить на него игры через GeFroce Experience, но теперь это невозможно так как Nvidia, похоже, лавочку прикрыла.

Moonlight предлагает низкие задержки ввода, и более гибкую настройку видеопотока, нет привязки к Steam (но есть нюанс(ы)).

У Sunshine + Moonlight есть минусы:

  • Он не может применять оптимальные настройки игры (в том числе разрешение экрана), как это делает родной GeForce Experience или Steam Link.
  • В отличие от GeForce Experience в библиотеку Sunlight не попадают новые игры, их придётся заводить ручками, либо использовать инструмент импорта из GeForce Experience (у меня работает не корректно).
  • Интерфейс не такой красивый как у Steam Link.

Как немножко нивелировать эти минусы - да просто запускать через Moonlight интерфейс Steam BigPicture.

Установка Sunshine

Важно - программа представляет собой сервис, который будет постоянно работать на вашем ПК, его не видно через Автозагрузку Windows, но он стартует с каждым запуском системы.
Сервис не грузит систему, если не происходит стрима.

Если гора не идёт к Магомету, то Магомет идёт к горе

Тут всё просто, переходим на GitHub разработчика и скачиваем последний релиз сервиса.

Далее - устанавливаем в желаемую папку.

После установки нужно перейти по адресу

где можно найти настройки сервиса. В принципе настройки стриминга по-умолчанию нас устраивают.

Оставляем окно открытым, оно ещё понадобится.

Если папка Steam находится в каком-то нестандартном месте - нужно отредактировать файл по пути:
%папка установки Sunshine%>>config
Нам нужен файл apps.json, в котором редактируем объект "env":

"env": { "PATH": "$(PATH);D:\\Games\\Steam" }

Например, как у меня - папка Steam находится на диске D, в папке Games.

Как оказалось - для того, чтобы Sunshine воспринимал геймпад нужно установить ViGemBus:

Если у вас установлен GeForce Experience, в его настройках во вкладке SHIELD выключаем функцию GAMESTREAM (раньше через него работал Moonlight - теперь не работает).

Теперь в клиенте Moonlight должен появится наш ПК - если (скорее всего) он не нашёлся автоматически, вручную прописываем IP адрес до него в настройках приложения (кнопка + в правом верхнем углу).

После добавления ПК пытаемся к нему подключиться - нам покажут PIN-код.

Его мы вписываем во вкладке PIN настроек Sunshine:

Картинка для разбавления текста, вы бы и сами нашли что куда вписывать :)
Картинка для разбавления текста, вы бы и сами нашли что куда вписывать :)

Вуаля! Всё готово и в галвном окне приложения мы можем выбрать ПК-хост (их может быть несколько), а дальше - как мы будем его использовать, сразу запустим Steam Big Picture или ограничимся стримингом рабочего стола.

Выводы

Собственно, я добился того, чего хотел - у меня имеется своя VPN, в которой имеется игровой ПК для стриминга игр, а так же куча возможностей по наращиванию всяких сервисов в ней, вроде файлового сервера, медиа-сервера и тд.

Производительность DX11 версии Ведьмака, потому что DX12-ая начала крашиться (наверное последствия патча убирающего наготу).

Ниже приведу плюсы и минусы такого подхода:

Плюсы

  • Практически не зависишь от железа на клиенте
  • Универсальность клиента, на ноутбуке - поработаешь, с телефона - позвонишь и тд. в том же духе.
    Стимдек же - только для игр, я знаю что там можно запустить десктопную оболочку и, возможно, даже поработать, но лучше не стоит забредать в дебри линупса, если нет какой-то чёткой цели :)
  • Начинаешь больше разбираться в настройке сетей.

Минусы

  • Серьёзные требования к Интернет-соединению, как для хоста, так и клиента.
    На видео в статье я практически не использовал WiFi и играл через мобильную сеть, по причине того что WiFi 4 совсем не годится для данных дел.
  • Возможные задержки ввода, вот тут не знаю - все говорят, а я повторю. Если субъективно - если и задержка какая-то есть, то я её не ощущаю.
  • Необходимость иметь гейпад (через сенсорные кнопки играть - тот ещё мазохизм).
  • Во время стрима снижается производительность машины-хоста - там где хост вытягивал еле-еле 60 кадров, во время стрима будет около 40 (менее 20% производительности съедается стримом).
  • Невозможность пользоваться машиной-хостом во время стрима.
  • Хост должен постоянно находится включенным или быть в спящем режиме.
  • Система Sunshine + Moonlight всё ещё не идеальна, но дорабатывается.
Имеются какие-то проблемы со звуком - беда эмулятора, так его правильно и не настроил.

Что будет лучше для вас - решать вам, я же просто показал что есть альтернативный вариант "играть где угодно" :)

Возможно, я что-то мог упустить, так как писал это всё в несколько заходов.

77
9 комментариев

Есть же парсек

1

Увы, я его не щупал. У меня уже был настроен VPN для других нужд, поэтому решение локального стрима через Steam Link и Moonlight прям таки просилось.
Парсек, насколько я понял, использует сторонние сервера для работы с твоим стримом. Т.е. стрим с хоста улетает куда-то к ним на сервер, а затем прилетает на твой клиент - я подумал что незачем мне иметь в цепочке левые сервисы :)

Keenetic'и в этом плане впереди, всегда нравились, столько возможностей. (Микрот дает больше, но они как правило не нужны)

Кинетики у меня вытеснили все другие бренды, правда они довольно дорогие, как и другие качественные вещи, да)

Комментарий недоступен

Не совсем, я только показал как оно устроено на примере кинетика, на другом роутере компонент отвечающий за VPN может быть уже зашит (в старом Асусе так было).
А касаемо протокола Wireguard - там процесс настройки везде одинаковый будет :)