Jump to content
Калькуляторы

iptables, source NAT, multicast

Добрый день.

Есть сервер на CentOS, в него в два разных сетевых интерфейса приходят одинаковые по всем параметрам мультикаст потоки - одинаковый соурс и одинаковые группы. Контент тоже один и тот-же. К сожалению обрабатывающее ПО astra при таком раскладе не может делать автоматическое резервирование, потому что до уровня приложений оба потока приходят обезличенными - без привязки к интерфейсу, этот вопрос обсуждался с разработчиком ПО.

Пришла в голову идея прогнать один из потоков через NAT, и подменить в нем например адрес источника, на любой фиксированый, скажем 1.1.1.1.

Пошукал по инету, везде про SNAT речь идет в разрезе POSTROUTING, это, как я понимаю, траффик, который уже минует локальный хост, а мне трафик нужно скормить локальному приложению.

Какие будут мысли?

Share this post


Link to post
Share on other sites

ShyLion

Если через POSTROTING, то заводите интерфейс в netns, там делаете над ним NAT, из netns-а выпускаете трафик в veth и пусть приложение слушает на veth.

 

А вообще:

man iptables-extensions

...

SNAT

 

This target is only valid in the nat table, in the POSTROUTING and INPUT chains

Так что банальный SNAT в INPUT-е вам должен помочь

Share this post


Link to post
Share on other sites

Так что банальный SNAT в INPUT-е вам должен помочь

 

Не помогает. Приложение юзает raw сокет, возможно из-за этого.

Пробовал и DNAT - транслировать адрес группы, фигушки.

Может быть мультик в НАТ вообще не попадает никак?

 

Заюзать msd, хотя бы лайт, в качестве прокси для сбора с разных интерфейсов.

 

Он в UDP мультиком умеет отдавать?

Ну и от приложения как я понимаю не зависит, проблема в ядре.

Share this post


Link to post
Share on other sites

Так что банальный SNAT в INPUT-е вам должен помочь

 

Не помогает. Приложение юзает raw сокет, возможно из-за этого.

Пробовал и DNAT - транслировать адрес группы, фигушки.

Может быть мультик в НАТ вообще не попадает никак?

 

Заюзать msd, хотя бы лайт, в качестве прокси для сбора с разных интерфейсов.

 

Он в UDP мультиком умеет отдавать?

Ну и от приложения как я понимаю не зависит, проблема в ядре.

Быть может сгодится RAWSNAT из xtables-addons?

Share this post


Link to post
Share on other sites

Не помогает. Приложение юзает raw сокет, возможно из-за этого.

 

на крайний случай можно попробовать stateless nat средствами tc:

tc qdisc add dev eth2 ingress handle ffff

tc filter add dev eth2 parent ffff: protocol ip prio 10 u32 match ip src 192.168.0.250/32 action nat egress 192.168.0.250/32 1.1.1.1

Но не уверен, что оно раньше rawsocket отрабатывает, надо искать схему прохождения.

Share this post


Link to post
Share on other sites

tc filter add dev eth2 parent ffff: protocol ip prio 10 u32 match ip src 192.168.0.250/32 action nat egress 192.168.0.250/32 1.1.1.1

 

А вот занатить dst адрес можно таким образом? Т.е. поменять адрес группы. Работа IGMP не интересует, траффик льется без подписки.

Share this post


Link to post
Share on other sites

Вроде что-то получается:

 

# ifconfig ten0 promisc
# tc qdisc add dev ten0 ingress
# tc filter add dev ten0 parent ffff: protocol ip prio 10 u32 match ip dst 224.1.13.18/32 action nat ingress 224.1.13.18/32 237.1.13.18

# /usr/local/bin/astra --analyze 'udp://ten0@237.1.13.18:1234#pnr=7022'
Apr 06 17:44:22: INFO: Starting Astra 4.4.98
Apr 06 17:44:22: INFO: PAT: tsid: 0
Apr 06 17:44:22: INFO: PAT: pid: 7000 PMT pnr: 7022
Apr 06 17:44:22: INFO: PAT: crc32: 0x61FBC72E
Apr 06 17:44:22: INFO: PMT: pnr: 7022
Apr 06 17:44:22: INFO: PMT: pid: 7001 PCR
Apr 06 17:44:22: INFO: VIDEO: pid: 7001 type: 0x1B
Apr 06 17:44:22: INFO: AUDIO: pid: 7002 type: 0x04
Apr 06 17:44:22: INFO: AUDIO: Language: eng
Apr 06 17:44:22: INFO: PMT: crc32: 0x3F64FDA4
Apr 06 17:44:23: INFO: Bitrate: 1568 Kbit/s
Apr 06 17:44:24: INFO: Bitrate: 1909 Kbit/s
Apr 06 17:44:25: INFO: Bitrate: 2076 Kbit/s
Apr 06 17:44:26: INFO: Bitrate: 1944 Kbit/s
^CApr 06 17:44:26: INFO: [main] exit

 

без "ifconfig ten0 promisc" не шел траффик

Share this post


Link to post
Share on other sites

Вроде что-то получается:

 

# ifconfig ten0 promisc
# tc qdisc add dev ten0 ingress
# tc filter add dev ten0 parent ffff: protocol ip prio 10 u32 match ip dst 224.1.13.18/32 action nat ingress 224.1.13.18/32 237.1.13.18

# /usr/local/bin/astra --analyze 'udp://ten0@237.1.13.18:1234#pnr=7022'
Apr 06 17:44:22: INFO: Starting Astra 4.4.98
Apr 06 17:44:22: INFO: PAT: tsid: 0
Apr 06 17:44:22: INFO: PAT: pid: 7000 PMT pnr: 7022
Apr 06 17:44:22: INFO: PAT: crc32: 0x61FBC72E
Apr 06 17:44:22: INFO: PMT: pnr: 7022
Apr 06 17:44:22: INFO: PMT: pid: 7001 PCR
Apr 06 17:44:22: INFO: VIDEO: pid: 7001 type: 0x1B
Apr 06 17:44:22: INFO: AUDIO: pid: 7002 type: 0x04
Apr 06 17:44:22: INFO: AUDIO: Language: eng
Apr 06 17:44:22: INFO: PMT: crc32: 0x3F64FDA4
Apr 06 17:44:23: INFO: Bitrate: 1568 Kbit/s
Apr 06 17:44:24: INFO: Bitrate: 1909 Kbit/s
Apr 06 17:44:25: INFO: Bitrate: 2076 Kbit/s
Apr 06 17:44:26: INFO: Bitrate: 1944 Kbit/s
^CApr 06 17:44:26: INFO: [main] exit

 

без "ifconfig ten0 promisc" не шел траффик

Постарайтесь отвыкать от ifconfig, ибо deprecated.

ip link set dev ten0 promisc on

 

Не помогает. Приложение юзает raw сокет, возможно из-за этого.

 

на крайний случай можно попробовать stateless nat средствами tc:

tc qdisc add dev eth2 ingress handle ffff

tc filter add dev eth2 parent ffff: protocol ip prio 10 u32 match ip src 192.168.0.250/32 action nat egress 192.168.0.250/32 1.1.1.1

Но не уверен, что оно раньше rawsocket отрабатывает, надо искать схему прохождения.

О сколько нам открытий чудных...

В закладочки. :) Спасибо.

 

 

Share this post


Link to post
Share on other sites

Не помогает. Приложение юзает raw сокет, возможно из-за этого.

 

на крайний случай можно попробовать stateless nat средствами tc:

tc qdisc add dev eth2 ingress handle ffff

tc filter add dev eth2 parent ffff: protocol ip prio 10 u32 match ip src 192.168.0.250/32 action nat egress 192.168.0.250/32 1.1.1.1

Но не уверен, что оно раньше rawsocket отрабатывает, надо искать схему прохождения.

 

Этот вариант заработал, спасибо!

Share this post


Link to post
Share on other sites

Он в UDP мультиком умеет отдавать?

Нет, только хттп.

 

Ну и от приложения как я понимаю не зависит, проблема в ядре.

Далеко не факт.

Share this post


Link to post
Share on other sites

 

А вот занатить dst адрес можно таким образом? Т.е. поменять адрес группы. Работа IGMP не интересует, траффик льется без подписки.

 

Как-то так?

 

tc filter add dev eth2 parent ffff: protocol ip prio 10 u32 match ip dst 233.130.8.100/32 action nat ingress 233.130.8.100/32 234.1.1.1

 

Документации не так много по этой магии :(

Share this post


Link to post
Share on other sites

Как-то так?

 

Я выше написал что все получилось. Спасибо.

 

ЗЫ: обновил линух и напроч перестал приниматься мультикаст........ переустанавливаю сервер заново, блин.

Share this post


Link to post
Share on other sites

ShyLion

вы ядро обновили или дистр? может просто rp_filter включился?

 

тупо yum update прогнал

 

rp_filter первым делом проверял

плясал с бубном пару часов, фаервол выключал и т.п.

 

щас заново все проинсталил - все работает, конфиги те-же

возможно какой-то пакет че-то испортил тогда, библиотеку какую не ту поправил, хз

 

yum update сразу прогнал после инсталяции и сетевых настроек

 

CentOS 7 minimal

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.