add text about CDN

This commit is contained in:
Evgeny Nerush 2024-11-05 14:36:20 +03:00
parent d128adb290
commit 6c0478b8b5
4 changed files with 176 additions and 3 deletions

View file

@ -1,4 +1,49 @@
#### Дополнительный канал связи #### Первоначальная настройка VPS
Xray нельзя поставить на "голый" сервер - нужна предварительная подготовка. Нужно создать пользователя, добавить его в группу sudo,
настроить фаервол и перенести порт ssh. Эти действия можно автоматизировать. Для redhat-based дистрибутивов можно использовать
скрипты [init0.sh](misc/init0.sh) и [init1.sh](misc/init1.sh). Скопируйте их на сервер
```
curl -L https://github.com/EvgenyNerush/easy-xray/blob/test/misc/init0.sh
curl -L https://github.com/EvgenyNerush/easy-xray/blob/test/misc/init1.sh
```
затем внимательно прочитайте и исправьте по необходимости, и запустите от рута. После нужно зайти в систему от имени нового пользователя и
подготовить необходимые файлы для Cloudflare CDN - если она нужна.
#### Cloudflare CDN
Помимо прямого доступа (для которого достаточно одного IPv4-адреса), можно настроить доступ через сеть доставки контента (content delivery
networn, CDN) от Cloudflare. В этом случае проксировать трафик через xray, даже если IP-адрес вашего сервера заблокирован.
Для настройки прокси через CDN нужно:
- завести бесплатный аккаунт на [cloudflare.com](https://www.cloudflare.com/),
- оплатить серверу второй IP-адрес (IPv6 подойдёт, они обычно дешевле),
- купить доменное имя (наподобие example.com, не важно, где вы его купите).
Доменное имя отдаётся под управление Cloudflare (Websites -> Add a domain), затем
добавляется IPv6-адрес вашего сервера (в разделе Websites дважды кликните на доменное имя, перейдите в DNS/Records и нажмите Add a record).
Для IPv6 адреса создавайте запись типа AAAA, если для доменного имени example.com создать запись с именем name, то name.example.com будет
вести на указанный вами IPv6-адрес.
![cloudflare, раздел DNS/Records](figs/cloudflare-records.png)
В настройках Network нужно включить поддержку gRPC - именно этот протокол позволит использовать xray через CDN. На странице SSL/TLS/Origin
Server создайте сертификаты для связи вашего сервера с сетью CDN (файлы `cert.pem` и `cert.key`). **До запуска установки xray** скопируйте
ваши сертификаты Cloudflare в директорию со скриптом `ex.sh`!
Как работает доступ через CDN? Сети доставки контента задуманы для кеширования больших файлов: если большому числу пользователей в России
хочется посмотреть одно и то же видео с котятами, которое есть на сервере в США, гораздо выгоднее один раз скачать это видео на сервер в
России (кеш), и отдавать пользователям с него, чем много раз скачивать его из США. Нам ничего кешировать не нужно, мы просто пользуемся
возможностью бесплатно доставлять трафик через сервера Cloudflare. Важно, что в такой схеме ваше доменное имя резолвится в IP-адрес сервера
Cloudflare, через который может идти трафик большого количества других сайтов. Поэтому РКН, оценивая сопутствующий ущерб, может не решиться
на блокировку вашего xray сервера, даже если будет о нём знать. Чтобы лучше понять общую концепцию работы xray через CDN, прочитайте [вот
эту статью](https://habr.com/ru/articles/761798/).
Если вы делитесь доступом к своему серверу с другими людьми, рано или поздно IP-адрес вашего сервера может утечь к РКН, который добавит его Если вы делитесь доступом к своему серверу с другими людьми, рано или поздно IP-адрес вашего сервера может утечь к РКН, который добавит его
в список блокируемых сайтов, доступ к серверу при этом пропадёт. Если же сервер работает через сеть доставки контента (content delivery в список блокируемых сайтов, доступ к серверу при этом пропадёт. Если же сервер работает через сеть доставки контента (content delivery

View file

@ -27,6 +27,8 @@ VLESS-Reality) не шифрует уже зашифрованный https-тр
#### Linux #### Linux
_Краткая инструкция_
Для начала нужно арендовать VPS сервер вне региона с цензурой (или попросить друзей за границей сделать это). После на сервер нужно Для начала нужно арендовать VPS сервер вне региона с цензурой (или попросить друзей за границей сделать это). После на сервер нужно
установить [jq](https://jqlang.github.io/jq/) и `openssl` - их можно найти в репозиторияx практически всех популярных Linux дистрибутивов. установить [jq](https://jqlang.github.io/jq/) и `openssl` - их можно найти в репозиторияx практически всех популярных Linux дистрибутивов.
Создайте обычного пользователя с возможностью выполнять sudo - не устанавливайте easy-xray из-под рута, в такой конфигурации он не будет Создайте обычного пользователя с возможностью выполнять sudo - не устанавливайте easy-xray из-под рута, в такой конфигурации он не будет
@ -45,8 +47,11 @@ sudo ./ex.sh install
будет должным образом установлен, а xray - запущен с ним. Настало время раздать конфиги пользователям! Для многих графических клиентов будет должным образом установлен, а xray - запущен с ним. Настало время раздать конфиги пользователям! Для многих графических клиентов
удобно использовать конфиги в виде ссылок, которые можно сгенерировать командой `./ex.sh link user_config_file.json`. удобно использовать конфиги в виде ссылок, которые можно сгенерировать командой `./ex.sh link user_config_file.json`.
Если у вашего VPS сервера есть два IP-адреса (IPv4 и IPv6), easy-xray может быть сконфигурирован так, чтобы IPv6-адрес одробная инструкция, включая Cloudflare CDN_
использовался для доступа через сеть CDN от Cloudflare по протоколу grpc-tls. См. детали в [инструкции](CDN.ru.md).
Если у вашего VPS сервера есть два IP-адреса (IPv4 и IPv6), easy-xray может быть сконфигурирован так, чтобы IPv4-адрес использовался для
доступа напрямую, а IPv6-адрес использовался для доступа через сеть CDN от Cloudflare. Смотрите [полную
пошаговую инструкцию](CDN.ru.md).
#### Docker #### Docker

16
misc/init0.sh Executable file
View file

@ -0,0 +1,16 @@
echo -e "Read carefully throughout this script and correct it for your needs.
Then run it as root. Are you ready? (y/N)"
read ready
# default answer: answer not set or it's first letter is not `y` or `Y`
if [ -v $ready ] || ([ ${ready::1} != "y" ] && [ ${ready::1} != "Y" ])
then
exit 1
fi
dnf update --assumeyes
# - vim is a cool text editor
# - iproute is needed for `ss` command, to see which ports are already in use
# - you need podman if plan to use Cloudflare CDN
# - jq and openssl are needed for easy-xray
dnf install --assumeyes podman openssl jq vim iproute

107
misc/init1.sh Executable file
View file

@ -0,0 +1,107 @@
echo -e "Read carefully throughout this script and correct it for your needs.
Then run it as root. Are you ready? (y/N)"
read ready
# default answer: answer not set or it's first letter is not `y` or `Y`
if [ -v $ready ] || ([ ${ready::1} != "y" ] && [ ${ready::1} != "Y" ])
then
exit 1
fi
## Add user to system ##
echo -e "Enter username if you want to create new user or
add existing user to 'wheel' group; enter nothing to skip"
read username
if [ ! -v $username ]
then
if ! getent passwd $username >/dev/null # user doesn't exist yet
then
useradd -m $username
password=$(openssl rand -base64 9)
echo -e "password\npassword" | passwd $username --stdin
fi
# if wheel group exists, add the user to it
if getent group wheel > /dev/null
then
usermod -aG wheel $username
else
no_wheel=true
fi
fi
## Configure ssh ##
echo -e "Enter new ssh port (> 1024 and < 65535)"
read port
if [ ! -v $port ]
then
if ss -tunlp | grep :${port} > /dev/null
then
echo -e "port ${port} is already in use, aborting"
exit 1
else
ssh_port=$port
# sometimes port 22 is already commented in config,
# but 22 port can be needed if new port is not available
echo "Port 22" | tee -a /etc/ssh/sshd_config
echo "Port ${port}" | tee -a /etc/ssh/sshd_config
sshd -t && systemctl restart sshd
fi
else
echo -e "sshPort not set, aborting"
exit 1
fi
## Configure firewall ##
if [ $(command -v firewall-cmd > /dev/null) ] && [ $(firewall-cmd --state) = "running" ]
then
firewall-cmd --list-all
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=${ssh_port}/tcp
firewall-cmd --reload
fi
## Configure SELinux ##
command -v semanage > /dev/null && semanage port -a -t ssh_port_t -p tcp ${ssh_port}
## for podman ##
# allow user apps (including podman) use ports from 80 and above
echo "net.ipv4.ip_unprivileged_port_start=80" > /etc/sysctl.d/unprivileged-ports.conf
sysctl --system
if [ -v $username ]
then
echo -e "Enter username for which to enable long-running services"
read username
fi
# allow non-logged user to run long-running services, such as podman container
if [ ! -v $username ]
then
loginctl enable-linger $username
else
echo -e "username not set, aborting"
exit 1
fi
## Summary ##
echo -e "
---- Summary ----
"
if [ ! -v $password ]
then
echo -e "New user ${username} is created with password:
${password}
don't forget to change it with
passwd ${username}
"
fi
echo -e "Check that ssh is available at port ${ssh_port} then close
port 22 commenting line(s)
Port 22
in /etc/ssh/sshd_config and running
systemctl restart sshd
"
echo -e "Then you are ready to log out from the server, then log in as ${username}
with new ssh port ${ssh_port}.
"