Рейтинг:1

Запретить маршрутизацию DHCP-трафика

флаг ng

Во-первых, я знаю, что подобные вопросы задавались в другом месте (я прочитал многие из этих сообщений!), но я не смог найти решение своей проблемы, поэтому я прошу помощи.

Моя установка

В моей локальной сети есть две сети: 192.168.0.0/24 и 10.11.12.0/24. Первый имеет DHCP, работающий на моем маршрутизаторе WAN, второй запускает dnsmasq на Ubuntu Server 20.04 на компьютере, который также служит маршрутизатором между двумя подсетями. Я настроил dnsmasq для обслуживания DHCP только в сети 10.11.12.0/24 с параметром no-dhcp-interface=wlp3s0, где wlp3s0 является интерфейсом на стороне 192.168.0.0/24.

Обобщить:

Маршрутизатор WAN (шлюз в WAN) — 192.168.0.1/24.
  Запускает DHCP для клиентов на 192.168.0.0/24

Роутер (ч/б подсети):
  Ubuntu Server 20.04 с двумя интерфейсами
    wlp3s0: 192.168.0.2/24 (статический IP-адрес)
    eno1: 10.11.12.1/24 (статический IP)

Я настроил iptables на FWD и NAT вот так.

iptables -t nat -A POSTROUTING -o wlp3s0 -j ​​MASQUERADE  
iptables -A FORWARD -i wlp3s0 -o eno1 -m состояние --state СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ  
iptables -A ВПЕРЕД -i eno1 -o wlp3s0 -j ​​ПРИНЯТЬ

Я разрешил DHCP через свой брандмауэр с помощью ufw разрешить 67/udp:

К действию от
-- ------ ----
67/udp РАЗРЕШИТЬ ВХОД ВСЕГДА

Кажется, все работает нормально. Однако по опыту я знаю, что запуск двух таких DHCP-серверов может вызвать конфликты, если они не строго разделены. (Клиенты, предназначенные для сети 192.168.0.0/24, не были бы слишком довольны, если бы DHCP предоставил им IP-адрес в сети 10.11.12.0/24!)

Обнаружение проблемы

Поэтому я сделал следующее, чтобы проверить это.Я настроил прослушивание tcpdump на интерфейсе wlp3s0 (192.168.0.2) и использовал nmap для имитации запроса DHCP Discover, исходящего от интерфейса eno1 (10.11.12.1/24), например так:

sudo tcpdump -i wlp3s0 -n порт udp 67 или порт 68

sudo nmap --script трансляция-dhcp-discover -e eno1

Как и ожидалось, я получаю предложение DHCP от dnsmasq, работающего на 10.11.12.1. Все идет нормально!

Некоторые детали для краткости опущены в выводе (он сказал)

Начиная с Nmap 7.80 ( https://nmap.org ) 22 декабря 2021 г. в 16:19 UTC
Результаты предварительного сканирования скрипта:
| широковещательный DHCP-обнаружение:
| Ответ 1 из 1:
| Предлагаемый IP: 10.11.12.53
| Тип сообщения DHCP: DHCPOFFER
| Идентификатор сервера: 10.11.12.1
| Адрес трансляции: 10.11.12.255
| Маска подсети: 255.255.255.0
| Сервер доменных имен: 10.11.12.1
|_ Маршрутизатор: 10.11.12.1

Однако tcpdump показывает, что оба DHCP-сервера отвечают на запрос обнаружения. (На самом деле, мой WAN-маршрутизатор отправляет 2 ответа!)

16:19:43.517029 IP 10.11.12.1.68 > 255.255.255.255.67: BOOTP/DHCP, запрос от de:ad:c0:de:ca:fe, длина 316
16:19:46.486227 IP 10.11.12.1.67 > 255.255.255.255.68: BOOTP/DHCP, ответ, длина 321
16:19:46.794207 IP 192.168.0.1.67 > 255.255.255.255.68: BOOTP/DHCP, ответ, длина 323
16:19:46.794207 IP 192.168.0.1.67 > 255.255.255.255.68: BOOTP/DHCP, ответ, длина 323

Похоже, что запрос на обнаружение DHCP перенаправляется в сеть 192.168.0.0/24 через интерфейс wlp3s0. Глядя на мои правила iptables и брандмауэра, я не вижу причин этому удивляться. Однако то, с чем я действительно борюсь, - это выяснить, как это предотвратить.

Что я пробовал

Я пробовал различные перестановки правил как в ufw, так и в iptables, но безрезультатно, вероятно, потому, что я не полностью понимаю ни iptables, ни ufw. Несколько примеров того, что я пробовал:

(Все правила ufw/iptables были добавлены вверху соответствующего набора/цепочки правил, чтобы обеспечить их выполнение.)

уфв:

# Ограничить 67/udp одним интерфейсом
ufw разрешить вход на eno1 proto udp с 0.0.0.0/0 на 0.0.0.0/0 порт 67

# Запретить маршрутизацию
ufw route deny in on eno1 out on wlp3s0 to 0.0.0.0/0 port 67 proto udp

IP-таблицы:

# Запретить переадресацию UDP-порта 67/68
iptables -I FORWARD 1 -p udp --match multiport --dports 67,68 -j DROP

# Отключить исходящий порт UDP 67
iptables -I ВЫВОД 1 -p udp --match multiport --dports 67,68 -o wlp3s0 -j ​​DROP

Мне, должно быть, не хватает фундаментального понимания того, как это работает, поскольку ничто из вышеперечисленного не мешает DHCP-маршрутизатору WAN получать обнаружение и предлагать IP-адрес в подсети 192.168.0.0/24.

Я где-то читал, что DHCP-серверы могут прослушивать необработанный (или пакетный?) сокет, который не подчиняется iptables. Это не относится к dnsmasq, как описано здесь. https://github.com/imp/dnsmasq/blob/master/FAQ#L195. Я также доказал это, удалив правило allow 67/udp в ufw, после чего dnsmasq перестает отвечать на обнаружение DHCP. Возможно, это удивительно (или нет), но даже с удалением правила разрешения в ufw мой маршрутизатор WAN продолжает получать и отвечать на обнаружение DHCP. Предположительно, потому что у меня есть правила iptables, настроенные для пересылки всего трафика, но нет эквивалентного правила INPUT (пока я не добавлю его с помощью ufw).

Чего я хотел бы достичь

Предпочтительно, я бы хотел, чтобы широковещательная рассылка DHCP в сети 10.11.12.0/24 не достигала даже сети 192.168.0.0/24.

Если это окажется трудным, я был бы рад просто предотвратить доступ предложений DHCP от моего WAN-маршрутизатора к сети 10.11.12.0/24.

Обратите внимание, что у меня нет проблем с сетью 192.168.0.0/24, поскольку я настроил dnsmasq так, чтобы он не предлагал DHCP на интерфейсе wlp3s0 (192.168.0.2). Похоже, это работает, и DHCP обнаруживает на wlp3s0 (192.168.0.2/24) не получает ответа от dnsmasq.

Итак, что мне не хватает? Я делаю это совершенно неправильно или я просто не совсем правильно понимаю? Буду признателен за любую оказанную помощь.

Счастливых праздников!

Обновлять

В ответ на вопрос в комментариях от @sleepyhead, вот моя настройка iptables nat.

Цепочка PREROUTING (политика ACCEPT 13452 пакетов, 4312К байт)
 pkts bytes target prot opt ​​in out source target

Цепочка INPUT (политика ACCEPT 48 пакетов, 12715 байт)
 pkts bytes target prot opt ​​in out source target

Цепочка OUTPUT (политика ACCEPT 87 пакетов, 10884 байта)
 pkts bytes target prot opt ​​in out source target

Цепочка POSTROUTING (политика ACCEPT 55 пакетов, 8622 байта)
 pkts bytes target prot opt ​​in out source target
   32 2262 МАСКАРАД все -- * wlp3s0 0.0.0.0/0 0.0.0.0/0

Обновление 2

Возможно ли, что это артефакт того, как я провожу тест? Что вызывает у меня подозрения, так это исходный IP-адрес вывода tcpdump. Может быть, запуск DHCP Discover на интерфейсе, у которого уже есть IP-адрес, дает другой результат, чем если бы его не было? В любом случае, если я смогу переназначить один из моих Raspberry Pis, я запущу этот тест с ним в качестве DHCP-клиента и посмотрю, получу ли я тот же результат, хотя я подозреваю, что получу.

флаг ru
Что вам нужно сделать, так это отключить один из DHCP-серверов и использовать механизм DHCP Relay для ретрансляции DHCP из одной сети в другую. Единственный способ сделать это - использовать специализированный NAT, который может быть проблематичным, или настроить ретрансляторы DHCP в сегментах сети, которые вы * хотите * не иметь DHCP-сервера и ретранслировать на другой DHCP-сервер. Это, кстати, то, как это делается в обычном мире, когда у вас есть сервер DHCP в подсети, отличной от сети, для которой вы делаете DHCP.
sleepyhead avatar
флаг in
2 ответа, которые вы видите от wan-маршрутизатора, одинаковы, вы видите входящий и исходящий, ваши интерфейсы почему-то кажутся мостовыми, потому что широковещательная рассылка на 255.255.255.255 не должна выходить за границы сети, а ваша — пересекает. Если вы держите мост, вы должны использовать межсетевой экран L2 с ebtables. Не позволяйте обсуждению необработанных сокетов сбить вас с толку, это скорее обсуждение реализации между ОС, чем описание вашей проблемы. ``` IP-адрес brctl-шоу ``` Они покажут вам мост между интерфейсами
флаг ng
Спасибо за ответ, но, согласно brctl show, моста нет (от этой команды нет вывода).
флаг ng
Я надеялся избежать этого. Моя основная причина наличия вторичного DHCP — обеспечить загрузку PXE в сети 10.11.12.0. Существует также дополнительная сложность, заключающаяся в том, что интерфейс Wi-Fi на этом устройстве довольно ненадежный, поэтому я бы не хотел полагаться на него для предоставления услуг DHCP для моей основной (192) сети. В худшем случае мне, возможно, удастся обойтись тем, что у меня есть, поскольку между двумя предложениями DHCP, по-видимому, существует достаточная задержка, поэтому мой предпочтительный DHCP, вероятно, всегда (?) будет выигрывать в сети 10.11.12.0, а в сети 192.168.0.0 не конфликтует с моей настройкой.
sleepyhead avatar
флаг in
Если это не мост, то трафик каким-то образом перехватывается, включая широковещательные рассылки, которые не будут отбрасываться, можете ли вы опубликовать вывод iptables? iptable -L v -n -t физ
флаг ng
Я добавил вывод к моему вопросу выше, спасибо.
Рейтинг:0
флаг ng

All sorted, @sleepyhead was onto something about the routing but the issue was much more mundane (or idiotic!) than bridged interfaces etc. There's a switch on the 10.11.12.0/24 network and it turns out I'd left a cable in it that was connected to one of my mesh routers! So there were in fact two routes out of the box to the 192.168.0.0/24 network, one via the wlp3s0 interface (correctly blocked in iptables) and another out via eno1, which obviously was open. This explains why I kept receiving responses from the WAN router and also, I think, why they were duplicated.

Well, blunders aside I hope this will be helpful to someone given how many questions are asked about DHCP and routing.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.