Что делаем? Настроим так чтобы на одном порту 443
висел и nginx с нашими сайтами и xray XTLS-Reality, который работает как прокси для авторизованных пользователей и притворяется валидным сайтом (в примере www.google.com) для всех остальных.
XTLS-Reality предназначен для защиты от выявления методом active probing. В отличие от старых протоколов (Shadowsocks, VMess, VLESS, и транспорта XTLS-Vision), определение “свой/чужой” здесь происходит на этапе TLS-хендшейка в момент чтения ClientHello. Если клиент опознан как “свой”, сервер работает как прокси, а если нет - TLS подключение передается на другой хост с TLS (например, google.com), и таким образом клиент (или цензор, желающий методом active probing проверить, что прячется на том конце) получит настоящий TLS-сертификат от google.com и настоящие данные с этого сервера.
Настройка Nginx
Nginx по sni будет определять имя сайта:
- если сайт из нашего домена - обработаем его как обычно
- если сайт не наш - перенаправим запрос в xray.
Имеет смысл спрятать
*.example.ru
за Сloudflare чтобы не обращаться к вашему домену по IP за которым якобы работает www.google.com, это может быть подозрительно.
Должен быть установлен модуль stream для nginx. Как это сделать смотрите инструкции для ваше дистрибутива.
В /etc/nginx/nginx.conf
добавляем:
stream {
include /etc/nginx/stream-enabled/*.conf;
}
Создаем /etc/nginx/stream-enabled/proxy.conf
map $ssl_preread_server_name $sni_name {
hostnames;
www.google.com xray;
example.ru www;
*.example.ru www;
default xray;
}
upstream xray {
server 127.0.0.1:8443;
}
upstream www {
server 127.0.0.1:7443https://github.com/XTLS/Xray-core/releases/;
}
server {
listen 443;
proxy_pass $sni_name;
ssl_preread on;
}
Для ваших сайтов в настройках Nginx поменяйте порт с 443
на 7443
.
Настройка Xray сервера
Скачиваем и распаковываем бинарник для Linux:
wget -c https://github.com/XTLS/Xray-core/releases/download/v1.8.3/Xray-linux-64.zip
unzip Xray-linux-64.zip -d /opt/xray
Последние релизы см тут https://github.com/XTLS/Xray-core/releases/
Создаем /etc/systemd/system/xray.service
:
[Unit]
Description=Xray Service
Documentation=https://github.com/xtls
After=network.target nss-lookup.target
[Service]
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/opt/xray/xray run -config /opt/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23
LimitNPROC=10000
LimitNOFILE=1000000
[Install]
WantedBy=multi-user.target
Включаем сервис:
systemctl enable xray
Создаем ключи
# ID клиента
/opt/xray/xray uuid
UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# приватный и публичные ключи сервера
/opt/xray/xray x25519
Private key: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Public key: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
# short ID
openssl rand -hex 8
aaaaaaabbbbbbb
/opt/xray/config.json
{
"log": {
"loglevel": "warning" // info для отладки
},
"routing": {
"rules": [],
"domainStrategy": "AsIs"
},
"inbounds": [
{
"listen": "0.0.0.0",
"port": 8443,
"protocol": "vless",
"tag": "vless_tls",
"settings": {
"clients": [
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // ID клиента
"email": "user1@myserver",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"show": false,
"dest": "www.google.com:443",
"xver": 0,
"serverNames": ["www.google.com"],
"privateKey": "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", // приватный ключ сервер
"minClientVer": "",
"maxClientVer": "",
"maxTimeDiff": 0,
"shortIds": ["aaaaaaabbbbbbb"] // short ID
}
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "quic"]
}
}
],
"outbounds": [
{
"protocol": "freedom",
"tag": "direct"
},
{
"protocol": "blackhole",
"tag": "block"
}
]
}
systemctl start xray
Настройка XRay клиента
Так же скачиваем и распаковываем клиент. Настраиваем config.json:
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"listen": "127.0.0.1",
"port": "1080",
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"],
"routeOnly": false
},
"settings": {
"auth": "noauth",
"udp": true
}
},
{
"listen": "127.0.0.1",
"port": "1081",
"protocol": "http"
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "123.44.55.67", //адрес сервера
"port": 443,
"users": [
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"email": "user1@myserver",
"flow": "xtls-rprx-vision",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"serverName": "www.google.com",
"publicKey": "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
"shortId": "aaaaaaabbbbbbb",
"fingerprint": "chrome"
}
},
"tag": "proxy"
},
{
"protocol": "freedom",
"tag": "direct"
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
}
]
}
}
./xray run -c ./config.json
После запуска xray на клиенте будет доступен socks прокси на порту 1080
и http на 1081
.
Для проверки на локальной машине можете добавить в /etc/hosts
:
123.44.55.67 www.google.com
Если все ОК и попытаться открыть www.google.com в браузере - вы должны через xray получить рабочий сайт google. Это то, что так же должен увидеть человек, который делает active probing вашего хоста.
Ссылки для автоматической настройки клиентов
Для быстрой настойки например мобильных клиентов можно подговорить ссылку со всеми параметрами подключения и импортировать её в клиенте.
Ссылка должна быть вида vless://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
@123.44.55.67:443
?security=reality&encryption=none&pbk=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
&headerType=none&fp=chrome
&type=tcp&flow=xtls-rprx-vision&sni=www.google.com
&sid=aaaaaaabbbbbbb
#vless
Ссылку можно конвертировать в QR и передавать другим пользователям.