Маршрутизация · Linux · Qeli 0.8.1

Выход через отдельный exit node

Как направить интернет-трафик одних клиентов через физический WAN другого Linux-клиента, не превращая сервер Qeli в точку выхода.

Три роли

Потребитель → сервер → exit-клиент → интернет

Сервер пересылает пакеты между клиентами профиля. Exit-клиент принимает их из Qeli TUN, подменяет исходный адрес с помощью NAT и выпускает через свой физический WAN. Ответы возвращаются тем же путём.

РольКлючевая настройкаЗадача
Сервер Qelirouting.client_to_client=trueРазрешает пересылку между клиентами
Exit-клиентgateway=false + exit_node=trueВыпускает туннельный трафик в свой WAN
Клиент-потребительgateway=trueОтправляет публичный IPv4-трафик в Qeli
Не путайте с gateway_nat. gateway_nat заводит LAN за клиентом в туннель, а exit_node выводит трафик из туннеля в физический WAN клиента.
Минимальная схема

Настройки сервера и двух клиентов

Exit-узел должен быть отдельным Linux-клиентом. Он остаётся в split-tunnel, иначе собственный default route может зациклиться через Qeli.

/etc/qeli/server.conf · [profile:main]
routing.client_to_client = true
/etc/qeli/users.conf
# пользователь, под которым подключается exit-клиент
[user:exit]
profiles = main
client_subnet = 0.0.0.0/0

# обычный пользователь-потребитель; route=0/0 здесь не нужен
[user:consumer]
profiles = main
exit client · [qeli]
gateway = false
exit_node = true
consumer client · [qeli]
gateway = true
kill_switch = true
Не используйте server-push 0.0.0.0/0 как переключатель. Общий клиентский core фильтрует слишком широкие push-префиксы. Full-tunnel выбирается локальным gateway=true; client_subnet=0.0.0.0/0 у exit-пользователя решает другую задачу — регистрирует путь на сервере.
Нерабочее сочетание: при exit_node=true вместе с gateway=true Qeli пишет предупреждение, но продолжает запуск. WAN-путь при этом пропадает, поэтому forwarding не работает — исправьте конфиг до старта.
iptables

Что Qeli настраивает на exit-клиенте

При подключении Qeli автоматически включает forwarding, ослабляет reverse-path filtering на TUN/WAN и создаёт помеченные правила. WAN выбирается по default route с наименьшей метрикой; запасной способ — маршрут до 1.1.1.1.

СлойДействие
sysctlnet.ipv4.ip_forward=1, rp_filter=0 на TUN и WAN
mangleПомечает пакеты TUN → WAN
natПодмена исходного адреса (MASQUERADE) только для помеченных пакетов при выходе в WAN
filterРазрешает FORWARD в обе стороны и устанавливает TCPMSS clamp

Правила идемпотентны, сохраняются при переподключении и удаляются при штатной остановке клиента. Все они имеют комментарий qeli-exit-node.

После запуска

Проверка маршрута и NAT

journalctl -u qeli-client -b | grep 'Exit-node engaged'подтверждает активацию exit-режима
curl -s https://api.ipify.org ; echoна потребителе должен показать публичный IP exit-узла
sudo iptables -t nat -L POSTROUTING -v -n | grep MASQUERADEсчётчики должны расти при трафике потребителя
sudo iptables -t mangle -S | grep qeli-exit-nodeпоказывает правила маркировки
sudo iptables -S | grep qeli-exit-nodeпоказывает FORWARD и TCPMSS
После аварийного завершения

Удаляйте только правила с меткой Qeli

При crash процесс не успевает выполнить cleanup. Сначала выведите правила с комментарием qeli-exit-node, затем для каждой точной строки замените -A на -D и выполните её в той же таблице. Не очищайте цепочки целиком.

инвентаризация перед удалением
sudo iptables -t mangle -S | grep qeli-exit-node
sudo iptables -t nat -S | grep qeli-exit-node
sudo iptables -S | grep qeli-exit-node
Sysctl возвращайте осознанно. Ставьте net.ipv4.ip_forward=0 и прежнее значение rp_filter только если до Qeli они действительно были другими: узел может обслуживать и другие маршрутизаторы.
Границы режима

Платформа, стоимость и ответственность

Exit-платформаТолько Linux-клиент с iptables и правами на сеть; потребители могут быть любыми актуальными клиентами
ПутьДвойной сетевой переход повышает задержку и расходует канал сервера и exit-узла
Публичный IPВнешние сервисы видят адрес exit-узла; его владелец отвечает за выходящий трафик
Сам серверЕсли нужен выход через публичный IP сервера, используйте обычный full-tunnel и серверный NAT — exit_node не требуется
Первоисточники

Реализация и документация v0.8.1