![如何配置静态 IP 地址,但通过 DHCP 进行 DNS](https://linux22.com/image/866663/%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%E9%9D%99%E6%80%81%20IP%20%E5%9C%B0%E5%9D%80%EF%BC%8C%E4%BD%86%E9%80%9A%E8%BF%87%20DHCP%20%E8%BF%9B%E8%A1%8C%20DNS.png)
我在文件中配置了静态 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正确。但我希望它在启动时运行,但我不知道如何正确设置它。
答案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 我找到了我所寻找的东西......