如何配置静态 IP 地址,但通过 DHCP 进行 DNS

如何配置静态 IP 地址,但通过 DHCP 进行 DNS

我在文件中配置了静态 IP 地址/etc/网络/接口

auto eth0
iface eth0 inet static
    address 10.152.187.122
    gateway 10.152.187.1
    netmask 255.255.255.0

但我想DNS自动配置DHCP。例如,如果我运行 dhclient,它会填充/etc/resolv.conf正确。但我希望它在启动时运行,但我不知道如何正确设置它。

这是Ubuntu 12.04(Precise Pangolin)云镜像

答案1

使用 DHCP,您可以获得路由器从互联网服务提供商 (ISP) 获取 IP 地址时获得的 DNS 名称服务器地址。您可以像这样使用路由器拥有的 DNS 名称服务器地址:

auto eth0
iface eth0 inet static
  address 10.152.187.122   
  netmask 255.255.255.0
  gateway 10.152.187.1
  dns-nameservers 10.152.187.1

答案2

您所要求的本质上是静态 IP 与 DHCP DNS 的混合配置。没有这种类型的网络设置 - 您要么有静态,要么有 DHCP。

不过,您可以在配置中明确定义 DNS 名称服务器,如下所示。这样可以保留静态地址,但遗憾的是无法动态设置 DNS(在像这样的混合设置中实际上不可能)。

auto eth0
iface eth0 inet static
  address 10.152.187.122
  netmask 255.255.255.0
  gateway 10.152.187.1
  dns-nameservers 10.152.187.1
  dns-nameservers 8.8.8.8
  dns-nameservers 8.8.4.4
  ...

TL;DR:没有办法获取 DHCP DNS、静态 IP,除非您在路由器的 DHCP 分配表中设置了静态条目 - 这保证您始终可以获得该 IP,因为它已经专门为该特定系统/MAC 地址保留

答案3

我还对不使用其他信息从 DHCP 查询 DNS 服务器感兴趣。

Dhcpcd 可能允许查询它(dhcpcd -o domain_name_servers -T),但我找不到 dhclient 的任何内容。

除了使用修改后的 dhclient(参见在 GitHub 上在 Stack Overflow 上)或测试客户端(就像在这个博客里一样)或不同的脚本(在 Stack Overflow 上查看)我找到了一个 powershell 解决方案在 indented.co.uk 上

这让我想到使用 Linux 上的“基础知识”,最终我使用精心制作的 dhcp 请求printf

有些字段可能是伪造的(如 mac aa:bb:cc:dd:ee:ff),但它包含选项 53=0x35(长度 1/值 1 = 请求)和 55=0x37(长度 1/值 6 用于 DNS)。

对于广播,socat 用于:

printf "\x1\x1\x6\x0\xd3\x44\x33\xeb\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xaa\xbb\xcc\xdd\xee\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x63\x82\x53\x63\x35\x01\x01\x37\x01\x06\xff" |  socat - UDP4-DATAGRAM:255.255.255.255:67,broadcast

类似 socat 用于接收回复

socat -u udp-recv:68,reuseaddr -

或者

socat -u udp-recv:68 - | dd bs=1 skip=$( printf "%d" 0xec )

使用 xxd 我找到了我所寻找的东西......

相关内容