Вопрос #1615922

Xray сервер с двумя белыми айпи — как перенаправить трафик? Есть VPS с двумя белыми айпи (к примеру, А и Б), и сервер Xray, который слушает входящие подключения на адресе А. Хотелось бы сделать так, чтобы все взаимодействия с внешний миром для пользователей Xray происходили с айпи Б. Есть такой-же рабочий сетап с OpenVPN, где всё работает через iptables, и хотелось бы знать правильный путь с случае с Xray.

Ответы
2


cvdsvsd

Кратко: проще всего — пометить пакеты/соединения, исходящие от процесса Xray, и направить их через отдельную таблицу маршрутизации с исходным адресом \(B\) или выполнить SNAT на \(B\). Рекомендованный и надёжный способ — policy routing по метке (fwmark). Ниже — варианты и примеры.
Подготовка
- Узнайте пользователя/UID, под которым работает Xray: например `id -u xray` (UID допустим \(1001\)).
- Узнайте интерфейс и шлюз провайдера: `ip route get 8.8.8.8` (получите и ).
- Убедитесь, что IP \(B\) назначен на интерфейсе.
Вариант A — policy routing (рекомендуется)
1) Помечаем пакеты, сгенерированные Xray:
iptables -t mangle -A OUTPUT -m owner --uid-owner xray -j MARK --set-mark 1
(если используете UID: `-m owner --uid-owner 1001`)
2) Сохраняем метку в conntrack (по желанию):
iptables -t mangle -A OUTPUT -m mark --mark 1 -j CONNMARK --save-mark
3) Добавляем правило и маршрут в отдельную таблицу (например таблица \(100\)):
ip rule add fwmark 1 table 100
ip route add default via dev src table 100
(заменить \, \, \ на реальные значения)
4) Отключите строгую RPF-проверку для интерфейса, чтобы пакеты с исходным адресом \(B\) не блокировались:
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf..rp_filter=0
Проверка: с клиента подключитесь к Xray и на сервере посмотрите внешний адрес соединений (например `curl --interface ifconfig.co` или лог на целевом ресурсе). В таблице \(100\) должен использоваться src = \(B\).
Вариант B — SNAT в nat (проще, если все исходящие соединения Xray — локальные)
iptables -t nat -A OUTPUT -m owner --uid-owner xray -j SNAT --to-source
Это заменит исходный адрес на \(B\) для локально создаваемых соединений Xray. Минус: менее гибко при прозрачной перехват-парадигме.
Особые случаи
- Если Xray использует прозрачный прокси (tproxy/REDIRECT) и трафик приходит через PREROUTING/FORWARD, то нужно помечать в mangle/PREROUTING и применять SNAT в POSTROUTING по connmark, либо использовать policy routing по fwmark на всех этапах.
- Для IPv6 нужен отдельный подход (ip -6 rule/route или ip6tables SNAT, если поддерживается).
Резюме
- Если Xray создаёт исходящие соединения как локальный процесс — используйте либо `iptables -t nat -A OUTPUT ... SNAT --to-source B` (быстро), либо лучше — маркировку + `ip rule` / `ip route` (надежнее, масштабируемее).
- Обязательно отключите/смягчите rp_filter для интерфейса.

Минимум 10 символов
Прямой эфир