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

Ian*_*ick 25 dns dnsmasq virtual-machine

基本上我的问题是我正在运行一个用于开发网站的虚拟机.

主机的dns指向正在运行dnsmasq的Vm,它解析了各种开发站点的地址,即test.mysite.vm等.

问题是当我从我的工作网络转到我的家庭网络时,它会因为虚拟机的IP发生变化而中断.是否可以根据请求来自哪个接口提供不同的IP地址?或者我应该尝试以完全不同的方式解决这个问题?

谢谢你的帮助!


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

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

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

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

kic*_*hik 29

您可以运行两个实例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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 实际上,你可以在同一个命令中多次使用`--dhcp-range =`来使它服务于两个网络.这可能实际上也适用于原始问题.它可能会根据接口的IP地址扣除正确的IP范围. (3认同)

smi*_*n62 23

在每个参数的开头添加接口对我来说很好.示例(在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
Run Code Online (Sandbox Code Playgroud)

我正在使用该版本:

$ dnsmasq --version
Version de Dnsmasq 2.68  Copyright (c) 2000-2013 Simon Kelley
Run Code Online (Sandbox Code Playgroud)

  • 当使用`dhcp-range`而不是`dhcp-host`时,也适用于我.这应该是当前dnsmasq版本的公认解决方案. (2认同)
  • @ user1885518我正在努力解决同样的问题,直到我在[手册页](http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html)中找到了这个问题:`标签"bootp"设置为BOOTP请求,并名字是在请求到达时也set.`接口的名称标签.因此总是有一个以请求到达的接口命名的标记.对于多VLAN的DHCP非常有用的. (2认同)

lik*_*eit 21

虽然@ kichik的答案可能很有效,但实现相同的更优雅的方法可能是使用localise-queries指令和单个dnsmasq服务器实例.

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

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

# /etc/dnsmasq.conf
localise-queries
Run Code Online (Sandbox Code Playgroud)

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

# /etc/hosts
127.0.0.1      dev-vm
192.168.1.1    dev-vm
10.0.0.1       dev-vm
Run Code Online (Sandbox Code Playgroud)

更改/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
Run Code Online (Sandbox Code Playgroud)

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

根据手册页,这将执行以下操作:

-y, - lococal-queries

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


Que*_*tin 7

另外,您还可以创建多个配置文件下,/etc/dnsmasq.d/你想提供DHCP每个接口之一.

例如,如果你有两个无线接口命名为wlan0wlan1,和你想成为他们DHCP感谢的dnsmasq,您可以创建两个文件在/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
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

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

  • 这是行不通的,因为dnsmasq只会顺序读取文件,并且/etc/dnsmasq.d/中的所有文件都被视为单一配置。 (3认同)