LINUX.ORG.RU
решено ФорумAdmin

Завернуть трафик по UDP-порту через отдельную сеть незаметно для программ

 , ,


0

2

Господа, пардон, не знаю даже какие доки курить и в какую сторону, новые для меня дебри. Предполагаю, что iptabels и nat нужен мне. Ситуация...

Сейча есть две машины, работают в одной подсети 10.a.b.* через свитч, на каждой машине по программе. Программы общаются исключительно по UDP, через несколько портов, все просто:

 _____________                                  _____________ 
|   Машина 1  |                                |   Машина 2  |
| программа 1 |                                | программа 2 |
|             |                                |             |
| IP 10.a.b.c |eth0                        eth0| IP 10.a.b.d |
|все UDP порты|<-----> тупо через свитч <----->|все UDP порты|
|в т.ч.на 8000|                                |в т.ч.на 8000|

Но тут встала задача. Нужно мне определенные особенные пакеты, которые уходят с Машины 1 на порт 8000 Машины 2 не слать напрямую, а перенаправлять на некий девайс с IP 172.16.k.m. (он подключен на eth1 Машины 1). Далее эти пакеты будут девайсом шифроваться, идти по каналу (даже я не знаю, что за канал физически), на другом конце расшифровываться другим девайсом таким же и попадать на Машину 2 уже с IP 172.16.x.y второго девайса (порты девайсы сохраняют сами при передаче):

 _____________                                  _____________ 
|   Машина 1  |                                |   Машина 2  |
| программа 1 |                                | программа 2 |
|             |                                |             |
| IP 10.a.b.c |eth0                        eth0| IP 10.a.b.d |
|все UDP порты|<-----> тупо через свитч <----->|все UDP порты|
|             |                                |             |
|             |                                |             |
|IP 172.16.k.l|eth1__________ ?? __________eth1|IP 172.16.x.z|
| пакеты на   |-->|девайс IP:|->|девайс IP:|-->| пакеты на   |
|UDP-порт 8000|   |172.16.k.m|  |172.16.x.y|   |UDP-порт 8000|

Сделать все необходимо без модификации программ, бубном Линуксоадмина. Т.е. на Машине 1 мне нужно правило, по которому UDP-пакеты, улетающие наружу к 10.a.b.d:8000 должны перенаправляться на 172.16.k.m:8000. На второй Машине пакеты, которые пришли от 172.16.x.y на локальный адрес 172.16.x.z:8000 должны модифицироваться так, как будто они пришли напрямую с первой Машины через обычный свитч на локальный адрес 10.a.b.d:8000.

★★

Если обе машины под вашим управлением, зачем городить такие костыли? Почему нельзя на м1 указать маршрут до 172.16.x.z через 172.16.k.m? А на м2 не повесить процесс на сокет 172.16.x.z:8000 ?

trancefer ★★ ()

Я не специалист. И проблемы не вижу, никакой.

man iptables man iptables-extensions

На 1-ой машине DNAT, на второй SNAT. IPsec нипричём кмк. Роутинг (ip route) - тоже. Д.б. элементарно.

Показывайте самостоятельные содержательные попытки решения.

the1 ()
Ответ на: комментарий от trancefer

А на м2 не повесить процесс на сокет 172.16.x.z:8000 ?

Программа начинает общение с 10.a.b.c и рассчитывает, что все остальные данные на все порты будут идти с этого же IP.
Такая сделана защита от случайных пакетов в сети. И программу модифицировать нельзя.
Весь траффик же завернуть через сеть 172.16.*.* также не представляется возможным, там — симплекс (односторонний канал).

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

На 1-ой машине DNAT, на второй SNAT.

Ок, спасиб, копну в сторону DNAT/SNAT.

Tayler ★★ ()

Нужно мне определенные особенные пакеты

так в чем их особенность вы знаете? Если по содержимому то у iptables есть модуль string

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

Нужно мне определенные особенные пакеты

так в чем их особенность вы знаете? Если по содержимому то у iptables есть модуль string

Знаю. А смысл? Известен же destination порт, это условие априори быстрей разбора содержимого.
У меня вопрос только как пакеты завернуть в подсеть без модификации программ.

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

Ааа, т.е. все пакеты на 8000-ый порт и являются условием? Тогда все верно написали snat+dnat, точнее наискосок вроде только dnat.

anc ★★★★★ ()
Последнее исправление: anc (всего исправлений: 2)
Ответ на: комментарий от Tayler

Зачем весь траффик, маркируете в iptables нужные пакеты и через ″ip rule″ отправляете через ваш 172.16.k.m. Но при этом эти устройства не должны менять src-адрес пакета, пусть он идёт по сети 172.16. но на адрес 10.a.b.d.

Если же вы на машине 2 будете получать пакеты для 172.16.x.z, то нужно будет делать DNAT на 10.a.b.d, и SNAT, чтобы ответный пакет шёл от 10.a.b.d, а не от 172.16.x.z. И, если этот канал нужно включать/выключать после установления соединения, то нужно будет удалять запись в conntrack.

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

Тут имхо и dnat хватит, т.е. с первого делаем dnat на 172.16.x.z на нем dnat с 172.16.x.z на 10.a.b.d, ну и в обратную сторону с 10.a.b.d на 172.16.k.l а с него на 10.a.b.c

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

с 10.a.b.d на 172.16.k.l а с

Весь траффик же завернуть через сеть 172.16.*.* также не представляется возможным, там — симплекс (односторонний канал).

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

Вы правы, а я нет, не внимательно посмотрел схему.

anc ★★★★★ ()

Заработало с SNAT/DNAT, спасибо всем за помощь!

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

Если же вы на машине 2 будете получать пакеты для 172.16.x.z, то нужно будет делать DNAT на 10.a.b.d, и SNAT, чтобы ответный пакет шёл от 10.a.b.d, а не от 172.16.x.z.

Да, именно так сделал. DNAT + SNAT на второй машине.

На первой хватило одного правила DNAT.

Tayler ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.