# easy-xray

*XRay - это просто*

[(EN)](README.md) [(CN(todo))](README.cn.md)

[XRay (aka ProjectX)](https://xtls.github.io/en/) - современное решение для обхода интернет-цензуры. Он - как прокси - позволяет проводить
трафик через сервер (VPS) за пределами региона с цензурой, при этом подключение к серверу XRay выглядит как подключение к обычному сайту.
Попытки обнаружения VPN, такие как активное зондирование [(active probing)](https://ensa.fi/active-probing/) или блокировка по правилу
«блокируем все протоколы, кроме https», для XRay не страшны. Кроме того, сервер XRay можно настроить на открытие только "зарубежных"
веб-сайтов, что предотвращает попытки обнаружения туннеля сайтами "домашнего" региона.  XRay (в случае использования протокола
VLESS-Reality) не шифрует уже зашифрованный https-трафик, поэтому нагрузка на процессор невелика. XRay не нужно поддерживать соединение, и
пользователям не нужно время от времени повторно подключаться к нему вручную. При правильной настройке клиента пользователям не нужно
отключаться от сервера, чтобы перейти на большинство веб-сайтов "домашнего" региона.

![схема: трафик до зарубежных сайтов идёт через сервер, а до домашних сайтов - напрямую с ПК](figs/xray-schematic.png)

Помимо плюсов, у XRay есть и недостатки - например, сложная настройка и администрирование, что стало мотивацией для создания этого
репозитория и скрипта `ex.sh`. Этот скрипт поможет

- установить/обновить/удалить XRay
- генерировать учетные данные и конфигурации сервера/клиента
- добавлять/удалять пользователей
- и т. д.

### Как использовать на VPS

#### Linux

Для начала нужно арендовать VPS сервер вне региона с цензурой (или попросить друзей за границей сделать это). После на сервер нужно
установить [jq](https://jqlang.github.io/jq/) и `openssl` - их можно найти в репозиторияx практически всех популярных Linux дистрибутивов.
Создайте обычного пользователя с возможностью выполнять sudo - не устанавливайте easy-xray из-под рута, в такой конфигурации он не будет
работать!  Из-под обычного пользователя скачайте `easy-xray` (всю директорию целиком), сделайте исполняемым файл `ex.sh` и запустите нужную
команду. Используйте `./ex.sh help` для получения списка всех команд и короткой справки по ним. Для установки и настройки xray используйте
`./ex.sh install` - эта команда предложит вам ввести ip-адрес вашего сервера, адрес сайта, под который ваш сервер будет маскироваться, и
имена пользователей. Не используйте easy-xray для пользователя root, используйте обычного пользователя и sudo!

```
chmod +x ex.sh
./ex.sh help
sudo ./ex.sh install
```

В результате у вас появится директория `conf` с серверным конфигом, основным клиентским конфигом и конфигами пользователей. Серверный конфиг
будет должным образом установлен, а xray - запущен с ним. Настало время раздать конфиги пользователям! Для многих графических клиентов
удобно использовать конфиги в виде ссылок, которые можно сгенерировать командой `./ex.sh link user_config_file.json`.

Если у вашего VPS сервера есть два IP-адреса (IPv4 и IPv6), easy-xray может быть сконфигурирован так, чтобы IPv6-адрес
использовался для доступа через сеть CDN от Cloudflare по протоколу grpc-tls. См. детали в [инструкции](CDN.ru.md).


#### Docker

Скрипт `ex.sh` написан прежде всего для использования в системе с systemd, однако может быть использован и в Docker. Для этого скачайте
директорию `easy-xray` (из ветки main) и соберите образ Docker, используя файл `Dockerfile`; ключ -t задаёт тег, например
`ximage`:

```
curl -L https://codeload.github.com/EvgenyNerush/easy-xray/tar.gz/main | tar -xz
cd easy-xray-main # обратите внимание на `-main` !!
docker build -t ximage ./
```

Обычно пользовательские приложения не могут использовать порты ниже 1024, однако для того, чтобы замаскировать xray сервер под обычный
вебсайт, мы должны использовать порты 80 и 443. Поэтому для начала на хосте нужно разрешить пользовательским приложениям использовать порты,
начиная с 80-го (эту команду, возможно, придётся выполнять после каждой перезагрузки системы):

```
sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80
```

Также нужно разрешить не-залогиненному пользователю выполнять долгоживущие сервисы. Иначе после выхода пользователя с сервера контейнер
может перестать работать:

```
sudo loginctl enable-linger your_username
```

Теперь можно запустить docker контейнер в интерактивном режиме (флаги `-i -t`), пробрасывая порты 80 и 443 от хоста к контейнеру:

```
docker run -it --name xcontainer -p 80:80 -p 443:443 ximage
```

В интерактивном режиме можно установить и сконфигурировать xray так же, как и в обычной системе, кроме последнего шага - копировать
серверный конфиг в директорию xray и перезапускать xray через systemctl нет смысла. Сообщения об отсутствии systemd можно
просто проигнорировать. Xray можно запустить с серверным конфигом вручную:

```
./ex.sh install
xray -c conf/config_server.json
```

После запуска xray можно отсоединиться от контейнера, используя *Ctrl+p затем Ctrl+q*. Если нужно снова присоединиться к контейнеру, можно
использовать `docker attach xcontainer` (после этого нужно нажать *Ctrl+c*, чтобы завершить работающий xray), или можно воспользоваться
командой `docker exec -it xcontainer bash` для запуска ещё одной сессии. Для того, чтобы скопировать конфиг-файлы из контейнера на хост,
сначала нужно узнать Id контейнера:

```
docker ps -a
docker cp 123abc456def:/easy-xray/conf ./
```

Команду `./ex.sh link conf_file` можно использовать на любом компьютере с Linux, если на нём хранятся конфиг-файлы. Работающий xray для этой
команды не нужен.

### Клиенты

#### Linux

Для подключения к XRay-серверу существуют клиенты с графическим интерфейсом (Nekoray, v2rayA,..), но о них чуть позже. На Linux удобно
использовать сам XRay в качестве клиента.  XRay можно установить вручную, используя [официальный
скрипт](https://github.com/XTLS/Xray-install), после чего скопировать `customgeo.dat` в `/usr/local/share/xray/`. Другой вариант установить
XRay и `customgeo.dat` - воспользоваться командой `sudo ./ex.sh install`. Затем нужно скопировать клиентский конфиг с сервера и выполнить

```
sudo cp config_client_username.json /usr/local/etc/xray/config.json
sudo systemctl start xray
```

или

```
sudo xray run -c config_client_username.json
```

XRay с текущим клиентским конфигом создаёт локальные http/https и socks5 прокси, которые могут быть прописаны в настройки Телеграма или
браузера примерно так:

![прокси в браузере: http/https прокси 127.0.0.1 порт 801, socks5 хост 127.0.0.1 порт 800](figs/browser-proxy-settings.png)

Чтобы проверить, что трафик до "зарубежных" и "домашних" сайтов идёт разными путями, зайдите на
[whatismyip.com](https://www.whatismyip.com/) и [2ip.ru](https://2ip.ru/). Они должны показать разные ip-адреса и локации.

#### Windows

На Windows обычно используют клиенты с графическим интерфейсом - *v2rayN*, *v2rayA* и *nekoray (nekobox)*. Инструкции для них доступны по
ссылкам:

[v2rayN](V2RayN.ru.md)

[v2rayA](V2RayA.ru.md)

[nekoray](Nekoray.ru.md).

#### MacOS

Используйте сам XRay:

```
brew install xray
cp customgeo.dat /usr/local/share/xray/ # not yet tested
sudo xray -config=config_client_username.json
```

Достаточно удобно использовать xray в качестве системного прокси. Примеры включения и выключения socks proxy:

```
# включение, подразумеваем что название подключения дефолтное (wi-fi)
networksetup -setsocksfirewallproxy wi-fi localhost 800
networksetup -setsocksfirewallproxystate wi-fi on

# отключение
networksetup -setsocksfirewallproxystate wi-fi off
```

Системный прокси используется по умолчанию большинством приложений: браузерами, VSCode, мессенджерами типа Slack или Telegram. Если приватность является наивысшим приоритетом, необходимо проверять, поддерживает ли системный прокси каждое приложение, так как некоторые специфичные приложения могут его игнорировать. Важное преимущество подключения через системный прокси - это возможность комбинировать Xray с другими VPN. Если указать ресурсы, доступные через VPN, в исключениях xray (`"outboundTag": "direct"`), то подключение к ним будет обходить Xray и проходить через подключенный VPN-туннель.

В качестве альтернативы можно использовать *v2rayA*. Это приложение имеет веб интерфейс, доступный в браузере по адресу localhost:2017.
Детальные инструкции для v2rayA можно найти [здесь](V2RayA.ru.md).

#### Android

Для многих мобильных клиентов вся настройка заключается в том, что нужно вставить конфиг-ссылку из буфера обмена, а после добавить сайты из
customgeo в подходящей форме (см. директорию `misc`) в "прямые" маршруты (в `Settings/Routing/Custom rules/Direct URL` или что-то подобное).
Приложения, которые были протестированы, перечислены ниже.

Скачайте из Google Play [V2RayNG](https://play.google.com/store/apps/details?id=com.v2ray.ang&pcampaignid=web_share),
[HiddifyNG](https://play.google.com/store/apps/details?id=ang.hiddify.com&pcampaignid=web_share) или [Hiddify
Next](https://play.google.com/store/apps/details?id=app.hiddify.com&pcampaignid=web_share). Они очень похожи друг на друга, здесь есть
инструкции для [V2RayNG](V2RayNG.ru.md) и [HiddifyNG (EN)](HiddifyNG.en.md).

#### iOS

Используйте [Streisand](https://apps.apple.com/us/app/streisand/id6450534064). Конфигурирование аналогично тому, что описано для V2Ray или
Hiddify, здесь [инструкция для Streisand](Streisand.ru.md).

#### OpenWRT

Используйте *v2rayA*. Инструкция [здесь](V2RayA.ru.md).

#### Другие

[Здесь](https://github.com/xtls/xray-core) можно найти дополнительный список клиентов.

### Tor

В случае использования XRay в качестве клиента с текущей конфигурацией не должно возникнуть проблем. Однако большинство графических
клиентов, хотя в качестве ядра используют xray, не дают полного доступа к его конфигурации. Из-за этого
[Torbrowser](https://www.torproject.org/download/) не всегда может работать "из коробки". Если подключиться к сети Tor не удаётся,
попробуйте использовать встроенный в Торбраузер obfs4 мост (специальный промежуточный сервер между вами и сетью Tor) - его можно найти в
разделе Настройки/Соединение.

### Bittorrent

Bittorent протокол блокируется в текущих настройках - использование bittorrent может привести к бану со стороны VPS провайдера.

### Что ещё?

#### Советы

Для того, чтобы выбрать сайт, который будет видеть на вашем сервере цензор в случае атаки active probing (`serverName` в конфигах), можно
воспользоваться утилитой [RealiTLScanner](https://github.com/XTLS/RealiTLScanner). Она может просканировать адреса, близкие к вашему серверу
(делайте это с домашнего компьютера, а не с сервера!), и показать имена сайтов на них. С помощью команды `nmap -T4 hostname` можно
проверить, что на выбранном вами сервере открыты только порты 80 и 443 (как в настройках xray здесь). Также неплохо выбрать далёкий порт для
ssh вместо 22-го, если на выбранном вами сайте этот порт не открыт. Дважды проверьте, что по выбранному вами порту ssh вы можете зайти на
сервер - только после этого закрывайте порт 22.

```
#Port 22
Port 43210
```

#### Ссылки

Шаблонные конфиг-файлы для сервера и клиента (`template_config_*.json`) содержат много комментариев, которые могут помочь в создании своей
собственной конфигурации клиента и сервера.

Шаблонные конфиги сделаны на основе этих [двух](https://github.com/XTLS/Xray-examples/tree/main/VLESS-gRPC-REALITY) [примеров](https://github.com/XTLS/Xray-examples/tree/main/VLESS-TCP-XTLS-Vision-REALITY).

[Описание всех возможных полей XRay конфигов (EN)](https://xtls.github.io/en/config/) очень подробное и хорошо помогает.

[Здесь](https://github.com/EvgenyNerush/coherence-grabber) детали того, как собраны сайты для доступа напрямую, прописанные в `customgeo`.

[Эта статья](https://habr.com/ru/articles/731608/) помогла мне установить XRay в первый раз.

[Чат проекта](https://t.me/eXRay_chat) в Телеграм.

