我的设置

我的设置

首先,我知道其他地方也问过我类似的问题(我读过很多这样的帖子!)但我无法找到解决问题的方法,所以我寻求帮助。

我的设置

我的 LAN 上有两个网络,192.168.0.0/24 和 10.11.12.0/24。前者在我的 WAN 路由器上运行 DHCP,后者在 Ubuntu Server 20.04 上运行 dnsmasq,该盒子也充当两个子网之间的路由器。我已将 dnsmasq 配置为仅在 10.11.12.0/24 网络上提供 DHCP,并使用 no-dhcp-interface=wlp3s0 选项,wlp3s0 是 192.168.0.0/24 端的接口。

总结一下:

WAN Router (gateway to WAN) is 192.168.0.1/24
  Runs DHCP for clients on 192.168.0.0/24

Router (b/w subnets):
  Ubuntu Server 20.04 with two interfaces
    wlp3s0: 192.168.0.2/24 (static IP)
    eno1:  10.11.12.1/24 (static IP)

我已将 iptables 配置为 FWD 和 NAT,如下所示。

iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE  
iptables -A FORWARD -i wlp3s0 -o eno1 -m state --state RELATED,ESTABLISHED -j ACCEPT  
iptables -A FORWARD -i eno1 -o wlp3s0 -j ACCEPT

我已允许 DHCP 通过我的防火墙ufw allow 67/udp

To                         Action      From
--                         ------      ----
67/udp                     ALLOW IN    Anywhere

一切似乎都运行良好。但是,根据我的经验,运行这样的两个 DHCP 服务器可能会导致冲突,除非它们严格分开。(如果 DHCP 为 192.168.0.0/24 网络的客户端提供 10.11.12.0/24 网络上的 IP 地址,那么它们会非常不高兴!)

发现问题

因此我做了以下测试。我设置了一个 tcpdump 监听 wlp3s0 接口 (192.168.0.2),并使用 nmap 模拟来自 eno1 接口 (10.11.12.1/24) 的 DHCP Discover 请求,如下所示:

sudo tcpdump -i wlp3s0 -n udp port 67 or port 68

sudo nmap --script broadcast-dhcp-discover -e eno1

正如预期的那样,我从在 10.11.12.1 上运行的 dnsmasq 获得了 DHCP 提供。到目前为止一切顺利!

为了简洁起见,输出中省略了一些细节(他说)

Starting Nmap 7.80 ( https://nmap.org ) at 2021-12-22 16:19 UTC
Pre-scan script results:
| broadcast-dhcp-discover:
|   Response 1 of 1:
|     IP Offered: 10.11.12.53
|     DHCP Message Type: DHCPOFFER
|     Server Identifier: 10.11.12.1
|     Broadcast Address: 10.11.12.255
|     Subnet Mask: 255.255.255.0
|     Domain Name Server: 10.11.12.1
|_    Router: 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, Request from de:ad:c0:de:ca:fe, length 316
16:19:46.486227 IP 10.11.12.1.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 321
16:19:46.794207 IP 192.168.0.1.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 323
16:19:46.794207 IP 192.168.0.1.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 323

DHCP 发现请求似乎通过 wlp3s0 接口转发到 192.168.0.0/24 网络。查看我的 iptables 和防火墙规则,我发现没有什么理由对此感到惊讶。然而,我真正苦苦挣扎的是弄清楚如何防止这种情况发生。

我尝试过的方法

我尝试过 ufw 和 iptables 中的各种规则排列,但无济于事,可能是因为我不完全了解 iptables 或 ufw。以下是我尝试的一些示例:

(所有 ufw/iptables 规则都添加到相应规则集/链的顶部,以确保它们被命中。)

ufw:

# Restrict 67/udp to one interface
ufw allow in on eno1 proto udp from 0.0.0.0/0 to 0.0.0.0/0 port 67

# Deny routing
ufw route deny in on eno1 out on wlp3s0 to 0.0.0.0/0 port 67 proto udp

iptables:

# Prevent forwarding of UDP port 67/68
iptables -I FORWARD 1 -p udp --match multiport --dports 67,68 -j DROP

# Drop outbound UDP port 67
iptables -I OUTPUT 1 -p udp --match multiport --dports 67,68 -o wlp3s0 -j DROP

我肯定缺乏对其工作原理的一些基本了解,因为上述任何一项都无法阻止 WAN 路由器 DHCP 接收发现并在 192.168.0.0/24 子网上提供 IP。

我确实在某处读到过,DHCP 服务器可能会监听原始(或数据包?)套接字,而这不受 iptables 的约束。dnsmasq 并非如此,如本文所述https://github.com/imp/dnsmasq/blob/master/FAQ#L195。我还通过删除 ufw 中的允许 67/udp 规则证明了这一点,此后 dnsmasq 停止响应 DHCP 发现。也许令人惊讶(或不令人惊讶),即使在 ufw 中删除了允许规则,我的 WAN 路由器仍会继续接收并响应 DHCP 发现。大概是因为我已将 iptables 规则配置为转发所有流量,但没有等效的 INPUT 规则(直到我使用 ufw 添加一个)。

我想要实现的目标

我最好阻止 10.11.12.0/24 网络上的 DHCP 发现广播甚至到达 192.168.0.0/24 网络。

如果这很困难,我很乐意阻止来自我的 WAN 路由器的 DHCP 提供到达 10.11.12.0/24 网络。

请注意,由于我已将 dnsmasq 配置为不在 wlp3s0 接口 (192.168.0.2) 上提供 DHCP,因此我在 192.168.0.0/24 网络上没有遇到问题。这似乎有效,并且 wlp3s0 (192.168.0.2/24) 上的 DHCP 发现没有收到来自 dnsmasq 的回复。

那么我遗漏了什么?我的做法完全错了吗?还是我做得不太对?任何帮助都非常感谢。

节日快乐!

更新

为了回答@sleepyhead 评论中的一个问题,这是我的 iptables nat 设置。

Chain PREROUTING (policy ACCEPT 13452 packets, 4312K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 48 packets, 12715 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 87 packets, 10884 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 55 packets, 8622 bytes)
 pkts bytes target     prot opt in     out     source               destination
   32  2262 MASQUERADE  all  --  *      wlp3s0  0.0.0.0/0            0.0.0.0/0

更新 2

这是否可能是我进行测试时产生的假象?让我怀疑的是 tcpdump 输出的源 IP。在已经有 IP 的接口上运行 DHCP Discover 会产生与没有 IP 时不同的结果吗?无论如何,如果我可以重新利用我的一台 Raspberry Pi,我会用它作为 DHCP 客户端运行此测试,看看我是否会得到相同的输出,尽管我怀疑我会得到相同的输出。

答案1

一切都搞定了,@sleepyhead 发现了一些关于路由的问题,但这个问题比桥接接口等更平凡(或愚蠢!)。10.11.12.0/24 网络上有一个交换机,结果发现我把一根电缆留在了里面,这根电缆连接到我的一个网状路由器!因此,实际上有两条开箱即用的路由到 192.168.0.0/24 网络,一条通过 wlp3s0 接口(在 iptables 中正确阻止),另一条通过 eno1 发出,这显然是开放的。这解释了为什么我一直收到来自 WAN 路由器的响应,我想,这也是为什么它们会重复。

好吧,抛开错误不谈,我希望这会对那些关于 DHCP 和路由的问题有所帮助。

相关内容