Введение
Так как я любитель 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