diff --git a/CDN.ru.md b/CDN.ru.md index fe15d73..f18164c 100644 --- a/CDN.ru.md +++ b/CDN.ru.md @@ -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-адрес вашего сервера может утечь к РКН, который добавит его в список блокируемых сайтов, доступ к серверу при этом пропадёт. Если же сервер работает через сеть доставки контента (content delivery diff --git a/README.ru.md b/README.ru.md index 3168eba..4d55bd9 100644 --- a/README.ru.md +++ b/README.ru.md @@ -27,6 +27,8 @@ VLESS-Reality) не шифрует уже зашифрованный https-тр #### Linux +_Краткая инструкция_ + Для начала нужно арендовать VPS сервер вне региона с цензурой (или попросить друзей за границей сделать это). После на сервер нужно установить [jq](https://jqlang.github.io/jq/) и `openssl` - их можно найти в репозиторияx практически всех популярных Linux дистрибутивов. Создайте обычного пользователя с возможностью выполнять sudo - не устанавливайте easy-xray из-под рута, в такой конфигурации он не будет @@ -45,8 +47,11 @@ sudo ./ex.sh install будет должным образом установлен, а xray - запущен с ним. Настало время раздать конфиги пользователям! Для многих графических клиентов удобно использовать конфиги в виде ссылок, которые можно сгенерировать командой `./ex.sh link user_config_file.json`. -Если у вашего VPS сервера есть два IP-адреса (IPv4 и IPv6), easy-xray может быть сконфигурирован так, чтобы IPv6-адрес -использовался для доступа через сеть CDN от Cloudflare по протоколу grpc-tls. См. детали в [инструкции](CDN.ru.md). +_Подробная инструкция, включая Cloudflare CDN_ + +Если у вашего VPS сервера есть два IP-адреса (IPv4 и IPv6), easy-xray может быть сконфигурирован так, чтобы IPv4-адрес использовался для +доступа напрямую, а IPv6-адрес использовался для доступа через сеть CDN от Cloudflare. Смотрите [полную +пошаговую инструкцию](CDN.ru.md). #### Docker diff --git a/misc/init0.sh b/misc/init0.sh new file mode 100755 index 0000000..939a86f --- /dev/null +++ b/misc/init0.sh @@ -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 diff --git a/misc/init1.sh b/misc/init1.sh new file mode 100755 index 0000000..9762fc1 --- /dev/null +++ b/misc/init1.sh @@ -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}. +" +