V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
探索世界的好奇心万岁
Mark24
V2EX  ›  分享发现

组建局域网 01_搭建 DNS 服务器给设备专属域名

  •  
  •   Mark24 · 59 天前 · 1137 次点击
    这是一个创建于 59 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的博客地址

    https://mark24code.github.io/%E5%88%86%E4%BA%AB%E4%B8%8E%E5%88%9B%E9%80%A0/2021/11/23/%E7%BB%84%E5%BB%BA%E5%B1%80%E5%9F%9F%E7%BD%9101_%E6%90%AD%E5%BB%BADNS%E6%9C%8D%E5%8A%A1%E5%99%A8.html


    背景:

    在家庭局域网中,我们有若干个设备连接在同一台路由其中。路由器和下属设备形成了一个小型局域网。

    我们可以在局域网中通过 ip 互相访问。这是一般情况。

    目标

    我希望可以给局域网中的设备专门的域名。

    方法

    完成这个目标其实有很多方法。

    1. 路由器功能

    比较新的路由器也许有更改 hosts 的功能。小米路由器之前是有的。现在没了。

    我要重点介绍的就是第二个方法

    2. Dnsmasq

    Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq 可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为 DHCP 服务器,dnsmasq 可以用于为局域网电脑分配内网 ip 地址和提供路由。DNS 和 DHCP 两个功能可以同时或分别单独实现。dnsmasq 轻量且易配置,适用于个人用户或少于 50 台主机的网络。此外它还自带了一个 PXE 服务器。

    更详尽的功能可以查看 Dnsmasq 的 wiki 。

    Dnsmasq 具体操作

    1. 安装 Dnsmasq

    各大发行版都有自己的安装方式,以 Ubuntu 为例

    sudo apt install dnsmasq
    

    2. 配置 dnsmasq

    先备份原始的 dnsmasq.conf 养成好习惯

    sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
    

    编辑/etc/dnsmasq.conf

    sudo vim /etc/dnsmasq.conf
    

    文件最下方新增

    # /etc/dnsmasq.conf
    resolv-file=/etc/resolv.dnsmasq.conf
    strict-order
    listen-address=127.0.0.1
    listen-address=192.168.31.223
    

    dnsmasq.conf 默认有很多设置,我们分别解读下我们设置的。

    第一行,resolv-file... 主要是指向另一个文件 我们这里指向的是自定义/etc/resolv.dnsmasq.conf,如果这里不指定会自动生成一个默认的 resolv 配置,会导致解析问题。

    #文件 /etc/resolv.dnsmasq.conf
    
    # google 的 CDN
    nameserver 8.8.8.8
    nameserver 8.8.4.4
    
    # 运营商的 114
    nameserver 114.114.114.114
    
    # 阿里的
    nameserver 223.5.5.5
    
    # 腾讯的
    nameserver 119.29.29.29
    
    

    这里主要配置了一些 DNS 服务器,记住一定要配置。否则不论是本机还是未来在局域网中被指向都无法解析域名。

    第二行

    strict-order 是指按照制定顺序解析 DNS

    第三行、第四行分别是监听本机、局域网中本地地址(作为局域网中服务器)。

    3. 启动 dnsmasq 服务

    这里使用 systemd 的方式

    # 启动服务
    sudo systemctl start dnsmasq  
    
    # 查看服务状态
    sudo systemctl status dnsmasq
    
    

    以本机为例,输出如下

    ➜  ~ sudo systemctl status dnsmasq    
    ● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
       Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
       Active: active (running) since Wed 2021-11-24 23:41:46 CST; 3s ago
      Process: 2075 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)
      Process: 2076 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=0/SUCCESS)
      Process: 2085 ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf (code=exited, status=0/SUCCESS)
     Main PID: 2084 (dnsmasq)
        Tasks: 1 (limit: 4915)
       CGroup: /system.slice/dnsmasq.service
               └─2084 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,20326,8,2,e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc6834571
    
    11 月 24 23:41:46 mark-pi400 dnsmasq[2084]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify dumpfile
    11 月 24 23:41:46 mark-pi400 dnsmasq[2084]: reading /etc/resolv.dnsmasq.conf
    11 月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 8.8.8.8#53
    11 月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 8.8.4.4#53
    11 月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 114.114.114.114#53
    11 月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 223.5.5.5#53
    11 月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 119.29.29.29#53
    11 月 24 23:41:46 mark-pi400 dnsmasq[2084]: read /etc/hosts - 10 addresses
    11 月 24 23:41:46 mark-pi400 dnsmasq[2085]: Too few arguments.
    11 月 24 23:41:46 mark-pi400 systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.
    
    
    

    systemd 的展示非常友好,可以看到成功了解析了我们设置的 DNS server 并且也解析了 /etc/hosts

    我们可以在 hosts 文件中定义一些局域网的静态 IP 和我们想要赋予的域名,这样子可以在局域网通过域名访问设备

    让我们开始编辑 hosts

    sudo vim /etc/hosts
    

    比如我把 29 地址 命名为 my-linux-server.home

    127.0.0.1	localhost
    ::1		localhost ip6-localhost ip6-loopback
    ff02::1		ip6-allnodes
    ff02::2		ip6-allrouters
    
    # custom LAN dns
    192.168.31.29 my-linux-server.home
    
    

    然后我们重启下 dnsmasq 服务

    # 重启服务
    sudo systemctl restart dnsmasq 
    
    
    # 如果我们希望每次开启也启动服务
    sudo systemctl enable dnsmasq 
    
    # 顺带提议下关闭
    # 关闭开启启动服务
    sudo systemctl disable dnsmasq 
    
    # 关闭服务
    sudo systemctl stop dnsmasq 
    
    

    设置你的路由器

    我们已经设置好一个 DNS 服务器

    接下来,进入你的路由器管理界面,使用你的设置,把你路由器的 DNS 服务器指向刚才机器在局域网的静态 IP 。

    也可以配置你的电脑的 DNS 指向这个地址。

    一个建议是,保留原始的 DNS 主机地址比如我这里

    192.168.1.1
    
    192.168.31.223
    

    第一个是我的原始路由器的 DNS 地址

    第二个是我设置的地址,这样子可以作为补充。

    Tip

    1. 如果你 dnsmasq 设置没有继承 路由器主机的 DNS 服务,可以设置第二个 DNS 服务器为路由器主机

    这样保证了原来的状态。

    小结

    假设我们前面设置 DNS 的机器是 A 。我们通过路由器设置了 DNS 服务器指向 A 。

    我们可以通过修改 A 的 hosts 文件和重启 dnsmasq 服务,让整个局域网读取我们的配置,完成一个 ip 和域名的映射。这样我们可以在局域网内使用域名命名设备然后访问。

    检验

    我们可以 ping 下设备域名

    ping my-linux-server.home
    
    

    也可以安装

     sudo apt install dnsutils
    

    之后使用

    dig my-linux-server.home
    

    来查看 DNS 解析情况

    补充说明

    1. 缓存

    A 做好设置,局域网内部 B 电脑 ping 不到定义的主机怎么办? 可能是 DNS 缓存。 参考如下:

    https://ubuntututorials.org/flush-dns-cache-ubuntu-20-04/

    基本上等待一会就生效了。

    1. net-tools

    包含 ifconfig 可以查看 ip

    1. dnsutils

    包含 dig 可以查看 dns 情况


    有更好的方法,也可以告诉我~

    11 条回复    2021-11-26 11:41:30 +08:00
    yaott2020
        1
    yaott2020  
       59 天前 via Android
    我也搞了,不过 dns 服务器放在云端,多地局域网,直接指定后缀指定云端服务器即可
    pupboss
        2
    pupboss  
       59 天前
    有些操作系统可以直接解析 xxx.local ,全自动的啥也不用改,其他的估计就只能自己配置了
    crayygy
        3
    crayygy  
       59 天前
    谢谢,之前也打算利用家里闲置的 Pi3 做一个内网 DNS 来着,回去翻一翻洗洗灰
    blessyou
        4
    blessyou  
       59 天前
    我都是 openwrt 里面设置别名
    Mark24
        5
    Mark24  
    OP
       59 天前
    @yaott2020 66666
    xgfan
        6
    xgfan  
       59 天前   ❤️ 1
    这玩意不用这么麻烦。
    一般路由器都自带了。
    DHCP 会下发 search domain 。
    客户端解析主机名的时候,会自动带上 search domain 。
    路由器会把带 search domain 的域名解析通过 DHCP lease 文件进行匹配。
    -----
    简而言之,给自己的电脑起个正常名字,比如 pc ,然后在局域网内用这个 pc 或者 pc.lan/pc.local 就可以访问了。
    SteveLee
        7
    SteveLee  
       58 天前
    其实不用这么麻烦的,用 bonjour 就可以了,在需要访问的电脑上配置好之后,通过 hostname.local 就可以访问了
    SAGAN
        8
    SAGAN  
       58 天前
    随便申请个域名,然后直接把 dns 记录配置到域名里。

    我就是这样搞的,家里的设备都绑定了 *.h.example.com 这种域名。注意 OpenWrt 的 dnsmasq 默认开启了 rebind 保护,需要在配置里加一行 rebind-domain-ok=/example.com/ 允许解析到私有地址。

    这样做好处是:
    1. 更换路由或者路由器刷固件后不需要重新配置。
    2. 配合 zerotier 等跨区域组网工具使用时,在其他网络环境下也可以直接用域名访问家里设备。
    Mark24
        9
    Mark24  
    OP
       58 天前
    除了单纯电脑场景,这个方案也适合家里有 自制 LOT 设备。

    .lan .local 貌似有局限
    Mark24
        10
    Mark24  
    OP
       58 天前
    LOT -> IOT
    yaott2020
        11
    yaott2020  
       58 天前 via Android
    @Mark24 不要使用.lan .local 这类域名,都是被使用过的
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2455 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 195ms · UTC 10:00 · PVG 18:00 · LAX 02:00 · JFK 05:00
    ♥ Do have faith in what you're doing.