This is an old revision of the document!
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
Все, этого должно хватить.