У меня в домашней лаборатории есть коммутатор, с которым я хочу провести несколько экспериментов, особенно в отношении VLAN и некоторых других протоколов, которые я хочу лучше понять. Теперь этот коммутатор (TP-Link 5-портовый частично управляемый коммутатор) позволяет осуществлять зеркалирование портов.
Этот зеркальный трафик я хочу проанализировать на своем компьютере, при этом как можно меньше "нового" трафика вводится с машины мониторинга. Как я могу этого добиться?
Я уже знаю, что вам нужно перевести NIC в режим promiscuous, чтобы получать пакеты, изначально не предназначенные для моего ПК. Поскольку это обычно делает сам Wireshark, мне не нужно об этом беспокоиться.
Однако я хотел убедиться, что в порту было как можно меньше "шума", чтобы просто посмотреть на трафик, генерируемый на других портах. Я уже нашелэтот ответэто предполагает отключение всех запущенных служб (вроде DHCP и т. д.), что имеет смысл. Но хотя это значительно уменьшит шум, это, вероятно, не сможет предотвратить разрешение ARP или другие сетевые взаимодействия на основе ядра.
Я также узнал, что существуют протоколы, предназначенные специально для этой цели (например,SPAN от Cisco), но мой коммутатор не имеет такой возможности.
Итак, мой вопрос: как мне использовать сетевой интерфейс только для чтения?
решение1
Самый простой способ сделать интерфейс доступным только для чтения в Linux — применить выходtc
фильтр на нем, который падает все.
Чтобы применить фильтр,классный qdiscдолжны быть на месте.приоqdisc — это простейший классовый qdisc, который используется только для возможности использования фильтров в интерфейсе, а не для собственных функций.
В конце концов, чтобы установить интерфейсeth1«только для чтения»:
tc qdisc add dev eth1 root prio
tc filter add dev eth1 matchall action drop
Это блокирует исходящий трафик на этом интерфейсе. Он даже блокирует RAW-сокеты (которые в противном случае не затрагиваются брандмауэрами), поэтому заблокирует IPv4 DHCP-клиента (который в противном случае может получить адрес, несмотря на брандмауэр). Есть еще способы обойти это, но это может быть только очень преднамеренно. Вот два, которые я знаю:
- использовать
PACKET_QDISC_BYPASS
опция сокета на сыром сокете - использоватьAF_XDPразъем.
Чтобы вернуть интерфейс в исходное состояние, просто удалите qdisc:
tc qdisc del dev eth1 root
Примечания:
Я предполагаю, что коммутатор с портом, установленным в режим зеркалирования, вероятно, уже установил этот порт в режим только для чтения.
Это то, что нужно проверить. И если это правда, использование фильтра выше или пункта 2 ниже становится спорным.
интерфейс, который находится в состоянии UP и на котором не применены дополнительные настройки, может по-прежнему обмениваться трафиком
Без предыдущего фильтра, даже ненастроенный, но UP-интерфейс может оставить трафик. Есть как минимум два случая:
Автоматическая настройка IPv6
использовать
sysctl -w net.ipv6.conf.eth1.disable_ipv6=1
Если ARP не отключен (с
ip link set eth1 arp off
)Этот случай аналогичен более общему случаю утечки информации, когда система в локальной сети может проверить, используют ли некоторые системы другие сети (включая виртуальные) с хорошо известными адресами: по умолчанию в Linux интерфейс будет отвечать на запросы ARP длялюбойдругой адрес налюбойдругой интерфейс.Это частьслабыхМодель хоста.
Так, например, если система OP работает под управлением livbirt QEMU/KVM с настройками по умолчанию, то 192.168.122.1/24 назначаетсяvirbr0, то другая система Linux, подключенная только к ненастроенному интерфейсу UP, все равно будет получать ответы ARP через него при запуске:
arping -I eth0 192.168.122.1
Неважно, есть ли у зондирующей системы маршрут к 192.168.122.1. Речь идет об ARP (и команде, которая не заботится о маршрутах). То же самое касается LXC и 10.0.3.1 и т. д.