Введение
Так как я любитель 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/
Добавить комментарий