28

基本上我的情况是我正在运行一个用于开发网站的虚拟机。

主机的 dns 指向运行 dnsmasq 的 VM,该 VM 解析各种开发站点的地址;即test.mysite.vm等

问题是,当我从工作网络转到家庭网络时,由于 VM 的 IP 发生了变化,一切都中断了。是否可以根据请求来自哪个接口提供不同的 IP 地址?还是我应该尝试以完全不同的方式解决这个问题?

谢谢你的帮助!


事实证明,毕竟有一个更简单的方法......

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

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

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

4

4 回答 4

40

您可以运行 的两个实例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.

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

于 2012-11-08T19:48:00.537 回答
31

在每个参数的开头添加接口对我来说很好。示例(在 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
于 2014-11-17T01:26:20.383 回答
25

虽然@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

# /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,--本地化查询

从 /etc/hosts 返回 DNS 查询的答案,这取决于接收查询的接口。如果 /etc/hosts 中的一个名称有多个与之关联的地址,并且这些地址中至少有一个与发送查询的接口位于同一子网上,则仅返回该子网上的地址. 这允许服务器在 /etc/hosts 中拥有与其每个接口对应的多个地址,并且主机将根据它们所连接的网络获得正确的地址。目前,此设施仅限于 IPv4。

于 2014-05-30T09:58:03.077 回答
9

或者,您也可以在 下创建多个配置文件/etc/dnsmasq.d/,一个用于您要服务 dhcp 的每个接口。

例如,如果您有两个名为wlan0and的无线接口wlan1,并且您想通过 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

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

于 2016-11-11T16:00:18.857 回答