Вопрос или проблема
Я пытаюсь получать пакеты NTP с помощью netfilter queue, которые на самом деле предназначены для устройства внутри моей локальной сети (за Wifi-AP).
Я понимаю, что iptables должен уметь захватывать пакеты на Open vSwitch (который должен работать на 3 уровне модели OSI, так как у него есть свой IP-адрес).
Чтобы достичь своей цели, я настроил правило фаервола pfSense для WAN (позже также для LAN), чтобы входящие пакеты NTP с любого IP-адреса, предназначенные для любого IP-адреса/ любого порта, использовали OVS в качестве шлюза.
Я вижу, как пакеты NTP маршрутизируются через мою локальную сеть. Вот соответствующие строки из tcpdump:
16:05:39.847140 enp33s0f2 P IP 10.12.1.130.51872 > time2.google.com.ntp: NTPv4, Client, length 48
16:05:39.847147 vnet1 Out IP 10.12.1.130.51872 > time2.google.com.ntp: NTPv4, Client, length 48
16:05:39.847273 vnet0 P IP pfsense.*****.local.32015 > time2.google.com.ntp: NTPv4, Client, length 48
16:05:39.879695 vnet0 Out IP time2.google.com.ntp > pfsense.*****.local.32015: NTPv4, Server, length 48
16:05:39.879822 vnet1 P IP time2.google.com.ntp > 10.12.1.130.51872: NTPv4, Server, length 48
16:05:39.879827 enp33s0f2 Out IP time2.google.com.ntp > 10.12.1.130.51872: NTPv4, Server, length 48
Другими словами:
Запрос NTP: enp33s0f (мой Wifi-AP) → vnet1 (br_lan/ перед фаерволом) → vnet0 (br_wan/ за фаерволом)
Ответ NTP: то же самое, просто в обратном порядке.
После “Ожидание пакетов NTP (Ctrl+C для остановки)…” консоль остается довольно тихой, так что я предполагаю, что пакет никогда не достигает скрипта на Python. Правила iptables в моем скрипте Python следующие:
iptables -t raw PREROUTING --sport 123 -j NFQUEUE --queue-num 98
Я полагаю, что я неправильно настроил фаервол или мое понимание модели OSI не самое лучшее. Возможно, даже OVS просто перенаправляет пакет напрямую на WiFi-AP, даже если он настроен как шлюз.
Я использую Kubuntu в качестве операционной системы. Мне удалось получить пакеты, приходящие от устройства и перенаправленные фаерволом pfSense. Я использовал правило фаервола для этого – я просто не понимаю, почему это не работает в обратном направлении. Также я не уверен, что именно было бы правильным подходом – настраивать NAT фаервола или правила фаервола.
Я был бы очень признателен за любую помощь, так как я попробовал все, что мог, чтобы отладить это. Заранее спасибо.
Ответ или решение
Проблема, с которой вы столкнулись, может быть связана с несколькими аспектами настройки сети и правил брандмауэра. Давайте разберём каждый из них и постараемся найти решение.
-
Понимание маршрутизации и OVS: Open vSwitch (OVS) работает на третьем уровне модели OSI, и его настройка должна быть такой, чтобы он мог корректно обрабатывать входящие и исходящие пакеты. Убедитесь, что OVS правильно настроен и интерфейсы, через которые проходит трафик, правильно связаны с необходимыми виртуальными мостами.
-
Правила pfSense: Вы упомянули, что создали правила на pfSense для перенаправления NTP-пакетов. Важно убедиться, что правила применяются именно в том порядке, в котором они должны действовать. Также проверьте, что охватывают все необходимые IP-адреса и порты. Пакеты NTP используют UDP-порт 123. Убедитесь, что вы разрешили как входящие, так и исходящие NTP-пакеты.
-
Настройка iptables: Ваше правило для iptables выглядит корректно для захвата исходящих пакетов NTP. Однако убедитесь, что вы прописали UPDATE (изменение) или INPUT (входящие) для захвата ответных пакетов. Попробуйте следующее правило:
iptables -t raw PREROUTING -p udp --dport 123 -j NFQUEUE --queue-num 98
Это правило позволит захватывать все входящие пакеты на порт 123, что может помочь в получении ответов от сервера времени.
-
Совместимость с NFQUEUE и ваш скрипт: Убедитесь, что Python-скрипт корректно работает с библиотекой NetfilterQueue и что он ожидает пакеты от NFQUEUE правильно. Если ваш скрипт начинает обработку, но не получает пакеты, это может означать, что у вас проблемы с конфигурацией iptables или с маршрутизацией на уровне OVS.
-
Проверка прокси и NAT: Если в сети есть устройства, работающие как прокси или NAT, убедитесь, что они не мешают прохождению пакетов. Возможно, вам потребуется настроить NAT на pfSense для правильной обработки ответов. Убедитесь, что маршрутизация правильно настроена для всех интерфейсов.
-
Отладка: Используйте
tcpdump
на интерфейсах pfSense и OVS для отслеживания трафика. Например, на OVS можно запустить:tcpdump -i <interface_name> port 123
Это покажет, проходят ли NTP-пакеты через ваш виртуальный коммутатор. Это поможет вам понять, на каком этапе пакеты теряются.
-
Очистка очереди: Иногда NFQUEUE может заблокировать пакеты, если вы не обрабатываете их в скрипте или у вас возникли ошибки. Проверьте статус очереди и убедитесь, что пакеты, попадающие в неё, правильно обрабатываются или сбрасываются.
Если вы следуете этим шагам и всё ещё сталкиваетесь с проблемами, возможно, стоит рассмотреть возможность получения более глубокого логирования интересующих вас данных в вашем Python-скрипте. Это поможет лучше понять, на каком именно этапе происходит сбой.