Table of Contents
Разветвление udp трафика
Вводная
Появилась задача, отправлять udp трафик на пару серверов.
При этом на источнике udp трафика (устройство udp-sourсe
) нельзя настроить пару дестинейшинов (ВМ udp-destination1\2
), можно настроить только один.
Задачу будем решать с помощь iptables.
Вспоминаем путь пакета по таблицам и цепям - https://i.stack.imgur.com/MkqJb.gif
На ВМ udp-destination1 трафик будет клонирован и направлен в сторону промежуточной ВМ noc1 c помощью модуля TEE (таблица mangle, цепочка PREROUTING).
При этом все L3\4 source и destination поля udp пакета останутся без изменений, на noc1 придет такой же пакет как ранее пришел на udp-destination1.
Модуль TEE может отправлять трафик только на соседний адрес в рамках одного бродкаст домена.
Что бы отправить трафик куда-нибудь подальше, нужна промежуточная ВМ noc1.
ВМ noc1 принимает клонированный трафик и, с помощью модулей DNAT и SNAT (таблица nat, цепочки PREROUTING и POSTROUTING), меняет source и destination ip адреса.
В поле source будет стоять адрес самого noc1, в destination будет стоять ВМ udp-destination2
.
В итоге, схема решения будет такая:
Настройка udp-destination1
В настройки iptables (/etc/sysconfig/iptables в случае Centos) дописываем правило в таблицу mangle.
*mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A PREROUTING -i eth0 -p udp -m udp --sport 100 -s 10.200.0.10/32 -j TEE --gateway 10.200.0.30 COMMIT
Настройка noc1
В настройки iptables дописываем правила в таблицу nat.
*nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A PREROUTING -p udp -s 10.200.0.10/32 --sport 100 -j DNAT --to-destination 87.250.250.247 -A POSTROUTING -p udp -s 10.200.0.10/32 --sport 100 -j SNAT --to-source 10.200.2.55:2000 COMMIT
Включаем форвардинг пакетов через ВМ.
sysctl net.ipv4.ip_forward=1
В настройки iptables дописываем правило в таблицу filter.
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] ... -A FORWARD -p udp -d 87.250.250.247/32 -j ACCEPT ... COMMIT
Все, этого должно хватить.