VLESS Reality маскировка под собственный сайт

Помогите, не могу настроить маскировку под свой домен.
Делал все по инструкции из youtube(ссылку не буду оставлять, можно найти часовой ролик) c панелью 3x-ui

Установил панель 3x-ui
Привязал домен через duckdns
Получил сертификат в панели 3x-ui
Установил nginx
И вроде все как указано, но почему то не проходит тест URL, т.е. не работает ДНС запросы, ping тест проходит.
Конфиг Nginx просто добавил 127.0.0.1:8080

Извиняюсь, на вопрос не отвечу, но просто дам совет: я бы отказался от панелей, и подобного, если ВПН используется для себя или узкого круга друзей, например. Имхо, легче установить голый xray и настроить certbot для сертификатов. Если нужно будет, могу скинуть примеры конфигов nginx и xray.

Я с радостью приму любую помощь. Голый xray стоит, так что этот вариант мне подходит.

Знать бы еще, что сделано, а что нет. Примерно могу набросать, но там столько граблей может вылезти, что заранее не скажешь, да и потом особо не скажешь, не видя всей картины. Опять же, я тоже могу что-то забыть.

  1. Раз домен уже есть, значит далее понадобится сертификат. С панелью у меня опыта нет, может быть она его сама уже запросила, смотри в папку /etc/letsencrypt/live/<your domain>, там должны быть 4 файлика .pem, если есть - хорошо, если нет - ставь certbot и запрашивай certbot certonly --standalone --preferred-challenges http -d <your domain>. Не забудь открыть на время запроса 80 порт, не знаю, что ты там используешь, но для ufw, например, это будет ufw allow 80/tcp. Серт на 3 месяца, про обновление почитаешь сам.
  2. Настройка прав для xray.
    Лучше всего для него создать отдельного пользователя и группу для доступа к ключам
adduser xrayproc --system --no-create-home
groupadd -r letsencryptusers
usermod -g letsencryptusers xrayproc

Также изменение разрешений для чтения ключей

chown :letsencryptusers /etc/letsencrypt/live
chmod 750 /etc/letsencrypt/live
chown :letsencryptusers /etc/letsencrypt/live/<your domain>
# т.е. ключи - линки на файлы в archive
chown :letsencryptusers /etc/letsencrypt/archive
chmod 750 /etc/letsencrypt/archive

В общем не помню уже всех разрешений. Надо чтоб доступ у группы letsencryptusers был на чтение и исполнение всей цепочки папок, и на чтение файлов fullchain.pem и privkey.pem
3. Создать systemd юнит, положить в /usr/lib/systemd/system/xray.service.
Тут предполагается, что сам xray и его конфиг лежат в /opt/xray, есл инет - поправь на реальные.

[Unit]
Description=XRay Service
Documentation=https://github.com/xtls
After=network.target

[Service]
User=xrayproc
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/opt/xray/xray run -c /opt/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23
WorkingDirectory=/opt/xray
LimitNPROC=10000
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target

Применить изменения и активировать
systemctl daemon-reload
systemctl enable xray
Когда будет готов конфиг, можно и запускать
systemctl start xray
4. Пример куска конфига xray. Привожу пример инбаунда для reality с маскировкой под свой сайт. Это не полный конфиг. Прмеры полных конфигов можешь найти у людей выше.

xray
{
  "inbounds": [
    {
      "tag": "reality",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "email": "<some email>",
            "id": "<your UUID>",
            "flow": "xtls-rprx-vision",
            "level": 0
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
          "dest": "127.0.0.1:8445", // A website that support TLS1.3 and h2. You can also use `1.1.1.1:443` as dest
          "serverNames": [
            "<your domain>"    // A server name in the cert of dest site. If you use `1.1.1.1:443` as dest, then you can leave `serverNames` empty, it is a possible ways to bypass Iran's internet speed restrictions.
          ],
          "privateKey": "<your private key>", // run `xray x25519` to generate. Public and private keys need to be corresponding.
          "shortIds": [
            "<your short id>"
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      }
    }
  ]
}

Небольшое пояснение:
Сделать UUID /opt/xray/xray uuid
Сделать shortid openssl rand -base64 <key_size 16 или 32>
"dest": "127.0.0.1:8445" - фейковый сайт
5. Теперь понадобится… сам сайт.
В папке /etc/nginx/sites-available нужно создать файл, например mysite
В папке /var/www/<your domain>/html расположи файлы сайта.
Должно быть что-то вроде такого:

nginx

server {
listen 127.0.0.1:8445 ssl so_keepalive=on;
http2 on;

    ssl_certificate /etc/letsencrypt/live/<your domain>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<your domain>/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_stapling               on;
    ssl_stapling_verify        on;
    resolver                   1.1.1.1 valid=60s;
    resolver_timeout           2s;

    root /var/www/<your domain>/html;
    index Index.html;
    error_page 403 /403.html;
    error_page 401 /401.html;
    error_page 404 /404.html;
    error_page 400 405 413 500 502 503 504 /500.html;

    client_header_timeout 52w;
    keepalive_timeout 52w;

    server_name <your domain>;

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

}

Проверить, что конфиг без ошибок nginx -t
Сделать символьную ссылку на этот файл в папке /etc/nginx/sites-enabled
Ну и если все хорошо - перезапустить NGINX

@kranchik да, примерно как @xor написал. Только я с правами и подобным не заморачивался. У меня certbot (pip-версия), а xray установлен через xray-install – он сам устанавливает всё куда нужно, делает сервис, и так далее, и обновлять xray также можно. Возможно в systemd юните xray нужно изменить юзера, но это не точно, если и так будет работать, то и окей.

Вот пример конфига xray:

xray
{
  "log": {
    "loglevel": "warning"
  },
  "dns": {
    "servers": [
      "https+local://dns.google/dns-query",
      "https+local://1.1.1.1/dns-query"
    ],
    "queryStrategy": "UseIPv4",
    "tag": "dns-in"
  },
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "protocol": [
          "bittorrent"
        ],
        "outboundTag": "block"
      }
    ]
  },
  "inbounds": [
    {
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "",
            "flow": "xtls-rprx-vision",
            "level": 0,
            "email": ""
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "raw",
        "security": "reality",
        "realitySettings": {
          "fingerprint": "chrome",
          "dest": "3000",
          "serverNames": [
            ""
          ],
          "privateKey": "",
          "shortIds": [
            ""
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "routeOnly": true,
        "destOverride": [
          "http",
          "tls",
          "quic"
        ]
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIPv4"
      }
    },
    {
      "tag": "block",
      "protocol": "blackhole"
    }
  ]
}

Вот пример конфига nginx:

nginx
user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log notice;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 1024;
}

http {
	server {
		listen 80 default_server;
		listen [::]:80 default_server;
		server_name _;
		return 301 https://$host$request_uri;
	}

	server {
		listen 127.0.0.1:3000 ssl http2;
		server_name ДОМЕН;

		ssl_certificate /etc/letsencrypt/live/ДОМЕН/fullchain.pem;
		ssl_certificate_key /etc/letsencrypt/live/ДОМЕН/privkey.pem;

		ssl_protocols TLSv1.3;
		ssl_ecdh_curve X25519:secp384r1:secp521r1;

		ssl_stapling on;
		ssl_stapling_verify on;
		resolver 1.1.1.1 8.8.8.8 valid=300s;
		resolver_timeout 5s;
		
		add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

		location / {
			root /usr/share/nginx/html; 
			index index.html;
# т.е в /usr/share/nginx/html/index.html это просто HTML заглушка с какой-нибудь тематической билебердой, ну в общем всё от фантазии зависит
		}
	}
}
P.S

В иделае, перед установкой xray и всего такого, нужна базовая настройка VPS, так сказать. Поменять порт SSH, вход от рута по SSH запретить, пароль рута поменять, создать нового пользователя, включить BBR, разрешить вход только по ssh ключу, поменять dns в каком-нибудь /etc/resolv.conf (у меня бывало сбоил стандартный dns от хостера). Ну в общем это все тоже в интернете легко найти.

А какой вариант лучше?

  1. вебсервер на localhost:8443 допустим

  2. риалити берет сертфикат этого сайта

Вариант 2 ( и как его настроить??)

  1. на сервере реальный сайт\страничка доступная извне
  2. риалити берет сертификат этого сайта

Есть ли у кого на примете нормальные гайды по данной теме?

Спасибо!

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

Самый простой вариант - xray слушает на 443 порту, свой сайт на каком-нибудь localhost:8443. Если подключение “не правильное”, то оно просто перенаправляется на свой сайт, объявленный в поле dest при настройке сервера.
Еще есть вариант наоборот - принимает вебсервер, но если клиент стучится по определенному пути, то направляет в xray по протоколу ws или grpc.
Ну и наворачивать это дело можно дальше, например поставить реверс проксти и т.д.
Из статей - самые лучшие на эту тему:

Правда с российских адресов не доступны.
Ну и конечно же документация самого Xray, даже не русском есть!

спасибо

Т е localhost:8443?
Он же на локалхосте сидит. Как к нему доступ извне будет? Или я просто не очень понимаю )

Может быть и я плохо объясняю.
Есть кто-то, кто слушает на 443 порту на внешнем адресе. т.е. на <ip твоего сервера>:443. Это может быть xray, вебсервер или даже реверс прокси. Он получает входящее соединение и уже думает что с ним делать, например может отправить на внутренний localhost:8443. Т.е. На внутренний адрес попадаем через посредника.

Хороший пример конфигурации Xray с собственным сайтом на VPS: