Как использовать сетевой интерфейс только для чтения?

Как использовать сетевой интерфейс только для чтения?

У меня в домашней лаборатории есть коммутатор, с которым я хочу провести несколько экспериментов, особенно в отношении 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

Примечания:

  1. Я предполагаю, что коммутатор с портом, установленным в режим зеркалирования, вероятно, уже установил этот порт в режим только для чтения.

    Это то, что нужно проверить. И если это правда, использование фильтра выше или пункта 2 ниже становится спорным.

  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 и т. д.

Связанный контент