Пересылка UDP пакета из одной сети в другую
От: AlexGin Беларусь  
Дата: 18.09.20 13:50
Оценка:
Доброе время суток, уважаемые коллеги!

Вот, предположим, что у нас имеется:

a) Первая сеть с адресами: 192.168.1.XX
b) Вторая сеть с адресами: 192.168.2.XX

Также предположим (для упрощения) что есть три компьютера:
1) 192.168.1.1 — первый узел.
2) 192.168.2.1 — второй узел.
3) Имеется шлюз с подсоединением к двум вышеуказаннып сетям —
его адреса: 192.168.1.7 и 192.168.2.7.

Вопрос:
Как (на уровне UDP-сокетов) через этот самый шлюз транслировать UDP пакеты — от 192.168.1.1 к 192.168.2.1 и обратно?

Желательно — с привязкой к POSIX реализации.

Заранее благодарен за подсказки.
Re: Пересылка UDP пакета из одной сети в другую
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.09.20 14:08
Оценка: 7 (2) +1
Здравствуйте, AlexGin, Вы писали:

AG>Доброе время суток, уважаемые коллеги!


AG>Вот, предположим, что у нас имеется:


AG>a) Первая сеть с адресами: 192.168.1.XX

AG>b) Вторая сеть с адресами: 192.168.2.XX

AG>Также предположим (для упрощения) что есть три компьютера:

AG>1) 192.168.1.1 — первый узел.
AG>2) 192.168.2.1 — второй узел.
AG>3) Имеется шлюз с подсоединением к двум вышеуказаннып сетям -
AG>его адреса: 192.168.1.7 и 192.168.2.7.

AG>Вопрос:

AG>Как (на уровне UDP-сокетов) через этот самый шлюз транслировать UDP пакеты — от 192.168.1.1 к 192.168.2.1 и обратно?

Эээ
я не понял — этот "шлюз" он таки предназначен раутить пакеты сквозь себя или нет?

Если да — то вообще никакой особой заботы не нужно — IP стек всё сделает, просто 192.168.1.1 отправляет пакет на 192.168.2.1, и наоборот.

Если нет — то какая-то программа должна принимать на 192.168.1.7 датаграммки и передавать на 192.168.2.1, и в обратную сторону. Но зачем? (Ниже — с этим вариантом)

AG>Желательно — с привязкой к POSIX реализации.


Вам как — в одну нитку или в две? (два процесса?)
если можно две — тогда каждая из них делает socket(), bind(), и вечный цикл из recv() и sendto(). Отличаются только адреса.
Если одну — то, например, писать на движке событий поверх libuv, ASIO и десятков других аналогов.
The God is real, unless declared integer.
Re[2]: Пересылка UDP пакета из одной сети в другую
От: vsb Казахстан  
Дата: 18.09.20 14:14
Оценка: +1
Здравствуйте, netch80, Вы писали:

N>Если нет — то какая-то программа должна принимать на 192.168.1.7 датаграммки и передавать на 192.168.2.1, и в обратную сторону. Но зачем? (Ниже — с этим вариантом)


Мне кажется, на iptables можно такое сделать.
Re[3]: Пересылка UDP пакета из одной сети в другую
От: Bill Baklushi СССР  
Дата: 18.09.20 14:29
Оценка: +1
vsb:

N>>Если нет — то какая-то программа должна принимать на 192.168.1.7 датаграммки и передавать на 192.168.2.1, и в обратную сторону. Но зачем? (Ниже — с этим вариантом)

vsb>Мне кажется, на iptables можно такое сделать.

Кроме iptables нужно настроить сеть для поддержки ip_forward:
https://help.ubuntu.ru/wiki/sharing_internet
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re[2]: Пересылка UDP пакета из одной сети в другую
От: AlexGin Беларусь  
Дата: 18.09.20 15:07
Оценка:
Здравствуйте, netch80, Вы писали:
...
AG>>Вопрос:
AG>>Как (на уровне UDP-сокетов) через этот самый шлюз транслировать UDP пакеты — от 192.168.1.1 к 192.168.2.1 и обратно?

N>Эээ

N>я не понял — этот "шлюз" он таки предназначен раутить пакеты сквозь себя или нет?

Да, именно так.

N>Если да — то вообще никакой особой заботы не нужно — IP стек всё сделает, просто 192.168.1.1 отправляет пакет на 192.168.2.1, и наоборот.


Сети не доступны таким образом (простой route здесь не пройдет).

N>Если нет — то какая-то программа должна принимать на 192.168.1.7 датаграммки и передавать на 192.168.2.1, и в обратную сторону. Но зачем? (Ниже — с этим вариантом)


Именно нет. Затем — что иниче (ИМХО) как решить данную проблему, если речь идет о разных сетях?
Кроме всего прочего, иногда потребуется переключить эту схему (при случае, если вторая сеть станет уже не 192.168.2.XX а, например, 192.168.22.XX).

AG>>Желательно — с привязкой к POSIX реализации.


N>Вам как — в одну нитку или в две? (два процесса?)

N>если можно две — тогда каждая из них делает socket(), bind(), и вечный цикл из recv() и sendto(). Отличаются только адреса.

Да, это понятно, в смысле что это традиционная работа с UDP сокетом.

N>Если одну — то, например, писать на движке событий поверх libuv, ASIO и десятков других аналогов.


Спасибо, покопаю в этом направлении!
Re[3]: Пересылка UDP пакета из одной сети в другую
От: AlexGin Беларусь  
Дата: 18.09.20 15:14
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, netch80, Вы писали:


N>>Если нет — то какая-то программа должна принимать на 192.168.1.7 датаграммки и передавать на 192.168.2.1, и в обратную сторону. Но зачем? (Ниже — с этим вариантом)


vsb>Мне кажется, на iptables можно такое сделать.


Ну iptables — IMHO не то.
Вышеуказанные сети — никак не связяны, кроме как наличием этого самого "шлюза".
Re: Пересылка UDP пакета из одной сети в другую
От: Reset  
Дата: 18.09.20 18:43
Оценка: 2 (1) +1
AG>a) Первая сеть с адресами: 192.168.1.XX
AG>b) Вторая сеть с адресами: 192.168.2.XX

AG>Также предположим (для упрощения) что есть три компьютера:

AG>1) 192.168.1.1 — первый узел.
AG>2) 192.168.2.1 — второй узел.
AG>3) Имеется шлюз с подсоединением к двум вышеуказаннып сетям -
AG>его адреса: 192.168.1.7 и 192.168.2.7.

AG>Вопрос:

AG>Как (на уровне UDP-сокетов) через этот самый шлюз транслировать UDP пакеты — от 192.168.1.1 к 192.168.2.1 и обратно?

Ты тут понаписал конкретную фигню (по не знанию), либо что-то важное не договариваешь (опять же, по не знанию).

Тебе тут, похоже, достаточно настроить маршрутизацию. Расскажу про роутинг (маршрутизацию), чтобы было понятно. Очень упрощенно.

  1. Маршрутизация производится по адресу назначения (адрес источника не важен и тем более порты, потому что маршрутизация делается по IP).
  2. При маршрутизации оба эти адреса в пакете не меняются.
Цель маршрутизации доставить пакет по назначению. Для этого в твоей сети ты настраиваешь на узле 192.168.1.1:
  1. адрес с маской подсети 192.168.1.1/24,
  2. default (0.0.0.0/0) шлюз 192.168.1.7.
По адресу с маской подсети узел будет знать, какие IP адреса доступны напрямую. Остальные пакеты с адресами назначения не в сети 192.168.1.0/24, узел отправит шлюзу.
Аналогично для узла 192.168.2.1
  1. адрес с маской подсети 192.168.2.1/24,
  2. default (0.0.0.0/0) шлюз 192.168.2.7.
Настройка шлюза :
  1. 192.168.1.7/24 на одном интерфейсе,
  2. 192.168.2.7/24 на другом интерфейсе,
  3. ip_forward, чтобы он маршрутизировал пакеты, предназначенные не ему.
Таким образом шлюз будет знать где находятся обе подсети. Еще возможно, шлюзу самому понадобиться шлюз по умолчанию, ведь, он знает только об этих двух подсетях, но это не относится к задаче.

Итак, узел 192.168.1.1 отправляет IP пакет (он может быть UDP, TCP, ICMP или любой другой IP пакет) узлу 192.168.2.1. Напрямую это адрес не доступен (у него сеть 192.168.1.1/24, а адрес 192.168.2.1), поэтому он отправляет пакет шлюзу 192.168.1.7. Тот получив пакет и обнаружив, что он предназначен не ему (dst 192.168.2.1) и, что у него включена маршрутизация поищет в таблице маршрутизации, куда его отдать дальше и отдаст в сеть 192.168.2.0/24 на адрес 192.168.2.1. Адреса источника и назначения в пакете не меняются. В результате узел 192.168.2.1 получит пакет от шлюза (маршрутизатора), но узнать он это сможет только по MAC (адреса в пакете src 192.168.1.1, dst 192.168.2.1).

Аналогично узел 192.168.2.1 отправит ответ, зная адрес отправителя из пакета (или как-то еще).

Еще бывает маршрутизация с трансляцией адресов NAT, когда адрес источника или назначения подменяется адресом шлюза (Source NAT) или другого узла (Destination NAT). Но, похоже, тебе это не надо.
Re[3]: Пересылка UDP пакета из одной сети в другую
От: ononim  
Дата: 18.09.20 23:53
Оценка: +2
N>>я не понял — этот "шлюз" он таки предназначен раутить пакеты сквозь себя или нет?
AG>Да, именно так.
N>>Если да — то вообще никакой особой заботы не нужно — IP стек всё сделает, просто 192.168.1.1 отправляет пакет на 192.168.2.1, и наоборот.
AG>Сети не доступны таким образом (простой route здесь не пройдет).

Способность форвардить пакеты между сетями — фундаментальное свойство шлюза, если он этого не умеет — то никакой он не шлюз, а прости г-ди — multihomed host.

Если он этого не делает — видимо надо включить форвардинг на нем
А если делает, но просто не является дефолтовым шлюзом для хостов в 192.168.1.. и 192.168.2... — то нужен именно route (на обоих сторонах)
А если и делает и роуты через него хостам известны — то надо просто слать пакеты, как обычно.
Как много веселых ребят, и все делают велосипед...
Отредактировано 18.09.2020 23:56 ononim . Предыдущая версия .
Re[4]: Пересылка UDP пакета из одной сети в другую
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.09.20 06:09
Оценка:
Здравствуйте, ononim, Вы писали:

O>А если делает, но просто не является дефолтовым шлюзом для хостов в 192.168.1.. и 192.168.2... — то нужен именно route (на обоих сторонах)


Тут сети directly connected и раут обычно назначается автоматически.
The God is real, unless declared integer.
Re[3]: Пересылка UDP пакета из одной сети в другую
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.09.20 06:10
Оценка:
Здравствуйте, vsb, Вы писали:

N>>Если нет — то какая-то программа должна принимать на 192.168.1.7 датаграммки и передавать на 192.168.2.1, и в обратную сторону. Но зачем? (Ниже — с этим вариантом)


vsb>Мне кажется, на iptables можно такое сделать.


NATʼами? Ну да. Просто пока нет понимания, нужно ли именно в таком виде.
The God is real, unless declared integer.
Re[3]: Пересылка UDP пакета из одной сети в другую
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.09.20 06:12
Оценка:
Здравствуйте, AlexGin, Вы писали:

N>>Если да — то вообще никакой особой заботы не нужно — IP стек всё сделает, просто 192.168.1.1 отправляет пакет на 192.168.2.1, и наоборот.

AG>Сети не доступны таким образом (простой route здесь не пройдет).

Хм, вот это интересный сеттинг. Если это не просто выключенный форвардинг, сети назначены на интерфейсы, но недоступны... как и зачем?

Можно же было, например, включить форвардинг, но правилами iptables запретить его для всех случаев, кроме одного конкретного.
The God is real, unless declared integer.
Re[2]: Пересылка UDP пакета из одной сети в другую
От: AlexGin Беларусь  
Дата: 19.09.20 06:15
Оценка:
Здравствуйте, уважаемый Reset, Вы писали:
...
Благодарю за столь развёрнутый ответ!

Но здесь имеется маленькое уточнение (по условию задачи):
Вторая сеть через пять минут может быть переключена на резервную — например: 192.168.22.XX

Именно поэтому я и предполагаю — работать не через таблицы маршрутизации, а именно через переприём UDP пакетов.
Re[3]: Пересылка UDP пакета из одной сети в другую
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.09.20 07:12
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Но здесь имеется маленькое уточнение (по условию задачи):

AG>Вторая сеть через пять минут может быть переключена на резервную — например: 192.168.22.XX

Да, это существенно.

AG>Именно поэтому я и предполагаю — работать не через таблицы маршрутизации, а именно через переприём UDP пакетов.


Можно таки ещё iptables с NAT правилами. Немного изврат, но позволяет освободиться от своего демона.
Всё равно о факте переключения надо кого-то пинать
The God is real, unless declared integer.
Re[4]: Пересылка UDP пакета из одной сети в другую
От: AlexGin Беларусь  
Дата: 19.09.20 07:53
Оценка:
Здравствуйте, netch80, Вы писали:
...
N>Можно таки ещё iptables с NAT правилами. Немного изврат, но позволяет освободиться от своего демона.
N>Всё равно о факте переключения надо кого-то пинать

Ну например так:
По таймеру наш шлюз пингует узел 192.168.2.1 (например с периодом 1 сек).
При каких-либо граничных условиях (время ping-а перевалило через установленный threshold,
или узел дальнего_конца ввобще "отвалился") — переходим на резервную сеть и резервный узел 192.168.22.1.
Отредактировано 19.09.2020 7:55 AlexGin . Предыдущая версия .
Re[3]: Пересылка UDP пакета из одной сети в другую
От: Reset  
Дата: 19.09.20 13:54
Оценка: 6 (1) +1
AG>Вторая сеть через пять минут может быть переключена на резервную — например: 192.168.22.XX

Тогда тебе нужен не шлюз (маршрутизатор), а прокси, который отслеживает IP подключенных клиентов и проксирует им запросы. Или само приложение при смене IP клиента должно повторно отправить запрос (или ответ) на новый IP клиента. Если происходит переключение на резервную сеть, то оповещение о смене IP может делать либо тот, кто инициирует переключение, либо при очередном запросе будет превышен таймаут (старая сеть недоступна).

Попытки смешать маршрутизацию и передачу трафика на уровне приложения приведут к ненужному усложнению задачи (такое крайне редко бывает нужно и, вряд ли, это твой случай). Маршрутизацией (в том числе динамической) должен заниматься шлюз (роутер, маршрутизатор), а приложение должно отправлять запросы на известный IP. Весь вопрос, откуда оно узнает этот IP (а как доставить туда данные — задача марштуризатора). Если IP клиента может меняться — делай так, чтобы об этом узнавало приложение. Если маршрут обмена трафиком может меняться — с этой задачей справится маршрутизатор.

Короче:
Re[4]: Пересылка UDP пакета из одной сети в другую
От: Bill Baklushi СССР  
Дата: 19.09.20 14:07
Оценка: 2 (1)
AlexGin:

AG>Ну iptables — IMHO не то.

AG>Вышеуказанные сети — никак не связяны, кроме как наличием этого самого "шлюза".

На шлюзе и настраивается маршрутизация через iptables.
Если маршрутизация нужна только для определенных портов то это тоже можно настроить.
Программировать в этом случае ничего не надо.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re[4]: Пересылка UDP пакета из одной сети в другую
От: AlexGin Беларусь  
Дата: 19.09.20 19:39
Оценка:
Здравствуйте, уважаемый Reset, Вы писали:
...

R>Короче:

R> +100500
Согласен — я посему и запостил сюда этк тему.
Отредактировано 19.09.2020 19:40 AlexGin . Предыдущая версия .
Re[5]: Пересылка UDP пакета из одной сети в другую
От: AlexGin Беларусь  
Дата: 19.09.20 19:58
Оценка:
Здравствуйте, Bill Baklushi, Вы писали:

BB>AlexGin:


AG>>Ну iptables — IMHO не то.

AG>>Вышеуказанные сети — никак не связяны, кроме как наличием этого самого "шлюза".

BB>На шлюзе и настраивается маршрутизация через iptables.

BB>Если маршрутизация нужна только для определенных портов то это тоже можно настроить.
BB>Программировать в этом случае ничего не надо.

То есть — просто настраивается всё (это в Linux) на уровне простых bash-скриптов?
Re[6]: Пересылка UDP пакета из одной сети в другую
От: Bill Baklushi СССР  
Дата: 20.09.20 09:15
Оценка:
AlexGin:

BB>>На шлюзе и настраивается маршрутизация через iptables.

AG>То есть — просто настраивается всё (это в Linux) на уровне простых bash-скриптов?

Угу. Ссылку как поднять NAT на шлюзе я уже кидал
https://help.ubuntu.ru/wiki/sharing_internet

ononim указал, как настоить port forwarding на шлюзе
и route на оконечных узлах.
https://rsdn.org/forum/network/7833869.1
Автор: ononim
Дата: 19.09.20


В основном скрипты требуют однократного выполнения, кроме какого-то одного:
кажется что-то вроде "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERAD" должно вешаться на включение сетевухи в файле /etc/interfaces
Про то как вешается обработчик тоже есть по ссылкам. Мне лениво было, я руками запускаю, когда мне нужен шлюз
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re: Пересылка UDP пакета из одной сети в другую
От: cppguard  
Дата: 21.09.20 10:29
Оценка: 6 (1) -3
Здравствуйте, AlexGin, Вы писали:

AG>Доброе время суток, уважаемые коллеги!


AG>Вот, предположим, что у нас имеется:


AG>a) Первая сеть с адресами: 192.168.1.XX

AG>b) Вторая сеть с адресами: 192.168.2.XX

AG>Также предположим (для упрощения) что есть три компьютера:

AG>1) 192.168.1.1 — первый узел.
AG>2) 192.168.2.1 — второй узел.
AG>3) Имеется шлюз с подсоединением к двум вышеуказаннып сетям -
AG>его адреса: 192.168.1.7 и 192.168.2.7.

AG>Вопрос:

AG>Как (на уровне UDP-сокетов) через этот самый шлюз транслировать UDP пакеты — от 192.168.1.1 к 192.168.2.1 и обратно?

AG>Желательно — с привязкой к POSIX реализации.


AG>Заранее благодарен за подсказки.


Если бы адреса сетей были другими, то работало бы "из коробки", данные отправлялись бы из одной сети в другую через шлюз по-умолчанию (default gateway). А так — 192.168.0.0/16 немаршрутизируемый диапазон, поэтому пакеты никуда не уйдут. Возможно, можно это как-то обойти через port forwarding или другие настройки сети.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.