Linux中DNS搭建


一、DNS介绍

1.1、DNS是什么

域名系统(Domain Name System,简称DNS)是互联网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP数串。

人们可以通过DNS,将易于记忆的域名转换为对应的IP地址,从而访问到相应的网络资源。例如,当人们在浏览器中输入一个网址如“www.example.com”,系统会向DNS服务器发送请求,查询该域名对应的IP地址,然后通过该IP地址访问网站。

1.2、DNS的工作原理

DNS的工作原理基于域名解析,将用户友好的域名转换为机器可读的IP地址,涉及多个级别的DNS服务器,包括本地DNS服务器、根域名服务器、顶级域名服务器和权威域名服务器。以下是具体流程:

  • 浏览器缓存检查
    • 步骤:当用户在浏览器中输入一个域名时,系统会首先检查浏览器缓存,如果找到相应的记录,则直接使用该记录。
    • 目的:提高解析速度,减少网络请求。
  • 操作系统缓存检查
    • 步骤:若浏览器缓存未命中,系统会检查操作系统缓存,如Windows的hosts文件。
    • 目的:操作系统层面的缓存记录,可以快速解析一些常用或最近访问过的域名。
  • 本地DNS服务器查询
    • 步骤:如果本地缓存未命中,请求会被发送到本地DNS服务器。
    • 逻辑:本地DNS服务器先检查自己的缓存记录,未找到的话,向根域名服务器发起查询请求。
  • 根域名服务器查询
    • 步骤:根域名服务器指引本地DNS服务器联系相应的顶级域名服务器(如.com、.org等)。
    • 目的:提供正确的顶级域名服务器信息,进行下一步查询。
  • 顶级域名服务器查询
    • 步骤:本地DNS服务器向指定的顶级域名服务器发送请求,获取管理该域名的权威域名服务器信息。
    • 目的:定位到具体的权威域名服务器,获取最终的解析结果。
  • 权威域名服务器查询
    • 步骤:本地DNS服务器向权威域名服务器查询具体的IP地址,并将结果返回给用户。
    • 缓存机制:本地DNS服务器将解析结果缓存起来供后续使用,同时用户系统也会根据TTL值缓存解析结果。
  • 递归查询和迭代查询
    • 递归查询:通常发生在用户设备与本地DNS服务器之间,本地DNS服务器代替用户完成所有上游查询。
    • 迭代查询:发生在本地DNS服务器与其他各级域名服务器之间,每次查询都需要继续向其他服务器发起请求。

在这里插入图片描述

1.3、DNS的域名结构

DNS的域名结构采用层次树状结构,从根域到主机,这种结构设计有助于管理庞大的互联网域名空间,实现域名的有序分配和解析。

  • 根域
    • 根域:位于域名空间的最顶层,一般用一个“.”表示。这个点代表DNS的根,有了这个点,完全合格域名(FQDN)就是一个绝对路径。
    • 根域名服务器:全球有13个逻辑根域名服务器,它们的名称分别是a.root-servers.net到m.root-servers.net。这些服务器是DNS层级中最重要的,负责管理整个域名空间的解析权。
  • 顶级域
    • 顶级域:位于根域下一层,代表一种类型的组织机构或国家地区。例如,.com、.net、.org通常用于通用商业和组织用途,而.cn、.uk等则表示国家代码顶级域。
    • 顶级域名服务器:管理该顶级域名下的所有二级域名。当收到以某个顶级域结尾的域名解析请求时,会转发给相应的顶级域名服务器。
  • 二级域
    • 二级域:用来标明顶级域内的一个特定组织。例如,在.cn顶级域名下,可以设置二级域名如 .com.cn、.net.cn、.edu.cn等。
    • 权威域名服务器:负责一个区域的域名服务器,也称为权威域名服务器。顶级域名服务器也可以算作是权威域名服务器,只不过由于其特殊性,专门划分为一类。
  • 子域
    • 子域:二级域下所创建的各级域统称为子域,各个组织或用户可以自由申请注册自己的域名。
    • 自主管理:子域由所属的组织或用户自主管理,可以在其下继续划分更具体的三级域或四级域。
  • 主机
    • 主机:位于域名空间最下层,代表一台具体的计算机。例如,www、mail都是具体的计算机名字,可用FQDN如www.sina.com.cn、mail.sina.com.cn来表示。
    • FQDN:平时上网输入的网址都是FQDN名,如www.sina.com.cn表示要访问“sina.com.cn”域中一台名为“www”的计算机。

在这里插入图片描述

二、Bind介绍

2.1、bind概述

BIND(Berkeley Internet Name Domain)是全球使用最广泛的DNS服务软件之一,由加州大学伯克利分校开发,并成为事实上的DNS服务标准。BIND安装包包括核心程序、配置文件和相关工具。

BIND作为一个功能强大的开源DNS服务软件,广泛应用于各类网络环境中,不仅提供高效的域名解析服务,还支持动态更新和缓存机制。

  • BIND的作用
    • 域名解析:BIND将复杂的IP地址转换为人类可读的域名,使用户可以通过简单的网址访问网站,而无需记住复杂的IP地址。
    • 区域文件管理:BIND通过管理DNS区域文件来控制DNS记录的存储和更新,这些记录包括A记录、CNAME记录、MX记录等。
    • 缓存和查询响应:BIND具有缓存功能,可以暂时存储查询结果,减少解析时间和网络负载。同时,它可以快速响应客户端的查询请求,提高DNS解析效率。
    • 动态更新支持:BIND支持动态DNS更新,允许客户端在不停机的情况下修改DNS记录,适用于频繁变更IP地址的场景。
  • BIND的工作流程
    • 初始化套接字:服务器端调用socket函数创建套接字,用于后续的网络通信。
    • 绑定地址和端口:通过bind函数将套接字与特定的IP地址和端口号绑定,确保服务器在该地址和端口上监听请求。
    • 监听连接请求:服务器调用listen函数,开始在绑定的地址和端口上监听客户端的连接请求。
    • 接受连接请求:当客户端的连接请求到来时,服务器使用accept函数接受请求并创建新的套接字进行通信。
    • 数据交换:服务器和客户端通过已建立的连接进行双向数据交换,服务器可以使用send函数向客户端发送数据,使用recv函数接收来自客户端的数据
  • 其他服务的功能
    • Unbound:一个开源的DNS解析器,专注于DNS查询的响应速度和安全性。它主要作为转发代理服务器使用,可以有效地处理大量的并发查询请求。
    • PowerDNS:一个高性能的DNS服务器软件,支持多种后端数据库,适合大规模部署。它提供了灵活的配置选项,可以根据不同需求进行优化。
    • dnsmasq:一个轻量级的DNS服务器,适用于局域网环境。它可以提供DNS缓存、DHCP服务和DNS反向解析功能,配置简单,资源占用少。

2.2、bind主要配置文件

  • /etc/named.conf
    • 主配置文件:/etc/named.conf是BIND的主配置文件。它包含了DNS服务器的全局设置,如监听端口、服务作用范围、是否启用递归查询等。此文件还可能包含其他区域文件的位置信息,通过include语句引入其他配置文件。
  • /etc/named.rfc1912.zones
    • 区域定义文件:/etc/named.rfc1912.zones文件用于定义DNS区域。该文件列出了所有正向和反向解析区域的配置信息,每个区域指向一个具体的区域文件。
  • /etc/rc.d/init.d/named
    • 启动脚本:/etc/rc.d/init.d/named是一个启动脚本文件。这个脚本用于控制BIND服务的启动、停止和重启操作。在系统启动过程中,该脚本会自动启动BIND服务。
  • /etc/rndc.conf
    • rndc配置文件:/etc/rndc.conf是用于配置rndc的工具的配置文件。rndc(Remote Name Daemon Control)是一个管理BIND服务的工具,可用于执行服务器的监控和控制任务。这个文件包含了rndc的配置选项,如密钥、控制通道等。
  • /usr/sbin/named-checkconf
    • 语法检查工具:/usr/sbin/named-checkconf是一个用于检查/etc/named.conf文件语法正确性的工具。在修改配置文件后,运行此命令可以确保文件没有语法错误,从而避免因配置错误导致的服务启动失败。
  • /usr/sbin/named-checkzone
    • 区域文件检查工具:/usr/sbin/named-checkzone用于检查DNS区域文件(如example.com.zone)的语法和一致性。这个工具可以帮助管理员在更新区域文件后,发现并修正文件中的错误。
  • /var/named/named.ca
    • 根提示文件:/var/named/named.ca是BIND的根提示文件。这个文件包含了互联网根DNS服务器的信息,用于辅助本地DNS服务器进行递归查询。当本地DNS服务器无法直接解析某个域名时,会查询根服务器获取进一步的解析信息。
  • /var/named/named.localhost
    • 本地主机数据库:/var/named/named.localhost用于提供本地主机的DNS解析信息。这个文件通常包含了本地网络中的回环地址(127.0.0.1)和对应的域名(如localhost)。这确保了本地主机可以通过标准域名访问自己。

这些配置文件共同协作,为BIND提供了完整的配置信息,使其能够高效地完成DNS解析任务;管理员需要熟悉这些文件的作用和位置,以便能够准确配置和维护DNS服务器。

三、DNS安装

安装BIND 软件包

[root@root ~]# dnf install bind bind-utils

编辑 BIND 的配置文件 /etc/named.conf,根据需求进行配置

[root@root ~]# vi /etc/named.conf 
[root@root ~]# cat /etc/named.conf 
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

# 定义BIND服务器的全局选项。
options {
		#指定DNS服务器监听的IP地址和端口,这里是本地回环地址(127.0.0.1)和端口53。
        listen-on port 53 { 127.0.0.1; };
        #指定DNS服务器监听的IPv6地址和端口,这里是本地回环地址(::1)和端口53。
        listen-on-v6 port 53 { ::1; };
        #设置工作目录为"/var/named"。
        directory       "/var/named";
        #设置缓存文件的位置为"/var/named/data/cache_dump.db"。
        dump-file       "/var/named/data/cache_dump.db";
        #设置统计文件的位置为"/var/named/data/named_stats.txt"。
        statistics-file "/var/named/data/named_stats.txt";
        #设置内存统计文件的位置为"/var/named/data/named_mem_stats.txt"。
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        #设置安全根文件的位置为"/var/named/data/named.secroots"。
        secroots-file   "/var/named/data/named.secroots";
        #设置递归文件的位置为"/var/named/data/named.recursing"。
        recursing-file  "/var/named/data/named.recursing";
        #允许本地主机进行查询。
        allow-query     { localhost; };

        /* 
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable 
           recursion. 
         - If your recursive DNS server has a public IP address, you MUST enable access 
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification 
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface 
        */
        #开启递归查询。
        recursion yes;
		
		#开启DNSSEC验证。
        dnssec-validation yes;
        
		#设置动态密钥目录的位置为"/var/named/dynamic"。
        managed-keys-directory "/var/named/dynamic";
		
		#设置GeoIP数据库目录的位置为"/usr/share/GeoIP"。
        geoip-directory "/usr/share/GeoIP";

		#设置进程ID文件的位置为"/run/named/named.pid"。
        pid-file "/run/named/named.pid";
	
		#设置会话密钥文件的位置为"/run/named/session.key"。
        session-keyfile "/run/named/session.key";

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */

		#包含加密策略配置文件。
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {

		#定义默认的调试日志通道,将日志输出到"data/named.run"文件中,并设置日志级别为动态。
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

#定义根区域("."),类型为hint,文件位置为"named.ca"。
zone "." IN {
        type hint;
        file "named.ca";
};

#包含RFC 1912定义的区域文件。
include "/etc/named.rfc1912.zones";

#包含根密钥文件。
include "/etc/named.root.key";

启动 BIND 服务

[root@root ~]# systemctl start named

设置 BIND 服务在系统启动时自动启动

[root@root ~]# systemctl enable named
Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.

四、主要配置文件解析(除/etc/named.conf)

4.1、/etc/named.rfc1912.zones

[root@root ~]# cat /etc/named.rfc1912.zones
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package 
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and https://tools.ietf.org/html/rfc6303
// (c)2007 R W Franks
// 
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// Note: empty-zones-enable yes; option is default.
// If private ranges should be forwarded, add 
// disable-empty-zone "."; into options
// 

zone "localhost.localdomain" IN { // 定义一个名为localhost.localdomain的区域,类型为master,文件名为named.localhost,不允许更新
        type master;
        file "named.localhost";
        allow-update { none; };
};

zone "localhost" IN { // 定义一个名为localhost的区域,类型为master,文件名为named.localhost,不允许更新
        type master;
        file "named.localhost";
        allow-update { none; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { // 定义一个名为1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa的区域,类型为master,文件名为named.loopback,不允许更新
        type master;
        file "named.loopback";
        allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN { // 定义一个名为1.0.0.127.in-addr.arpa的区域,类型为master,文件名为named.loopback,不允许更新
        type master;
        file "named.loopback";
        allow-update { none; };
};

zone "0.in-addr.arpa" IN { // 定义一个名为0.in-addr.arpa的区域,类型为master,文件名为named.empty,不允许更新
        type master;
        file "named.empty";
        allow-update { none; };
};

4.2、/etc/rc.d/init.d/named

(注:不同的linux版本在不同的路径下,名字也不一定相同)

[root@root]# cat /usr/lib/systemd/system/named.service 
[Unit]  # 定义一个单元,用于描述服务的配置信息
Description=Berkeley Internet Name Domain (DNS)  # 描述服务的功能
Wants=nss-lookup.target  # 表示该服务依赖于nss-lookup.target服务
Wants=named-setup-rndc.service  # 表示该服务依赖于named-setup-rndc.service服务
Before=nss-lookup.target  # 表示该服务在nss-lookup.target服务之前启动
After=named-setup-rndc.service  # 表示该服务在named-setup-rndc.service服务之后启动
After=network.target  # 表示该服务在network.target服务之后启动

[Service]  # 定义一个服务,用于描述服务的运行方式
Type=forking  # 表示该服务为forking类型,即主进程会创建子进程
Environment=NAMEDCONF=/etc/named.conf  # 设置环境变量NAMEDCONF的值为/etc/named.conf
EnvironmentFile=-/etc/sysconfig/named  # 从/etc/sysconfig/named文件中读取环境变量
Environment=KRB5_KTNAME=/etc/named.keytab  # 设置环境变量KRB5_KTNAME的值为/etc/named.keytab
PIDFile=/run/named/named.pid  # 设置PID文件的路径为/run/named/named.pid

ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi'  # 在服务启动前执行的命令,用于检查配置文件
ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS  # 启动服务的命令,使用指定的配置文件和选项
ExecReload=/bin/sh -c 'if /usr/sbin/rndc null > /dev/null 2>&1; then /usr/sbin/rndc reload; else /bin/kill -HUP $MAINPID; fi'  # 重新加载服务的命令

ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID'  # 停止服务的命令

PrivateTmp=true  # 表示该服务使用私有的临时目录

[Install]  # 定义安装信息
WantedBy=multi-user.target  # 表示该服务希望被multi-user.target目标所引用

4.3、/etc/rndc.conf

在CentOS Stream中,rndc.conf文件默认不存在。但可以使用named.conf文件来配置rndc(Remote Name Daemon Controller)。

rndc是用于控制BIND名称服务器的工具,它通过TCP连接与名称服务器进行通信。要使用rndc,您需要确保在named.conf文件中启用了controls语句,并指定了一个或多个允许的IP地址和密钥。

[root@root /]# find /etc -name 'rndc.conf'
[root@root /]# find / -name 'rndc.conf'
[root@root /]# 

4.4、/usr/sbin/named-checkconf

/usr/sbin/named-checkconf 是一个二进制文件,因为它是一个执行具体任务的程序。这个文件是 BIND 软件包的一部分,专门用于解析并检查 DNS 配置文件及其所包含的所有文件的语法错误。

4.5、/usr/sbin/named-checkzone

/usr/sbin/named-checkzone 是一个二进制文件,因为它是一个执行具体任务的程序。这个文件是 BIND 软件包的一部分,专门用于解析并检查 DNS 区域文件的语法错误。与 named-checkconf 工具类似,named-checkzone 也是通过命令行接口接受特定参数来执行其功能的。

4.6、/var/named/named.ca

[root@root sbin]# cat /var/named/named.ca
; <<>> DiG 9.18.20 <<>> -4 +tcp +norec +nostats @d.root-servers.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47286
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1450
;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS     a.root-servers.net. ; 定义根服务器a的域名和TTL
.                       518400  IN      NS     b.root-servers.net. ; 定义根服务器b的域名和TTL
.                       518400  IN      NS     c.root-servers.net. ; 定义根服务器c的域名和TTL
.                       518400  IN      NS     d.root-servers.net. ; 定义根服务器d的域名和TTL
.                       518400  IN      NS     e.root-servers.net. ; 定义根服务器e的域名和TTL
.                       518400  IN      NS     f.root-servers.net. ; 定义根服务器f的域名和TTL
.                       518400  IN      NS     g.root-servers.net. ; 定义根服务器g的域名和TTL
.                       518400  IN      NS     h.root-servers.net. ; 定义根服务器h的域名和TTL
.                       518400  IN      NS     i.root-servers.net. ; 定义根服务器i的域名和TTL
.                       518400  IN      NS     j.root-servers.net. ; 定义根服务器j的域名和TTL
.                       518400  IN      NS     k.root-servers.net. ; 定义根服务器k的域名和TTL
.                       518400  IN      NS     l.root-servers.net. ; 定义根服务器l的域名和TTL
.                       518400  IN      NS     m.root-servers.net. ; 定义根服务器m的域名和TTL

;; ADDITIONAL SECTION:
a.root-servers.net.     518400  IN      A      198.41.0.4        ; 定义根服务器a的IPv4地址和TTL
b.root-servers.net.     518400  IN      A      170.247.170.2      ; 定义根服务器b的IPv4地址和TTL
c.root-servers.net.     518400  IN      A      192.33.4.12        ; 定义根服务器c的IPv4地址和TTL
d.root-servers.net.     518400  IN      A      199.7.91.13        ; 定义根服务器d的IPv4地址和TTL
e.root-servers.net.     518400  IN      A      192.203.230.10     ; 定义根服务器e的IPv4地址和TTL
f.root-servers.net.     518400  IN      A      192.5.5.241        ; 定义根服务器f的IPv4地址和TTL
g.root-servers.net.     518400  IN      A      192.112.36.4       ; 定义根服务器g的IPv4地址和TTL
h.root-servers.net.     518400  IN      A      198.97.190.53      ; 定义根服务器h的IPv4地址和TTL
i.root-servers.net.     518400  IN      A      192.36.148.17      ; 定义根服务器i的IPv4地址和TTL
j.root-servers.net.     518400  IN      A      192.58.128.30      ; 定义根服务器j的IPv4地址和TTL
k.root-servers.net.     518400  IN      A      193.0.14.129       ; 定义根服务器k的IPv4地址和TTL
l.root-servers.net.     518400  IN      A      199.7.83.42        ; 定义根服务器l的IPv4地址和TTL
m.root-servers.net.     518400  IN      A      202.12.27.33       ; 定义根服务器m的IPv4地址和TTL
a.root-servers.net.     518400  IN      AAAA   2001:503:ba3e::2:30 ; 定义根服务器a的IPv6地址和TTL
b.root-servers.net.     518400  IN      AAAA   2801:1b8:10::b     ; 定义根服务器b的IPv6地址和TTL
c.root-servers.net.     518400  IN      AAAA   2001:500:2::c     ; 定义根服务器c的IPv6地址和TTL
d.root-servers.net.     518400  IN      AAAA   2001:500:2d::d     ; 定义根服务器d的IPv6地址和TTL
e.root-servers.net.     518400  IN      AAAA   2001:500:a8::e     ; 定义根服务器e的IPv6地址和TTL
f.root-servers.net.     518400  IN      AAAA   2001:500:2f::f     ; 定义根服务器f的IPv6地址和TTL
g.root-servers.net.     518400  IN      AAAA   2001:500:12::d0d   ; 定义根服务器g的IPv6地址和TTL
h.root-servers.net.     518400  IN      AAAA   2001:7fe::53       ; 定义根服务器h的IPv6地址和TTL
i.root-servers.net.     518400  IN      AAAA   2001:500:1::53     ; 定义根服务器i的IPv6地址和TTL
j.root-servers.net.     518400  IN      AAAA   2001:503:c27::2:30 ; 定义根服务器j的IPv6地址和TTL
k.root-servers.net.     518400  IN      AAAA   2001:7fd::1        ; 定义根服务器k的IPv6地址和TTL
l.root-servers.net.     518400  IN      AAAA   2001:500:9f::42    ; 定义根服务器l的IPv6地址和TTL
m.root-servers.net.     518400  IN      AAAA   2001:dc3::35       ; 定义根服务器m的IPv6地址和TTL

4.7、/var/named/named.localhost

[root@root /]# cat /var/named/named.localhost
$TTL 1D ; 设置默认生存时间(TTL)为1天
@       IN SOA  @ rname.invalid. ( ; 定义主域名服务器(SOA)记录,将"@"作为域名,rname.invalid.作为负责该域的管理员邮箱
                                        0      ; serial ; 序列号,用于标识DNS记录的版本
                                        1D     ; refresh ; 刷新时间,指定多久后从备份服务器更新主服务器的信息
                                        1H     ; retry ; 重试时间,指定在失败后多久重新尝试获取信息
                                        1W     ; expire ; 过期时间,指定何时该记录失效
                                        3H )   ; minimum ; 缓存时间,指定其他服务器应缓存此记录的最短时间
        NS      @ ; 定义域名服务器(NS)记录,将"@"作为域名
        A       127.0.0.1 ; 定义地址(A)记录,将IPv4地址127.0.0.1映射到域名"@"
        AAAA    ::1 ; 定义地址(AAAA)记录,将IPv6地址::1映射到域名"@"
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一的学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值