Введение
Так как я любитель selfhosted, у меня есть домашняя инфраструктура:
-
Orange Pi — медиасервер;
-
Synology — файлопомойка;
-
Neptune 4 — 3д принтер с веб интерфейсом и видео с камеры.
И хотелось бы иметь безопасный доступ к ней снаружи через телефон и ПК, но при этом иметь выход в интернет не в РФ.
Раньше для этих нужд я использовал OpenVPN, но теперь на него полагаться не стоит. Поэтому я начал изучать документацию к отличному инструменту от китайских товарищей — Xray!
Что понадобится:
-
Сервер с внешним IP с инфраструктурой. У меня — Orange Pi, далее —
Bridge
-
Сервер, к которому хотим получить доступ —
Server
-
Сервер вне РФ для выхода в интернет. Далее —
Proxy
-
Клиент на ваш вкус. Далее —
Client
-
Клиент и сервер на Linux — Xray-core, который можно поставить через официальный скрипт установки Xray
-
Клиент на андроид — v2rayNG
Еще клиенты можно найти в репозитории Xray-core
За базу берем файл конфигурации VLESS-TCP-XTLS-Vision-REALITY и начинаем читать документацию к Xray
Маршрутизация происходит на клиенте. Если клиент обращается к домену xray.com
, например, то направляем траффик в Bridge
, а для всех остальных соединений — в Proxy
. Затем Bridge
направляет траффик к Server
, если клиент обращался к server.xray.com
.
Выглядит так:
Файл конфигурации xray расположен в
/usr/local/etc/xray/config.json
и после каждого изменения этого файла необходимо перезапускать службу черезsystemctl restart xray.service
Установка
-
Устанавливаем Xray на
Bridge
иProxy
:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
-
Открываем порт
443
наBridge
иProxy
. Например, черезufw
:
ufw allow 443
-
Генерируем ключи серверов на
Bridge
илиProxy
:
xray x25519
Приватный ключ заносится в файл конфигурации сервера xray, а публичный — конфиг клиента
-
Генерируем
UUID
на каждого клиента и придумываем емуshortId
:
xray uuid
UUID
иshortId
заносятся и в конфиги серверов, и клиентов
shortId
должен быть HEX числом не длиннее 16 символов и кратно 2 символам, напримерa0
,b1
,ff
-
Заносим приватный ключ,
UUID
,shortId
, хостнейм сервера, по которому будем обращаться в файл конфигурацииBridge
/usr/local/etc/xray/config.json
:
`/usr/local/etc/xray/config.json`
{ "log": { "loglevel": "debug" }, "inbounds": [Заносим в файл { "tag": "external", "port": 443, "protocol": "vless", "settings": { "clients": [ { "id": "client_uuid_0", // run `xray uuid` to generate "flow": "xtls-rprx-vision" }, { "id": "client_uuid_1", "flow": "xtls-rprx-vision" } ], "decryption": "none" }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "dest": "google.com:443", // You can also use `1.1.1.1:443` as dest "serverNames": [ "google.com" // 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": "bridge_privateKey", // run `xray x25519` to generate. Public and private keys need to be corresponding. "shortIds": [ // Required, list of shortIds available to clients, can be used to distinguish different clients "client_shortId_0", // If this item exists, client shortId can be empty "client_shortId_1", "0123456789abcdef" // 0 to f, length is a multiple of 2, maximum length is 16 ] } }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ], "routeOnly": true } } ], "outbounds": [ { "tag": "out", "protocol": "freedom" }, { "tag": "neptune4", "protocol": "freedom", "settings": { "redirect": "server_lan_ip:0" // Forward all traffic to web server } } ], "routing": { "rules": [ { "type": "field", "domain": [ "server.xray.com" ], "outboundTag": "server" } ] } }
-
Для
Proxy
все попроще — заносим приватный ключ,UUID
иshortId
:
спойлер
{ "log": { "loglevel": "debug" }, "inbounds": [ { "tag": "proxy", "port": 443, "protocol": "vless", "settings": { "clients": [ { "ывфыid": "client_uuid_0", // run `xray uuid` to generate "flow": "xtls-rprx-vision" }, { "id": "client_uuid_1", "flow": "xtls-rprx-vision" } ], "decryption": "none" }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "dest": "google.com:443", // You can also use `1.1.1.1:443` as dest "serverNames": [ "google.com" // 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": "proxy_privateKey", // run `xray x25519` to generate. Public and private keys need to be corresponding. "shortIds": [ // Required, list of shortIds available to clients, can be used to distinguish different clients "client_shortId_0", // If this item exists, client shortId can be empty "client_shortId_1", "0123456789abcdef" // 0 to f, length is a multiple of 2, maximum length is 16 ] } }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ], "routeOnly": true } } ], "outbounds": [ {Заносим в файл "protocol": "freedom", "tag": "direct" } ] }
-
Перезапускаем службу
xray
наBridge
иProxy
:
systemctl restart xray.service
Подключение клиентом
Файл конфигурации общий для всех клиентов.
Заносим в файл конфигурации UUID
, shortId
, hostname или ip Proxy
, Bridge
, а также домен, по которому будем перенаправлять траффик:
спойлер
{ "log": { "loglevel": "debug" }, "routing": { "rules": [ { "type": "field", "domain": [ "xray.com" ], "outboundTag": "bridge" } ] }, "inbounds": [ { "listen": "127.0.0.1", "port": 10808, "protocol": "socks", "settings": { "udp": true }, "sniffing": { "enabled": true, "destOverride": [Заносим в файл "http", "tls", "quic" ], "routeOnly": true } } ], "outbounds": [ { "protocol": "vless", "settings": { "vnext": [ { "address": "proxy_hostname_or_ip", "port": 443, "users": [ { "id": "client_uuid_0", // Needs to match server side "encryption": "none", "flow": "xtls-rprx-vision" } ] } ] }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "fingerprint": "chrome", "serverName": "google.com", // If your dest is `1.1.1.1:443`, then leave it empty "publicKey": "proxy_publicKey", // run `xray x25519` to generate. Public and private keys need to be corresponding. "spiderX": "", // If your dest is `1.1.1.1:443`, then you can fill it with `/dns-query/` or just leave it empty "shortId": "client_shortId_0" // Required } }, "tag": "proxy" }, { "protocol": "vless", "settings": { "vnext": [ { "address": "bridge_hostname_or_ip", "port": 443, "users": [ { "id": "client_uuid_0", // Needs to match server side "encryption": "none", "flow": "xtls-rprx-vision" } ] } ] }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "fingerprint": "chrome", "serverName": "google.com", // If your dest is `1.1.1.1:443`, then leave it empty "publicKey": "bridge_publicKey", // run `xray x25519` to generate. Public and private keys need to be corresponding. "spiderX": "", // If your dest is `1.1.1.1:443`, then you can fill it with `/dns-query/` or just leave it empty "shortId": "client_shortId_0" // Required } }, "tag": "bridge" } ] }
Linux
-
Устанавливаем Xray:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
-
Записываем файл конфигурации в
/usr/local/etc/xray/config.json
-
Перезапускаем службу:
systemctl restart xray.service
Теперь на клиенте запущен локальный socks5, к которому можно подключиться через браузер, например, в Firefox
Settings
->Network Settings
->Settings
->Manual proxy configuration
:
Socks Host: 127.0.0.1 Port: 10808
Устанавливаем флаг SOCKS v5
Android
-
Устанавливаем v2rayNG
-
Загружаем файл конфигурации на телефон
-
Добавляем файл конфигурации в приложении через
Custom config
->Import custom config from locally
-
Включаем
Выбрать, какие приложения пускать через xray, можно через
Settings
->VPN Settings
->Per-app proxy
Заключение
Теперь у нас есть доступ к своей инфраструктуре по доменному имени и нормальный интернет.
Бонусом:
Можно подключаться к Server
по ssh через xray. Одной строкой:
ssh root@server.xray.com -o "ProxyCommand=nc -X connect -x 127.0.0.1:10808 %h %p"
Или прописать в ~/.ssh/config
:
Host server Hostname server.xray.com User root ProxyCommand nc -X 5 -x 127.0.0.1:10808 %h %p ServerAliveInterval 10
ссылка на оригинал статьи https://habr.com/ru/articles/855754/
Добавить комментарий