C03S03-Linux网络之DNS服务器

一、DNS

1. DNS概述

DNS(域名系统、Domain Name System)是将域名和IP地址相互映射的一个分布式数据库,方便用户访问互联网。IP地址是互联网上所有设备的唯一标识,设备之间的通信依赖于IP地址。DNS使得用户在访问网站时不需要记住复杂的数字IP地址,而是可以使用容易记忆的域名。DNS使用的端口是53号端口,它同时支持TCP和UDP协议;UDP适用于快速解析域名,TCP适用于区域传输,也就是与主域名服务器通信查询解析是否正确。

2. 域名结构

域名是以点分隔,被分为若干个部分,从右到左依次阅读。以百度完整域名为例:

www.baidu.com.cn.
  • .:根域名,最高一级的域名,类似Linux系统里的根目录。在实际使用中会省略。
  • .cn:顶级域名,也叫做一级域名。一般代表一种类型的组织机构或者国家地区。
  • .com.cn:二级域名。代表顶级域内的一种类型的组织机构。
  • baidu.com.cn:注册该域名的实体。
  • www:主机名,也可以称为子域名或三级域名。

3. DNS解析过程

  1. 用户在客户端中通过域名发起访问请求。
  2. 客户端首先检查本地缓存和文件/etc/hosts,看是否已经存储了该域名的IP地址。
  3. 如果在本地没有找到域名对应的IP地址,客户端会向配置的本地域名服务器发起递归查询请求。
  4. 本地DNS服务器如果没有缓存该域名的IP地址,它会向根域服务器查询。
  5. 根域服务器返回顶级域名服务器的IP地址给本地DNS服务器,本地域名服务器再向顶级域名服务器发送查询请求。
  6. 顶级域名服务器返回二级域名服务器的IP地址给本地DNS服务器,本地域名服务器再向二级域名服务器发送查询请求。
  7. 二级域名服务器返回子域名服务器的IP地址给本地DNS服务器,本地域名服务器再向子域名服务器发送查询请求。
  8. 子域名服务器返回域名对应的IP地址给本地域名服务器,本地域名服务器将IP地址存入换成当中,再将IP告诉客户端。
  9. 客户端获得IP后,根据IP访问对应服务。

递归查询:客户端向DNS服务器发起查询请求,如果该服务器没有缓存域名对应的IP,它会代替客户端去其他DNS服务器查询,直到找到答案或者查询失败。

迭代查询:客户端向DNS服务器发起查询请求,如果该服务器没有缓存域名对应的IP,它会提供另一个DNS服务器的地址,让客户端去那里查询。这个过程会一直持续,直到找到答案或者查询失败。

迭代查询过程中,客户端需要自己管理查询过程,直到找到对应IP;递归查询过程中,DNS服务器代替客户端管理查询过程。

4. DNS解析类型

正向解析、反向解析和主备解析是DNS系统中三个重要的解析类型。

  • 正向解析:将域名解析为IP地址。
  • 反向解析:将IP地址解析为域名。
  • 主从解析:DNS服务器之间的数据同步和负载分担机制,提高DNS服务的可用性和可靠性。

5. curl命令 – 文件传输工具

curl命令来自英文词组CommandLine URL的缩写,功能是在Shell终端界面中基于URL规则进行文件传输工作。

curl [选项] 文件

常见的选项:

选项功能
-I显示网站的响应头信息
-K读取指定文件
-o设置文件下载到本地的路径

二、DNS安装部署

1. BIND概述

1.1 安装BIND

  1. 执行下面的命令,安装BIND。BIND是一款广泛使用的DNS服务软件。

    apt -y instll bind9
    
  2. 安装完成后,会生成一个/etc/bind目录。

    ls /etc/bind
    
    bind.keys  db.127  db.empty  named.conf                named.conf.local    rndc.key
    db.0       db.255  db.local  named.conf.default-zones  named.conf.options  zones.rfc1918
    

    主要配置文件:

    • db.empty:DNS区域文件的模板文件。
    • named.conf:BIND服务的主配置文件,引入其他配置文件。
    • named.conf.local:包含本地配置区域,如区域文件的位置、视图的定义等。
    • named.conf.default-zones:包含BIND服务默认配置的区域,通常是一些根区域和常用的顶级域。
    • named.conf.options:BIND服务的其他配置。

1.2 主要配置文件说明

  1. name.conf文件。

    // This is the primary configuration file for the BIND DNS server named.
    //
    // Please read /usr/share/doc/bind9/README.Debian.gz for information on the
    // structure of BIND configuration files in Debian, *BEFORE* you customize
    // this configuration file.
    //
    // If you are just adding zones, please do that in /etc/bind/named.conf.local
    
    include "/etc/bind/named.conf.options";
    include "/etc/bind/named.conf.local";
    include "/etc/bind/named.conf.default-zones";
    
    • include:引入配置文件。
  2. named.conf.local文件。

    //
    // Do any local configuration here
    //
    
    // Consider adding the 1918 zones here, if they are not used in your
    // organization
    //include "/etc/bind/zones.rfc1918";
    
    • 建议在本文件中进行本地的区域配置。
  3. named.conf.default-zones文件。

    // prime the server with knowledge of the root servers
    zone "." {
            type hint;
            file "/usr/share/dns/root.hints";
    };
    
    // be authoritative for the localhost forward and reverse zones, and for
    // broadcast zones as per RFC 1912
    
    zone "localhost" {
            type master;
            file "/etc/bind/db.local";
    };
    
    zone "127.in-addr.arpa" {
            type master;
            file "/etc/bind/db.127";
    };
    
    zone "0.in-addr.arpa" {
            type master;
            file "/etc/bind/db.0";
    };
    
    zone "255.in-addr.arpa" {
            type master;
            file "/etc/bind/db.255";
    };
    
    • 本文件是BIND服务默认的特定区域配置,包括根域服务器区域、本地主机的正向区域和反向区域、网段和广播的反向区域。

    • 区域配置的常见格式。

      zone "example.com" {
          type master;
          file "/etc/bind/db.example.com";
          allow-transfer {IP;};
          master {IP;};
      };
      
      • zone “example.com”:定义了一个适用于example.com的区域配置。
      • type:区域的类型,常见类型包括:master、slave等。
      • file:区域数据文件的存放位置。
      • allow-transfer {IP;};:设置能够请求区域传输的服务端IP,主要用于主服务器。
      • master {IP;};:设置主服务器的IP,告诉从服务器可以该IP地址请求区域数据。
  4. named.conf.options文件。

    options {
        directory "/var/cache/bind";
        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113
    
        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.
    
        // forwarders {
        //      0.0.0.0;
        // };
    
        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;
    
        listen-on-v6 { any; };
    };
    
    • 用于设置服务器的基本运行参数,包括监听端口、允许查询的客户端等设置。
  5. db.empty文件。

    ; BIND reverse data file for empty rfc1918 zone
    ;
    ; DO NOT EDIT THIS FILE - it is used for multiple zones.
    ; Instead, copy it, edit named.conf, and use that copy.
    ;
    $TTL    86400
    @       IN      SOA     localhost. root.localhost. (
                                  1         ; Serial
                             604800         ; Refresh
                              86400         ; Retry
                            2419200         ; Expire
                              86400 )       ; Negative Cache TTL
    ;
    @       IN      NS      localhost.
    
    • 本文件是区域数据文件的模板文件。包括记录的存活时间(TTL)、起始授权机构(SOA)记录、服务器和IP记录。

2. 配置正向解析

  1. 编辑named.conf.options文件,在文件中加入以下内容,用于配置网络接口和允许进行DNS查询的客户端地址范围。

    listen-on port 53 {192.168.1.128;};
    allow-query {192.168.1.0/24;};
    
  2. 编辑named.conf.local文件,在文件中定义区域的相关配置,设置一个匹配域名xy104.com的区域。

    zone "xy104.com" {
        type master;
        file "/etc/bind/xy104.local";
    };
    
  3. 复制区域数据文件目标,复制后的文件路径要和区域设置里的路径保持一致。修改文件,设置域名xy104.com对应的IP等信息。

    $TTL    86400
    @       IN      SOA     xy104.com. admin.xy104.com. (
                                  1         ; Serial
                             604800         ; Refresh
                              86400         ; Retry
                            2419200         ; Expire
                              86400 )       ; Negative Cache TTL
    ;
    @       IN      NS      xy104.com.
    @       IN      A       192.168.1.128
    www     IN      A       192.168.1.128
    
  4. 配置完成后,重启BIND服务。

    systemctl restart bind9
    
  5. 编辑网络配置文件,重新设置DNS的IP。

    network:
      ethernets:
        ens33:
          dhcp4: no
          addresses: [192.168.1.128/24]
          gateway4: 192.168.1.254
          nameservers:
            addresses: [192.168.1.128]
    
  6. 查看正向解析是否设置成功。

    nslookup www.xy104.com
    
    Server:         127.0.0.53
    Address:        127.0.0.53#53
    
    Non-authoritative answer:
    Name:   www.xy104.com
    Address: 192.168.1.128
    

3. 配置反向解析

  1. 编辑named.conf.local文件,在文件中定义区域的相关配置,设置一个匹配域名xy104.com的反向区域。

    zone "1.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/xy104.local";
    };
    
  2. 复制区域数据文件目标,复制后的文件路径要和区域设置里的路径保持一致。修改文件,设置域名xy104.com对应的IP等信息。

    $TTL    86400
    @       IN      SOA     xy104.com. admin.xy104.com. (
                                  1         ; Serial
                             604800         ; Refresh
                              86400         ; Retry
                            2419200         ; Expire
                              86400 )       ; Negative Cache TTL
    ;
    @       IN      NS      xy104.com.
    @       IN      A       192.168.1.128
    www     IN      A       192.168.1.128
    128     IN      PTR     www.xy104.com.
    
  3. 配置完成后,重启BIND服务。

    systemctl restart bind9
    
  4. 查看反向解析是否设置成功。

    nslookup 192.168.1.128
    
    128.1.168.192.in-addr.arpa      name = www.xy104.com.
    

4. 配置主从解析

  1. 基于前面配置实现主从解析。原有的主机作主服务器,编辑原有的named.conf.local文件,修改区域配置。保存文件后,重启BIND服务。

    zone "xy104.com" {
        type master;
        file "/etc/bind/xy104.local";
        allow-transfer {192.168.1.129;};
    };
    
    zone "1.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/xy104.local";
        allow-transfer {192.168.1.129;};
    };
    
  2. 配置主服务器的网络配置,设置两个DNS,并重启网络服务。

    network:
      ethernets:
        ens33:
          dhcp4: no
          addresses: [192.168.1.128/24]
          gateway4: 192.168.1.254
          nameservers:
            addresses: [192.168.1.128, 192.168.1.129]
    
  3. 在另一台主机上安装BIND服务。

    apt -y install bind9
    
  4. 编辑named.conf.options文件,在文件中加入以下内容.

    listen-on port 53 {any;};
    allow-query     {any;};
    
  5. 编辑named.conf.local文件,修改从服务器的区域配置。

    zone "xy104.com" {
        type slave;
        file "xy104.local";
        masters {192.168.1.128;};
    };
    
    zone "1.168.192.in-addr.arpa" {
        type slave;
        file "xy104.local";
        masters {192.168.1.128;};
    };
    
  6. 重启从服务器的BIND服务。

    systemctl restart bind9
    
  7. 配置从服务器网络,然后重启网络服务。

    network:
      ethernets:
        ens33:
          dhcp4: no
          addresses: [192.168.1.129/24]
          gateway4: 192.168.1.254
          nameservers:
            addresses: [192.168.1.128, 192.168.1.129]
    
  8. 验证主从解析是否存在问题。

你希望根据 `file_id` 字段中某个部分(如 `-2509-` 或 `-2508-`)为每个相同前缀的值生成**唯一递增的流水号**,例如: - 原始值:`C03-PCB-TS-2509-51`、`C03-PCB-TS-2509-51` - 期望值:`C03-PCB-TS-2509-52`、`C03-PCB-TS-2509-53` --- ## ✅ 实现思路 1. 使用 SQL 提取 `file_id` 中的“前缀”部分(即 `-2509-` 前的部分); 2. 使用 `ROW_NUMBER()` 按该前缀进行编号; 3. 使用 `UPDATE` 更新 `file_id` 字段为新生成的唯一值。 --- ## ✅ 示例 SQL(以 PostgreSQL 为例) ### 1. 查看当前数据结构和生成新值(测试阶段) ```sql SELECT file_id, -- 提取前面的固定部分,如 C03-PCB-TS-2509- split_part(file_id, '-', 1) || '-' || split_part(file_id, '-', 2) || '-' || split_part(file_id, '-', 3) || '-' || split_part(file_id, '-', 4) || '-' AS prefix, -- 使用 ROW_NUMBER() 为每个前缀生成唯一编号 ROW_NUMBER() OVER (PARTITION BY split_part(file_id, '-', 1) || '-' || split_part(file_id, '-', 2) || '-' || split_part(file_id, '-', 3) || '-' || split_part(file_id, '-', 4) ORDER BY file_id ) AS seq FROM testdup.dynamic_general_ledger; ``` --- ### 2. 更新 `file_id` 字段(正式操作) ```sql WITH numbered AS ( SELECT id, file_id, split_part(file_id, '-', 1) || '-' || split_part(file_id, '-', 2) || '-' || split_part(file_id, '-', 3) || '-' || split_part(file_id, '-', 4) AS prefix, ROW_NUMBER() OVER (PARTITION BY split_part(file_id, '-', 1) || '-' || split_part(file_id, '-', 2) || '-' || split_part(file_id, '-', 3) || '-' || split_part(file_id, '-', 4) ORDER BY file_id ) AS seq FROM testdup.dynamic_general_ledger ) UPDATE testdup.dynamic_general_ledger AS t SET file_id = n.prefix || (n.seq + 51) -- 从 52 开始 FROM numbered AS n WHERE t.id = n.id; ``` > ✅ 解释: > - `split_part(..., '-', 4)` 提取前4段,作为分组依据; > - `ROW_NUMBER()` 为每个组生成唯一编号; > - `+ 51` 表示从 `52` 开始生成流水号; > - 使用 `id` 做关联更新,确保准确。 --- ## ✅ 示例输出 | 原始 file_id | 新 file_id | |--------------|-------------| | C03-PCB-TS-2509-51 | C03-PCB-TS-2509-52 | | C03-PCB-TS-2509-51 | C03-PCB-TS-2509-53 | | C03-PCB-TS-2508-51 | C03-PCB-TS-2508-52 | | C03-PCB-TS-2508-51 | C03-PCB-TS-2508-53 | --- ## ✅ 注意事项 - **备份数据**:更新前建议先备份表; - **字段长度**:确保 `file_id` 字段长度足够存储新值; - **索引影响**:如果 `file_id` 有索引,更新大量数据可能会影响性能; - **可扩展性**:如果你的 `file_id` 结构更复杂,可以使用正则提取(如 `regexp_match`)。 --- ## ✅ 扩展:使用正则提取前缀(更灵活) ```sql SELECT file_id, (regexp_match(file_id, '^(.*?-\d+)-\d+$'))[1] AS prefix, ROW_NUMBER() OVER (PARTITION BY (regexp_match(file_id, '^(.*?-\d+)-\d+$'))[1] ORDER BY file_id) AS seq FROM testdup.dynamic_general_ledger; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值