Назад | Перейти на главную страницу

Копирование пакетов с одного интерфейса на другой

У меня есть система Linux (пусть это будет A) с двумя сетевыми картами, а именно eth0 и eth1, которые подключены к двум совершенно несвязанным локальным сетям.

Обычно eth0 используется для обычного трафика приложений, а eth1 - только для отладки. Отладка означает, что eth1 подключен с помощью кросс-кабеля к другому Linux-серверу (пусть это будет B), на котором работает Wireshark. Я хочу, чтобы Wireshark мог обрабатывать пакеты приложений, перемещающиеся по eth0.

В основном мне нужно копировать перемещающиеся пакеты от интерфейса eth0 к интерфейсу eth1, чтобы Wireshark на блоке B мог их обнюхать (по некоторым причинам у меня нет физического доступа к локальной сети eth0). Мне также может потребоваться указать, какие пакеты копировать с eth0 на eth1 в соответствии с каким-то правилом (кстати, только на основе полей TCP / IP).

Также обратите внимание, что eth0 A не нужно переводить в беспорядочный режим, потому что я хочу скопировать только подмножество пакетов, у которых A в качестве пункта назначения

Есть ли способ добиться этого, используя только iptables? Или мне нужно написать приложение, чтобы это работало? Что мне делать, чтобы «скопировать» пакеты?

Если ваше ядро ​​достаточно новое, вы можете использовать iptables --tee для пересылки кадров с eth0 на машину захвата.

Вы можете использовать tc mirred action. Например: Для входящего трафика:

tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 1:1 \
   action mirred egress mirror dev eth1

Для исходящего трафика:

tc qdisc replace dev eth0 parent root handle 10: prio
tc filter add dev eth0 parent 10: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 10:1 \
   action mirred egress mirror dev eth1

Поищите в сети tcpbridge, что и делает задание. Его также можно использовать для общения с виртуальными машинами.

Что-то вроде Rinetd мощь работа (редиректор / сервер по TCP только Я считаю, что нет ARP, уровня 2 и т. Д.), Но, честно говоря, получив несколько управляемых коммутаторов, которые имеют возможности зеркалирования портов, или если этот блок используется исключительно для wirehark, вы можете добавить к нему еще одну сетевую карту, соединить два интерфейса , поместите его перед eth0 машины A и получите специальную машину для сниффинга.

Устройство, которое копирует кадры Ethernet с одного интерфейса на другой, является мостом. Вы можете настроить свою систему Linux на работу в качестве моста. Некоторую документацию можно найти здесь:

Вы можете применить правила фильтрации к мостовому трафику, используя ebtables, который является аналогом iptables для трафика уровня 2.

В моей настройке многоадресный трафик TX был отмечен iptables, но маршрутизация политики с использованием новых таблиц маршрутизации никогда не работала. Хотя он работал для одноадресных пакетов TX (перенаправляя исходящие пакеты с eth0 на eth5). Используя tc, я мог бы получить трафик eth0 mcast на eth5. Src mac и src ip-адрес изменены по сравнению с eth5, поэтому проблем с обучением коммутаторам не возникнет. Должна быть включена вся поддержка ядра для планирования пакетов ядра. CONFIG_NET_SCHED.

Ниже РАБОТАЕТ для перенаправления одноадресного и многоадресного трафика с eth0 на eth5

Netfilter можно использовать для непосредственного взаимодействия со структурой, представляющей пакет в ядре. Эта структура, sk_buff, содержит поле с именем «__u32 nfmark», которое мы собираемся изменить. Затем TC прочитает это значение, чтобы выбрать класс назначения пакета.

IP_ADDR_ETH0 =ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n' iptables -t mangle -A OUTPUT -s $ {IP_ADDR_ETH0} -p udp --match multiport --dports 329,330 -o eth0 -j MARK --set-mark 2

Собираемся создать дерево, которое представляет нашу политику планирования, и которое использует PRIO qdisc (планировщик пакетов) (можете попробовать другие доступные). qdiscs, прикрепленные к корню устройства

tc qdisc add dev eth0 корневой дескриптор 15: prio

Теперь на одной стороне есть политика формирования трафика, а на другой - маркировка пакетов. Чтобы соединить эти два, нам понадобится фильтр.

refer man tc-mirred (8): действие mirred позволяет зеркалировать (копировать) или перенаправлять (украсть) пакет, который он получает. Зеркальное отображение - это то, что иногда называют анализатором портов коммутатора (SPAN), и обычно используется для анализа и / или отладки потоков.

обратитесь к man tc-fw (8): fw - фильтр управления трафиком fwmark. фильтр fw позволяет классифицировать пакеты на основе ранее установленного fwmark с помощью iptables. Если он идентичен «дескриптору» фильтра, фильтр соответствует. iptables позволяет помечать отдельные пакеты с помощью цели MARK или целые соединения с помощью CONNMARK.

MAC_ADDR_ETH1 =cat /sys/class/net/eth1/address IP_ADDR_ETH1 =ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n' tc filter add dev eth0 parent 15: 0 протокол ip prio 1 handle 0x2 fw action pedit ex munge eth src set $ {MAC_ADDR_ETH1} pipe \ action pedit ex munge ip src set $ {IP_ADDR_ETH1} pipe \ action mirred egress redirect dev eth1

показать указанные выше правила: tc qdisc show dev eth0 tc filter show dev eth0

удалить / отключить установленные выше правила: tc qdisc del dev eth0 root