dnsmasq,根据使用的接口提供不同的IP地址。

28

基本上我的情况是我运行了一个虚拟机来开发网站。

主机的 DNS 指向运行 dnsmasq 的 VM,dnsmasq 解析各种开发网站的地址; 例如 test.mysite.vm 等。

问题在于,当我从工作网络切换到家庭网络时,它都会中断,因为 VM 的 IP 更改了。是否可能根据请求来自哪个接口提供不同的 IP 地址?还是我应该尝试以完全不同的方式解决这个问题?

感谢您的帮助!


结果证明,这实际上有一个更简单的方法...

现在我在 VM 上设置了 2 个接口,并且不需要使用 dnsmasq。

第一个接口只是一个桥接/共享接口,允许 VM 使用主机可用的任何互联网连接,在每次移动办公室时重新启动网络。

第二个接口是连接到我的 VM 主机的私有连接,具有静态 IP 地址。这是我用来连接和绑定任何服务(如 nginx、mysql 等)的接口。


不同的接口在哪里发挥作用?您是否在家庭网络和工作网络中使用两个不同的接口?虚拟机的IP为什么会改变? - kichik
是的,这是针对家庭(192.168.0.*)和工作(10.0.0.*)两个不同接口的设置。更改在于工作IP和家庭IP之间的切换。 - Ian Chadwick
5个回答

42

您可以运行两个dnsmasq实例,每个实例可以监听不同的接口。您可以使用--interface=X--bind-interfaces选项来完成此操作。默认情况下,它还会绑定回环设备lo,如果两个进程尝试绑定它,则会失败。使用--except-interface=lo来避免这种情况。

dnsmasq --interface=eth0 --except-interface=lo --bind-interfaces --dhcp-range=192.168.0.2,192.168.0.10,12h
dnsmasq --interface=eth1 --except-interface=lo --bind-interfaces --dhcp-range=10.0.0.2,10.0.0.10,12h

在测试时,请确保您的配置文件为空,因为它始终会覆盖命令行。您也可以使用--conf-file=/dev/null

正如我在评论中提到的,我不太确定这如何帮助您的情况,但它可能有助于其他尝试在两个不同接口上获取两个不同地址范围的人。


真的没有办法在不运行多个实例的情况下使用两个网络吗?这会让事情变得非常复杂。 - TheLQ
3
您可以在同一命令中多次使用--dhcp-range =,以便它为两个网络提供服务。这对于原始问题也可能有效。它可能会根据接口的IP地址自动减去正确的IP范围来提供服务。 - kichik
请确保在配置文件中注释掉配置选项listen-address=0.0.0.0,例如:#listen-address=0.0.0.0 - Tobias Hochgürtel
1
如果你的接口之一由外部DHCP服务器(例如你的ISP)提供服务,另一个选择可能是使用localise-queries选项。有关详细信息,请参见此答案 - likeitlikeit
不错的解决方案,但是如何在启动时启用这两个实例? - a7md0

34

在每个参数的开头添加接口对我来说很有效。 例如(在dnsmasq.conf中):

dhcp-host=eth0,00:22:43:4b:18:43,192.168.0.7
dhcp-host=eth1,00:22:43:4b:18:43,192.168.1.7

我正在使用这个版本:

$ dnsmasq --version
Version de Dnsmasq 2.68  Copyright (c) 2000-2013 Simon Kelley

5
使用 dhcp-range 而不是 dhcp-host 对我也有效。这应该是当前 dnsmasq 版本的可接受解决方案。 - Dynalon
1
@Dyna 它可以工作,但是没有文档说明,或者我错过了什么? - Murmel
5
我曾经也苦恼于同样的问题,直到在man手册中找到这句话:“对于BOOTP请求,标签“bootp”被设置,并且还设置了一个名为接收请求的接口名称的标签。”因此,总是有一个以请求到达的接口命名的标签。对于多VLAN DHCP非常有用。 - GnP
使用单个 dnsmasq 实例为多个 DHCP 客户端提供最佳解决方案。 - user3091673

26

虽然 @kichik 的答案可能行得通,但更加优雅的方法是使用 localise-queries 指令和一个单独的 dnsmasq 服务器实例来实现同样的功能。

我假设您已经为不同接口配置了DHCP范围,并将 dnsmasq 绑定到这些范围。

将 (部分记录在案的) localise-queries 选项添加到您的 dnsmasq.conf 文件中。

# /etc/dnsmasq.conf
localise-queries

然后,确保dnsmasq读取的其中一个主机文件(例如/etc/hosts)包含两个网络的IP地址条目,如下所示:

# /etc/hosts
127.0.0.1      dev-vm
192.168.1.1    dev-vm
10.0.0.1       dev-vm

除了修改/etc/hosts文件外,另一种方法是在您的dnsmasq.conf文件中指定地址:

一个替代方案是在dnsmasq.conf文件中指定地址,而不是更改/etc/hosts文件:

# /etc/dnsmasq.conf
localise-queries
host-record=dev-vm,127.0.0.1
host-record=dev-vm,192.168.1.1
host-record=dev-vm,10.0.0.1

因此,在这两种情况下,dnsmasq将仅为接收到该特定接口查询的匹配该接口IP和网络掩码的IP提供服务。

根据手册页面的描述:

-y, --localise-queries

返回来自/etc/hosts的DNS查询答案,这些查询答案依赖于接收查询的接口。如果/etc/hosts中的名称有多个关联地址,并且这些地址中至少有一个与发送查询的接口位于同一子网上,则仅返回该子网上的地址。这允许服务器在/etc/hosts中具有与其每个接口相对应的多个地址,并且基于它们所连接到的网络,主机将获取正确的地址。目前,此功能仅限于IPv4。


11

或者您还可以在 /etc/dnsmasq.d/ 下创建多个配置文件,每个文件为您想要提供dhcp服务的接口创建一个。

例如,如果您有两个无线接口分别命名为 wlan0wlan1,并且您想要通过dnsmasq为它们提供dhcp服务,您可以在 /etc/dnsmasq.d/ 下创建两个文件来配置每个接口:

/etc/dnsmasq.d/dnsmasq-wlan0.conf:

interface=wlan0         # Use interface wlan0
listen-address=10.0.0.1 # Explicitly specify the address to listen on
bind-interfaces         # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8          # Forward DNS requests to Google DNS
domain-needed           # Don't forward short names
bogus-priv              # Never forward addresses in the non-routed address spaces.
dhcp-range=10.0.0.50,10.0.0.150,12h # Assign IP addresses between 10.0.0.50 and 10.0.0.150 with a 12 hour lease time

/etc/dnsmasq.d/dnsmasq-wlan1.conf:

interface=wlan1         # Use interface wlan0
listen-address=20.0.0.1 # Explicitly specify the address to listen on
bind-interfaces         # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8          # Forward DNS requests to Google DNS
domain-needed           # Don't forward short names
bogus-priv              # Never forward addresses in the non-routed address spaces.
dhcp-range=20.0.0.50,20.0.0.150,12h # Assign IP addresses between 20.0.0.50 and 20.0.0.150 with a 12 hour lease time

对我来说,这是一种非常干净的配置系统的方式,并且使配置在重新启动之间持久存在。

你能帮我解决类似的情况吗?我无法找到解决方案。http://serverfault.com/questions/825601/dnsmasq-config-for-captive-portal - 55597
6
这样做行不通,因为dnsmasq只会按顺序读取文件,并且/etc/dnsmasq.d/目录下的所有文件都被视为单个配置文件。 - Dingo
这是特定于发行版的行为。 - John Leuenhagen

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接