暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何构建内网域名系统

生有可恋 2024-04-26
277

如果内网系统访问还在使用IP来进行访问,可以试着搭建域名系统,即DNS服务。因为域名比IP更好记,并且内部域名可以随意命名,比如 it.com、hisdb.com

为了防止域名冲突,内网域名可以使用DNS服务器的域名重写功能,这样就不怕和外网域名冲突了。

DNS的配置可以随DHCP服务一起下发,配合DHCP服务器实现IP和DNS自动分配。

在正确配置了DHCP服务及DNS服务的情况下,客户端的网络配置应该全部使用自动获取。

一般核心交换机都带DHCP功能,但在交换机上配置多网段DHCP功能会非常复杂。建议使用专用DHCP服务器实现静态和动态地址规划。我们使用的是雨滴科技的智能网关来实现DHCP功能。DHCP服务会将内网DNS下发到客户端。

DHCP服务需要支持静态IP池和动态IP池的分配,并且能够将IP固定住,不让其动态飘。动态IP策略不利于资产梳理和定位,最终要达到如下效果:使用DHCP分配,一旦分配后DHCP租约不再过期,保证MAC与IP绑定。

DNS 服务器需要支持外网域名解析转发与内网域名覆盖。当域名与内网域名冲突时,应使用内网域名覆盖外网域名。

内网DNS服务器使用的是 AdGuard 来提供DNS服务。AdGuard 是一款网络广告拦截工具,也可以当DNS服务器来使用。它有免费版和付费版,付费版提供了更多高级功能和定制选项。这里使用的是它的免费版,主要使用的它的DNS转发和重写功能:

内网的服务器IP、域名可以使用Git库来维护,通过脚本将IP、域名同步到AdGuard 中。之前对如何同步域名配置做过详细介绍:


如果只是小范围使用,可以使用系统的 hosts 文件代替 DNS 服务,比如在 git-bash 下将 DNS 配置同步到系统的 hosts 文件:

    $ cat DNS.txt >> /c/Windows/System32/drivers/etc/hosts
    复制

    需要注意的是修改 hosts 文件需要管理员权限,在运行 git-bash 时需要使用管理员权限运行。

    系统会优先使用 hosts 文件解析域名,使用 ipconfig 命令可以查看 hosts 文件配置是否生效:

      C:\> ipconfig flushdns
      C:\> ipconfig displaydns
      复制

      基于 hosts 的域名配置会一直在 dns 缓存中驻留,不会因 flushdns 而清空。

      日常维护可以使用 Git 库管理 IP 与域名的对照关系,允许一个 IP 有多个域名,我们使用的数据格式是:

        域名  IP  备注
        复制

        hosts 数据格式为:

          IP  域名
          复制

          AdGuard 的配置文件中使用的数据格式为:

              rewrites:
            - domain: oa.com
            answer: 10.1.1.8
            - domain: www.oa.com
                answer: 10.1.1.8
            复制

            在处理各种配置文件时可以通过 awk 或 python 进行灵活处理。比如将带备注的域名数据转 hosts,可以使用 awk 选择列:

              $ cat AdGuardHome.txt | \
              awk '{print $2"  "$1}'
              复制

              备注的域名数据转AdGuard配置,可以使用正则表达式结合文件插入:

                import re
                import sys


                # DNS.txt 数据格式
                # 域名 IP 备注
                s1 = 'DNS.txt'


                # 从 AdGuard 配置目录获取配置文件模板
                s2 = 'AdGuardHome.yaml_template'


                # 替换AdGuard配置文件中的 DNS 部分
                def dns2conf(f):
                L = []


                for line in f:
                s = line.split()
                        L.append(s)


                L.sort(key=lambda item: socket.inet_aton(item[1]))


                for i in L:
                print(" - domain: %s" % i[0]);
                print(" answer: %s" % i[1]);




                pattern0 = 'rewrites:'
                pattern1 = '- domain:'
                pattern2 = 'answer:'
                L = []


                f = open(s2, mode='r', encoding='utf-8')


                for line in f:
                match_rule = re.search(pattern0, line)
                match_name = re.search(pattern1, line)
                match_ip = re.search(pattern2, line)
                if match_rule:
                print(line, end='')
                with open(s1, mode='r', encoding='utf-8') as f1:
                dns2conf(f1)
                continue
                if match_name:
                continue
                elif match_ip:
                continue
                else:
                print(line, end='')


                f.close()


                复制

                全文完。

                如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。


                提示:下方是广告...

                文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论