LINUX.ORG.RU
ФорумAdmin

VPS и туннель как IP(v4/v6)-баунсер

 , ,


0

2

ЛОР, подумай за меня.

Это уже наверняка спрашивали много раз, и даже я скорее всего спрашивал раньше, но чё-т башка пухнет и думалка не работает, и ртфм в сторону LARTC я не осилю.

Дано:

  • VPS (A) с двумя IPv4 (A1, A2) и зароученным на неё IPv6-префиксом (назовём A3::/56);
  • роутер/шлюз (B) с OpenWrt и железка за ним (C).

Как мне прокинуть один IPv4 и один IPv6 в эту железку? Хочу, чтобы:

  1. все запросы на этот адрес уходили через условный WireGuard-туннель в железку;
  2. для некоторого подмножества софта наоборот (чтобы все запросы, которые инициирует этот софт, уходили с этих адресов);
  3. и, естественно, чтобы ответы на запросы уходили тем же маршрутом.

NB: софт из правила (2) и софт, в который будут приходить запросы согласно правилу (1) — не обязательно совпадают. Т. е. (3) должно работать независимо от всего остального. Т. е., наверное, нужна какая-то роутинг-магия, и вот на этом месте я забыл как надо делать.

Хочу гайд с точностью до абстрактных команд :)

★★★★★

Последнее исправление: intelfx (всего исправлений: 2)

Зависит от того, как именно вашей машине назначен IPv4 и IPv6 (либо диапазоном на интерфейсе, либо маршрутизируемым диапазоном), но рецепт усреднённый:

  1. Настроить IPv4+IPv6 адреса в конфигурационном файле WireGuard на сервере для пира;
  2. В OpenWrt настроить новое соединение WireGuard, в настройках интерфейса задать «Override IPv4 routing table» (ip4table) в 1000, аналогично для IPv6;
  3. Создать новое policy для IP-адреса вашей железки, указать ей ip4table 1000. Весь трафик будет направляться в туннель.

Самое простое, что можно сделать для разделения трафика: назначить железке 2 IP-адреса, для одного из которых создать policy wireguard, а для другого — нет. Выбор source ip в программах будет управлять маршрутом на маршрутизаторе.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

Зависит от того, как именно вашей машине назначен IPv4 и IPv6 (либо диапазоном на интерфейсе, либо маршрутизируемым диапазоном)

IPv6-префикс — routed, второй IPv4 — я так понимаю, что on-link.

Настроить IPv4+IPv6 адреса в конфигурационном файле WireGuard на сервере для пира;

На каком сервере? Какие IPv4+IPv6 адреса? Те, которые я хочу завернуть в туннель в конечном итоге (скажем, A2 и A3::1) или какие-то промежуточные? Ничего не понятно.

Самое простое, что можно сделать для разделения трафика: назначить железке 2 IP-адреса, для одного из которых создать policy wireguard, а для другого — нет. Выбор source ip в программах будет управлять маршрутом на маршрутизаторе.

В смысле, 2 внутренних IP-адреса из локальной подсети роутера B и железки C (назовём их C1 и C2)?

Интересный хак, но

  • что касается исходящих запросов, я не уверен, что интересующий меня серверный софт вообще так умеет;
  • что касается входящих запросов, это мне придётся дублировать все правила DNAT и вручную следить, чтобы правила DNAT из туннеля (т.е. с src=A2 или src=A3::1) уходили в этот второй внутренний адрес C2, иначе всё развалится. Это грязно. Не хочу так.
intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

На каком сервере?

У вас их два, разве?

Какие IPv4+IPv6 адреса? Те, которые я хочу завернуть в туннель в конечном итоге (скажем, A2 и A3::1) или какие-то промежуточные?

Те, которые хотите использовать.

В смысле, 2 внутренних IP-адреса из локальной подсети роутера B и железки C (назовём их C1 и C2)?

С внутренними будет проще, да. Тогда для VPN нужен NAT.

что касается исходящих запросов, я не уверен, что интересующий меня серверный софт вообще так умеет;

Можно настроить с помощью ip rule, он поддерживает UID’ы, например.

что касается входящих запросов, это мне придётся дублировать все правила DNAT и вручную следить, чтобы правила DNAT из туннеля (т.е. с src=A2 или src=A3::1) уходили в этот второй внутренний адрес C2, иначе всё развалится. Это грязно. Не хочу так.

Не понял вопроса. О каких правилах DNAT речь? Для вашей настройки NAT не нужен, но даже если вы его будете использовать, вроде никаких подобных проблем быть не должно. TCP-сокет же знает, с какого IP-адреса ему пришло соединение. Это наоборот нужно приложить усилия, чтобы ответить с другого адреса.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

У вас их два, разве?

Есть сервер-VPS (A), есть сервер физический, на котором крутится полезная нагрузка (C).

Не понял вопроса

А я не понял ответа.

О каких правилах DNAT речь? Для вашей настройки NAT не нужен, но даже если вы его будете использовать, вроде никаких подобных проблем быть не должно. TCP-сокет же знает, с какого IP-адреса ему пришло соединение. Это наоборот нужно приложить усилия, чтобы ответить с другого адреса.

О тех, которые настроены на роутере (B). Раньше публичный IPv4-адрес был присвоен внешнему интерфейсу роутера, и на нём есть пачка DNAT-правил, перенаправляющих интересующие запросы на сервер (aka port forwarding).

intelfx ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Так вы хотите после вашей настройки и принимать запросы на свеженастроенный адрес, и продолжать принимать запросы на старый провайдерский? Тогда либо NAT с трекингом соединений на оба адреса (в openwrt есть удобный пакет для настройки — mwan3), либо два внутренних IP-адреса с DNAT на каждый.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

Так вы хотите после вашей настройки и принимать запросы на свеженастроенный адрес, и продолжать принимать запросы на старый провайдерский?

У меня также есть внутренние клиенты, которые стучатся 1) на внутренний адрес сервера (C), и 2) на внутренний адрес роутера (B).

Точнее, как: есть клиенты внутри сети (B), которые будут стучаться на внешнее DNS-имя (которое будет ресолвиться в A2 и A3::1). Я очень сильно не хочу настраивать split DNS, но поскольку (A) в другой стране, видимо что придётся. Хотя я бы предпочёл вариант, при котором роутер (B) сам каким-либо образом отзывается на адреса A2 и A3::1 (изнутри) и дальше hairpin NAT.

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)