当同时使用 NAT 时,如何配置 DHCP 中继?

当同时使用 NAT 时,如何配置 DHCP 中继?

我有一台多宿主应用服务器,它为多个彼此不相连的网络提供服务(除了全部连接到服务器之外,每个网络都连接到其专用的网络接口)。其中一些网络具有重复的寻址,即可能有两个完全不同的网络使用 10.10.0.0/16 地址空间。我们无法更改这些网络的寻址,因此在这种情况下,我们通过静态一对一 NAT 将其中一个网络连接到服务器,这样从服务器的角度来看,网络就是 10.90.0.0/16。由于服务器应该在网络内有一个固定的预定义地址(例如 10.10.0.100),因此使用目标 NAT 和源 NAT,因此 NATed 网络可以使用地址 10.10.0.100 访问服务器,就像没有 NAT 一样。

到目前为止,在 NATing 机器上使用 iptables 一切都运行良好。但我们需要添加通过 PXE 在 NATed 网络中启动某些机器的功能。启动/DHCP 服务器当然是所讨论的多宿主服务器,所以我猜需要在 NAT 机器上添加 DHCP 中继。

我不知道如何配置中继以便将 NAT 也考虑在内,即请求 DHCP 的机器将被指向 10.10.0.100 作为 DHCP 服务器和启动源,但实际上将通过 NAT 与另一端的服务器进行通信。

执行 NAT 的机器是运行 OpenWRT 的虚拟机,因此最好使用 dnsmasq(OpenWRT 中默认安装)。我知道 dnsmasq 可以充当 DHCP 中继,但我不太了解配置此功能的参数。

当然,如果需要对 DHCP 服务器本身进行特定配置,例如涉及向客户端发送已转换(NAT 或非 NAT)的 IP 地址,那么这也是可以接受的。

这可能吗?如果可能,怎么做?

编辑:我认为上面的描述已经足够清楚了,但从提供的答案来看,我发现事实并非如此,所以我附上了一张图片来说明它现在是如何工作的。该服务器在多个接口上为多个网络提供服务,这里显示了其中两个具有重复地址空间的接口。在这两个网络中,主服务器的 IP 地址都是 10.10.0.100,也应该如此。

为直接连接的网络 1 提供 DHCP/PXE 没有问题。问题是,在 NAT 机器上放什么,以及(如果需要)如何重新配置​​ DHCP 服务器主服务器(不在 NAT 机器上)使 DHCP/PXE 也适用于网络 2? 在此处输入图片描述

NAT 配置如下所示。在主服务器上,到所有 NAT 网络(包括 10.90.0.0/16)的路由都指向网关 192.168.200.100 - 这是连接到主服务器的 NAT 机器接口的 IP 地址。主服务器上的连接接口的 IP 地址为 192.168.200.1(我没有在图片中包含这些地址)。一个 NAT 网络的示例 iptables 规则如下所示:

-A PREROUTING -s 192.168.200.1/32 -d 10.90.0.0/16 -j NETMAP --to 10.10.0.0/16
-A POSTROUTING -s 192.168.200.1/32 -d 10.10.0.0/16 -j MASQUERADE
-A PREROUTING -s 10.10.0.0/16 -d 10.10.0.100/32 -j DNAT --to-destination 192.168.200.1
-A POSTROUTING -s 10.10.0.0/16 -d 192.168.200.1/32 -j NETMAP --to 10.90.0.0/16

目标是允许服务器访问网络 10.10.0.0/16,就像它是 10.90.0.0/16 一样,反之亦然 - 网络 10.10.0.0/16 中的计算机访问服务器,就像它是 10.10.0.100 一样。因此这里同时使用了源 NAT 和目标 NAT。对于从 192.168.200.1 到网络 10.90.0.0/16 的数据包,源更改为 10.10.0.100,目标适当地映射到网络 10.10.0.0/16。对于从网络 10.10.0.0/16 到 10.10.0.100 的数据包,源映射到网络 10.90.0.0/16,目标更改为 192.168.200.1。

答案1

如果可能的话,我会为 tftp/boot 创建一个单独的 vlan/network/subnet。对于启动配置,cloudinit 也是需要考虑的。

在 /etc/firewall.user 中创建自定义脚本,内容如下:

#!/bin/sh
iptables -t nat -A POSTROUTING -o <OUTGOING_INTERFACE> -p udp --dport 67:68 -j MASQUERADE
chmod +x /etc/firewall.user

将 <OUTGOING_INTERFACE> 替换为您的传出网络接口的名称,例如 eth0 或 wan。

对于 dnsmasq 配置请参见此处的 tftp/boot 示例。 https://openwrt.org/docs/guide-user/base-system/dhcp_configuration

uci set dhcp.linux="boot"
uci set dhcp.linux.filename="/tftpboot/pxelinux.0"
uci set dhcp.linux.serveraddress="192.168.1.2"
uci set dhcp.linux.servername="fileserver"
uci add_list dhcp.linux.dhcp_option="option:root-path,192.168.1.2:/data/netboot/root"
uci commit dhcp
service dnsmasq restart

将 BOOTP 请求直接发送到 TFTP 服务器。告诉客户端从 192.168.1.2 的服务器加载 pxelinux.0,并从同一服务器上的 /data/netboot/root 挂载根目录。

顺便说一句,我推荐 opnsense 而不是 openwrt

编辑/更新 要使 dnsmasq 在 openwrt 中充当 dhcp 重放,请执行以下操作

nano /etc/config/dhcp

查找以 config dnsmasq 开头的部分。您可能需要添加或修改 dhcp-relay 选项。如果不存在,您可以添加它。以下是示例

config dnsmasq
    option domainneeded '1'
    option boguspriv '1'
    option filterwin2k '0'
    option localise_queries '1'
    option rebind_protection '1'
    option rebind_localhost '1'
    option local '/lan/'
    option domain 'lan'
    option expandhosts '1'
    option nonegcache '0'
    option authoritative '1'
    option readethers '1'
    option leasefile '/tmp/dhcp.leases'
    option resolvfile '/tmp/resolv.conf.auto'
    option localservice '1'
    option rebind_localhost '1'
    option local '/lan/'
    option domain 'lan'
    option expandhosts '1'
    option authoritative '1'
    option readethers '1'
    option leasefile '/tmp/dhcp.leases'
    option nonwildcard '1'
    option localise_queries '1'
    option localservice '1'
    option nonwildcard '0'
    option port '0'
    option rebind_protection '1'
    option rebind_localhost '1'
    option rebind_domainfile '/etc/resolv.conf.auto'
    option localservice '0'
    option dhcp_relayservers '192.168.1.1'  # Replace with your main server's IP

重新启动 dnsmasq。请记住,您需要最新的 openwrt 版本才能使其正常工作。

相关内容