如何在 Linux 下设置 dnsmasq 以使用通配符域名通过 lando/docker 进行本地 Web 开发?

如何在 Linux 下设置 dnsmasq 以使用通配符域名通过 lando/docker 进行本地 Web 开发?

我最近发现兰多用于本地 Web 开发,在后台使用 docker。到目前为止,它运行良好,但我必须手动将每个项目的每个域添加到我的 hosts 文件中

/etc/hosts

127.0.0.1   myproject.local.host
127.0.0.1   bs.myproject.local.host
127.0.0.1   bs-admin.myproject.local.host

bs.bs-admin.1 代表浏览器同步

根据lando 文档,可以使用通配符域,而不必对每个域进行硬编码。不幸的是,这些说明适用于 MacOS,而我使用的是 Arch Linux(Manjaro Gnome 41.3)。
我试图在页面的帮助下自己弄清楚Arch Wiki:Dnsmasq和其他在线资源,但我无法让它发挥作用。

这是我目前拥有的:

  • 已安装域名管理系统 sudo pacman -S dnsmasq
  • 将这些行添加到/etc/dnsmasq.conf文件中(文件中的所有其他内容已被注释掉):
    listen-address=::1,127.0.0.1
    expand-hosts
    domain=local.host
    
  • 重新启动本地服务器sudo systemctl restart httpdsudo systemctl restart dnsmasq
  • 将此行添加到~/.lando/config.yml
    domain: local.host
    
  • 重新启动 landolando powerofflando start

但是,它不起作用:

❯ ping http://myproject.local.host:8000/          
ping: http://myproject.local.host:8000/: Name or service not known
❯ ping http://myproject.local.host      
ping: http://myproject.local.host: Name or service not known
❯ ping https://myproject.local.host      
ping: https://myproject.local.host: Name or service not known

添加以下几行/etc/resolv.conf也无济于事:

nameserver 127.0.0.1

更新:

dnsmasq.conf我仍然对( dnsmasq.d)、etc/hostsetc/resolv.conf如何/etc/systemd/resolved.conf相互作用感到困惑。但经过更多的阅读和反复试验后,我目前的情况如下:

  • 将此行添加到/etc/dnsmasq.conf
    address=/local.host/127.0.0.1
    
  • 没有添加任何行/etc/hosts 这些行来自StevenBlack/主持人
    127.0.0.1 localhost
    127.0.0.1 localhost.localdomain
    127.0.0.1 local
    255.255.255.255 broadcasthost
    ::1 localhost
    ::1 ip6-localhost
    ::1 ip6-loopback
    fe80::1%lo0 localhost
    ff00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    ff02::3 ip6-allhosts
    0.0.0.0 0.0.0.0
    
  • 将此行添加到/etc/resolv.conf
    nameserver 127.0.0.1
    
  • 跑了sudo systemctl restart NetworkManagersudo systemctl restart dnsmasq
  • 将此行添加到~/.lando/config.yml
    domain: local.host
    
  • 跑了lando powerofflando start

当我测试它时,我得到了这个:

❯ nslookup foo.local.host localhost    
Server:     localhost
Address:    ::1#53

Name:   foo.local.host
Address: 127.0.0.1
❯ nslookup foo.local.test          
Server:     192.168.2.1
Address:    192.168.2.1#53

** server can't find foo.local.test: NXDOMAIN
❯ ping foo.local.host       
ping: foo.local.host: Name or service not known

lando start显示前两个网址绿色的底部两个红色的

APPSERVER URLS  https://localhost:49291                      
                http://localhost:49292                       
                http://myproject.local.host:8000/          
                https://myproject.local.host/    

答案1

nslookup工具很简单:它总是读取 /etc/resolv.conf 并直接与该文件中找到的任何 DNS 服务器通信。但是,如果该文件中有多个nameserver行,它只会使用其中一行,通常是第一行。

需要记住的是,resolv.conf 中的其他名称服务器不会被“合并”。它们仅在第一个名称服务器完全无法访问时用作后备。但如果第一个服务器回答“我不知道 foo.local.test”,这就是最终结果– 如果其中一个服务器知道该名称,nslookup 或任何其他程序都不会继续尝试其他服务器。

如果你的 resolv.conf 列出了特殊的 dnsmasq 实例,那么不应该还列出您的路由器或任何其他 DNS 服务器 - 您的所有 DNS 查询都应通过 dnsmasq(如果需要,它会将它们转发到“真实”服务器)。

Systemd-resolved 是一个单独的主题。当它处于活动状态时,大多数程序(dig/nslookup 除外)都会直接与它通信,绕过传统的 /etc/resolv.conf 机制。Systemd-resolved 本身有两种模式:要么读取 resolv.conf,要么提供解决.conf。

因此,如果您使用 systemd-resolved 和 NetworkManager,通常应首先通过 NetworkManager(连接配置文件)更改 DNS 服务器,然后将其传播到 systemd-resolved。但如果您想手动编辑 resolv.conf,请先使用ls -l以确保它不是符号链接到 systemd 解析的管理文件之一。如果需要,请将其删除并替换为常规文件。


此外,这些是唯一有用/etc/hosts 中的以下行:

127.0.0.1 localhost
::1 localhost

其余的都完全没用,即使它恰好来自 Debian。

答案2

经过多次反复试验和阅读在线资源后,我找到了一个似乎可行的版本。

免责声明:我非常怀疑这是正确的做法,可能还有更好的方法。我也不知道所有这些步骤是否必要,或者我的设置会给我的系统带来什么样的负面影响,我还没有注意到。

之前的问题

  • NetworkManager 正在覆盖/etc/resolv.conf,因此我所做的任何更改都可以通过运行来恢复sudo systemctl restart NetworkManager Arch Wiki:网络管理器
  • Firefox 中缺少证书Lando 文档

工作版本

  1. 将此行添加到/etc/dnsmasq.conf
    address=/local.host/127.0.0.1
    
  2. 保持/etc/hosts原样
  3. 创建/etc/NetworkManager/conf.d/dns.conf内容文件:
    [main]
    dns=none
    
  4. nameserver 127.0.0.1在顶部添加/etc/resolv.conf,对我来说看起来像这样:
    nameserver 127.0.0.1
    nameserver 192.168.2.1
    nameserver fe80::1%enp0s20u2u4
    
  5. 跑步
    systemctl restart dnsmasq
    systemctl restart NetworkManager
    
  6. 将此行添加到~/.lando/config.yml
    domain: local.host
    
  7. 跑步
    lando poweroff
    lando rebuild -y
    
  8. 跑步
    sudo trust anchor ~/.lando/certs/local.host.pem
    sudo trust anchor ~/.lando/certs/local.host.crt
    

更新

该解决方案不是持久的,内容/etc/resolv.conf会被 NetworkManager 覆盖,例如重新启动后,它还会导致我的 wifi 连接出现问题。

相关内容