一、DNS域名解析服务

主服务器:在特定区域内具有唯一性,负责维护该区域内的域名与IP地址之间的对应关系。

从服务器:从主服务器中获得域名与IP地址的对应关系并进行维护,以防主服务器宕机等情况。

缓存服务器:通过向其他域名解析服务器查询获得域名与IP地址的对应关系,并将经常查询的域名信息保存到服务器本地,以此来提高重复查询时的效率。

[root@linuxprobe ~]# yum install bind-chroot
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Installing:bind-chroot x86_64 32:9.9.4-14.el7 rhel 81 k
Installing for dependencies:bind x86_64 32:9.9.4-14.el7 rhel 1.8 M
Transaction Summary
================================================================================
Install 1 Package (+1 Dependent package)
Total download size: 1.8 M
Installed size: 4.3 M
Is this ok [y/d/N]: y
Downloading packages:
--------------------------------------------------------------------------------
Total 28 MB/s | 1.8 MB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transactionInstalling : 32:bind-9.9.4-14.el7.x86_64 1/2 Installing : 32:bind-chroot-9.9.4-14.el7.x86_64 2/2 Verifying : 32:bind-9.9.4-14.el7.x86_64 1/2 Verifying : 32:bind-chroot-9.9.4-14.el7.x86_64 2/2
Installed:bind-chroot.x86_64 32:9.9.4-14.el7
Dependency Installed:bind.x86_64 32:9.9.4-14.el7
Complete!

bind服务程序的配置并不简单,因为要想为用户提供健全的DNS查询服务,要在本地保存相关的域名数据库,而如果把所有域名和IP地址的对应关系都写入到某个配置文件中,估计要有上千万条的参数,这样既不利于程序的执行效率,也不方便日后的修改和维护。因此在bind服务程序中有下面这三个比较关键的文件。

主配置文件(/etc/named.conf):只有58行,而且在去除注释信息和空行之后,实际有效的参数仅有30行左右,这些参数用来定义bind服务程序的运行。

区域配置文件(/etc/named.rfc1912.zones):用来保存域名和IP地址对应关系的所在位置。类似于图书的目录,对应着每个域和相应IP地址所在的具体位置,当需要查看或修改时,可根据这个位置找到相关文件。

数据配置文件目录(/var/named):该目录用来保存域名和IP地址真实对应关系的数据配置文件。

bind服务程序的名称为named。首先需要在/etc目录中找到该服务程序的主配置文件,然后把第11行和第17行的地址均修改为any,分别表示服务器上的所有IP地址均可提供DNS域名解析服务,以及允许所有人对本服务器发送DNS查询请求。这两个地方一定要修改准确。

[root@linuxprobe ~]# vim /etc/named.conf1 //2 // named.conf3 //4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS5 // server as a caching only nameserver (as a localhost DNS resolver only).6 //7 // See /usr/share/doc/bind*/sample/ for example named configuration files.8 //9 10 options {11 listen-on port 53 { any; };12 listen-on-v6 port 53 { ::1; };13 directory "/var/named";14 dump-file "/var/named/data/cache_dump.db";15 statistics-file "/var/named/data/named_stats.txt";16 memstatistics-file "/var/named/data/named_mem_stats.txt";17 allow-query { any; };18 19 /* 20 - If you are building an AUTHORITATIVE DNS server, do NOT enable re cursion.1,1 Top21 - If you are building a RECURSIVE (caching) DNS server, you need to enable 22 recursion. 23 - If your recursive DNS server has a public IP address, you MUST en able access 24 control to limit queries to your legitimate users. Failing to do so will25 cause your server to become part of large scale DNS amplification 26 attacks. Implementing BCP38 within your network would greatly27 reduce such attack surface 28 */29 recursion yes;30 31 dnssec-enable yes;32 dnssec-validation yes;33 dnssec-lookaside auto;34 35 /* Path to ISC DLV key */36 bindkeys-file "/etc/named.iscdlv.key";37 38 managed-keys-directory "/var/named/dynamic";39 40 pid-file "/run/named/named.pid";41 session-keyfile "/run/named/session.key";42 };43 44 logging {45 channel default_debug {46 file "data/named.run";47 severity dynamic;48 };49 };50 51 zone "." IN {52 type hint;53 file "named.ca";54 };55 56 include "/etc/named.rfc1912.zones";57 include "/etc/named.root.key";58 

正向解析图解

反向解析图解

 二、正向解析实验

在DNS域名解析服务中,正向解析是指根据域名(主机名)查找到对应的IP地址。也就是说,当用户输入了一个域名后,bind服务程序会自动进行查找,并将匹配到的IP地址返给用户。这也是最常用的DNS工作模式。

第1步:编辑区域配置文件。该文件中默认已经有了一些无关紧要的解析参数,旨在让用户有一个参考。我们可以将下面的参数添加到区域配置文件的最下面,当然,也可以将该文件中的原有信息全部清空,而只保留自己的域名解析信息:

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update {none;};
};

第2步:编辑数据配置文件。我们可以从/var/named目录中复制一份正向解析的模板文件(named.localhost),然后把域名和IP地址的对应数据填写数据配置文件中并保存。在复制时记得加上-a参数,这可以保留原始文件的所有者、所属组、权限属性等信息,以便让bind服务程序顺利读取文件内容:

[root@linuxprobe ~]# cd /var/named/
[root@linuxprobe named]# ls -al named.localhost
-rw-r-----. 1 root named 152 Jun 21 2007 named.localhost
[root@linuxprobe named]# cp -a named.localhost linuxprobe.com.zone

编辑数据配置文件。在保存并退出后文件后记得重启named服务程序,让新的解析数据生效。考虑到正向解析文件中的参数较多,而且相对都比较重要,刘遄老师在每个参数后面都作了简要的说明。

[root@linuxprobe named]# vim linuxprobe.com.zone
[root@linuxprobe named]# systemctl restart named
$TTL 1D #生存周期为1天        
@ IN SOA linuxprobe.com. root.linuxprobe.com. (  
  #授权信息开始: #DNS区域的地址 #域名管理员的邮箱(不要用@符号)  
        0;serial #更新序列号
        1D;refresh #更新时间
        1H;retry #重试延时
        1W;expire #失效时间
        3H;)minimum #无效解析记录的缓存时间
  NS ns.linuxprobe.com. #域名服务器记录
ns IN A 192.168.21.110 #地址记录(ns.linuxprobe.com.)
  IN MX 10 mail.linuxprobe.com. #邮箱交换记录
mail IN A 192.168.21.110 #地址记录(mail.linuxprobe.com.)
www IN A 192.168.21.112 #地址记录(www.linuxprobe.com.)
bbs IN A 192.168.21.113 #地址记录(bbs.linuxprobe.com.)

第3步:检验解析结果。为了检验解析结果,一定要先把网卡中的DNS地址参数修改成本机IP地址,这样就可以使用由本机提供的DNS查询服务了。nslookup命令用于检测能否从DNS服务器中查询到域名与IP地址的解析记录,进而更准确地检验DNS服务器是否已经能够为用户提供服务。

[root@linuxprobe ~]# systemctl restart network
[root@linuxprobe ~]# nslookup
> www.linuxprobe.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: www.linuxprobe.com
Address: 192.168.10.10
> bbs.linuxprobe.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: bbs.linuxprobe.com
Address: 192.168.10.20
三、反向解析实验

在DNS域名解析服务中,反向解析的作用是将用户提交的IP地址解析为对应的域名信息,它一般用于对某个IP地址上绑定的所有域名进行整体屏蔽,屏蔽由某些域名发送的垃圾邮件。它也可以针对某个IP地址进行反向解析,大致判断出有多少个网站运行在上面。当购买虚拟主机时,可以使用这一功能验证虚拟主机提供商是否有严重的超售问题。

第1步:编辑区域配置文件。在编辑该文件时,除了不要写错格式之外,还需要记住此处定义的数据配置文件名称,因为一会儿还需要在/var/named目录中建立与其对应的同名文件。反向解析是把IP地址解析成域名格式,因此在定义zone(区域)时应该要把IP地址反写,比如原来是192.168.10.0,反写后应该就是10.168.192,而且只需写出IP地址的网络位即可。把下列参数添加至正向解析参数的后面。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update {none;};
};
zone "21.168.192.in-addr.arpa" IN {
type master;
file "192.168.21.arpa";
};

第2步:编辑数据配置文件。首先从/var/named目录中复制一份反向解析的模板文件(named.loopback),然后把下面的参数填写到文件中。其中,IP地址仅需要写主机位,如图所示。

[root@linuxprobe named]# cp -a named.loopback 192.168.21.arpa
[root@linuxprobe named]# vim 192.168.21.arpa
[root@linuxprobe named]# systemctl restart named
$TTL 1D        
@ IN SOA linuxprobe.com. root.linuxprobe.com. (
        0;serial
        1D;refresh
        1H;retry
        1W;expire
        3H);minimum
  NS ns.linuxprobe.com.  
ns A 192.168.21.112  
112 PTR ns.linuxprobe.com. #PTR为指针记录,仅用于反向解析中。
112 PTR mail.linuxprobe.com.  
112 PTR www.linuxprobe.com.  
113 PTR bbs.linuxprobe.com.

第3步:检验解析结果。在前面的正向解析实验中,已经把系统网卡中的DNS地址参数修改成了本机IP地址,因此可以直接使用nslookup命令来检验解析结果,仅需输入IP地址即可查询到对应的域名信息。

[root@linuxprobe ~]# nslookup
> 192.168.21.112
Server: 127.0.0.1
Address: 127.0.0.1#53
112.21.168.192.in-addr.arpa name = ns.linuxprobe.com.
112.21.168.192.in-addr.arpa name = www.linuxprobe.com.
112.21.168.192.in-addr.arpa name = mail.linuxprobe.com.
> 192.168.21.113
Server: 127.0.0.1
Address: 127.0.0.1#53
113.21.168.192.in-addr.arpa name = bbs.linuxprobe.com.

四、 部署从服务器

作为重要的互联网基础设施服务,保证DNS域名解析服务的正常运转至关重要,只有这样才能提供稳定、快速且不间断的域名查询服务。在DNS域名解析服务中,从服务器可以从主服务器上获取指定的区域数据文件,从而起到备份解析记录与负载均衡的作用,因此通过部署从服务器可以减轻主服务器的负载压力,还可以提升用户的查询效率。在本实验中,主服务器与从服务器分别使用的操作系统和IP地址如表所示。

主机名称 操作系统 IP地址
主服务器 RHEL 7 192.168.21.112
从服务器 RHEL 7 192.168.21.113

第1步:在主服务器的区域配置文件中允许该从服务器的更新请求,即修改allow-update {允许更新区域信息的主机地址;};参数,然后重启主服务器的DNS服务程序。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update { 192.168.21.113; };
};
zone "21.168.192.in-addr.arpa" IN {
type master;
file "192.168.21.arpa";
allow-update { 192.168.21.113; };
};
[root@linuxprobe ~]# systemctl restart named

第2步:在从服务器中填写主服务器的IP地址与要抓取的区域信息,然后重启服务。注意此时的服务类型应该是slave(从),而不再是master(主)。masters参数后面应该为主服务器的IP地址,而且file参数后面定义的是同步数据配置文件后要保存到的位置,稍后可以在该目录内看到同步的文件。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type slave;
masters { 192.168.21.112; };
file "slaves/linuxprobe.com.zone";
};
zone "21.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.21.112; };
file "slaves/192.168.21.arpa";
};
[root@linuxprobe ~]# systemctl restart named

第3步:检验解析结果。当从服务器的DNS服务程序在重启后,一般就已经自动从主服务器上同步了数据配置文件,而且该文件默认会放置在区域配置文件中所定义的目录位置中。随后修改从服务器的网络参数,把DNS地址参数修改成192.168.10.20,这样即可使用从服务器自身提供的DNS域名解析服务。最后就可以使用nslookup命令顺利看到解析结果了。

[root@linuxprobe ~]# cd /var/named/slaves
[root@linuxprobe slaves]# ls
192.168.21.arpa linuxprobe.com.zone
[root@linuxprobe slaves]# nslookup
> www.linuxprobe.com
Server: 192.168.21.113
Address: 192.168.21.113#53
Name: www.linuxprobe.com
Address: 192.168.21.112
> 192.168.21.112
Server: 192.168.21.113
Address: 192.168.21.113#53
112.21.168.192.in-addr.arpa name = www.linuxprobe.com.
112.21.168.192.in-addr.arpa name = ns.linuxprobe.com.
112.21.168.192.in-addr.arpa name = mail.linuxprobe.com.
五、安全的加密传输

前文反复提及,域名解析服务是互联网基础设施中重要的一环,几乎所有的网络应用都依赖于DNS才能正常运行。如果DNS服务发生故障,那么即便Web网站或电子邮件系统服务等都正常运行,用户也无法找到并使用它们了。互联网中的绝大多数DNS服务器(超过95%)都是基于BIND域名解析服务搭建的,而bind服务程序为了提供安全的解析服务,已经对TSIG(RFC 2845)加密机制提供了支持。TSIG主要是利用了密码编码的方式来保护区域信息的传输(Zone Transfer),即TSIG加密机制保证了DNS服务器之间传输域名区域信息的安全性。

书接上回。前面在从服务器上配妥bind服务程序并重启后,即可看到从主服务器中获取到的数据配置文件。

主机名称 操作系统 IP地址
主服务器 RHEL 7 192.168.21.112
从服务器 RHEL 7 192.168.21.113
[root@linuxprobe ~]# ls -al /var/named/slaves/
total 12
drwxrwx---. 2 named named 54 Jun 7 16:02 .
drwxr-x---. 6 root named 4096 Jun 7 15:58 ..
-rw-r--r--. 1 named named 432 Jun 7 16:02 192.168.10.arpa
-rw-r--r--. 1 named named 439 Jun 7 16:02 linuxprobe.com.zone
[root@linuxprobe ~]# rm -rf /var/named/slaves/*

第1步:在主服务器中生成密钥。dnssec-keygen命令的常用参数

参数 作用
-a 指定加密算法,包括RSAMD5(RSA)、RSASHA1、DSA、NSEC3RSASHA1、NSEC3DSA等
-b 密钥长度(HMAC-MD5的密钥长度在1~512位之间)
-n 密钥的类型(HOST表示与主机相关)

使用下述命令生成一个主机名称为master-slave的128位HMAC-MD5算法的密钥文件。在执行该命令后默认会在当前目录中生成公钥和私钥文件,我们需要把私钥文件中Key参数后面的值记录下来,一会儿要将其写入传输配置文件中。

[root@linuxprobe ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave
Kmaster-slave.+157+46845
[root@linuxprobe ~]# ls -al Kmaster-slave.+157+46845.*
-rw-------. 1 root root 56 Jun 7 16:06 Kmaster-slave.+157+46845.key
-rw-------. 1 root root 165 Jun 7 16:06 Kmaster-slave.+157+46845.private
[root@linuxprobe ~]# cat Kmaster-slave.+157+46845.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: 1XEEL3tG5DNLOw+1WHfE3Q==
Bits: AAA=
Created: 20170607080621
Publish: 20170607080621
Activate: 20170607080621

第2步:在主服务器中创建密钥验证文件。进入bind服务程序用于保存配置文件的目录,把刚刚生成的密钥名称、加密算法和私钥加密字符串按照下面格式写入到tansfer.key传输配置文件中。为了安全起见,我们需要将文件的所属组修改成named,并将文件权限设置得要小一点,然后把该文件做一个硬链接到/etc目录中。

[root@linuxprobe ~]# cd /var/named/chroot/etc/
[root@linuxprobe etc]# vim transfer.key
key "master-slave" {
algorithm hmac-md5;
secret "1XEEL3tG5DNLOw+1WHfE3Q==";
};
[root@linuxprobe etc]# chown root:named transfer.key
[root@linuxprobe etc]# chmod 640 transfer.key
[root@linuxprobe etc]# ln transfer.key /etc/transfer.key

第3步:开启并加载Bind服务的密钥验证功能。首先需要在主服务器的主配置文件中加载密钥验证文件,然后进行设置,使得只允许带有master-slave密钥认证的DNS服务器同步数据配置文件:

[root@linuxprobe ~]# vim /etc/named.conf1 //2 // named.conf3 //4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS5 // server as a caching only nameserver (as a localhost DNS resolver only).6 //7 // See /usr/share/doc/bind*/sample/ for example named configuration files.8 //9 include "/etc/transfer.key";10 options {11 listen-on port 53 { any; };12 listen-on-v6 port 53 { ::1; };13 directory "/var/named";14 dump-file "/var/named/data/cache_dump.db";15 statistics-file "/var/named/data/named_stats.txt";16 memstatistics-file "/var/named/data/named_mem_stats.txt";17 allow-query { any; };18 allow-transfer { key master-slave; };
………………省略部分输出信息………………
[root@linuxprobe ~]# systemctl restart named

至此,DNS主服务器的TSIG密钥加密传输功能就已经配置完成。此时清空DNS从服务器同步目录中所有的数据配置文件,然后再次重启bind服务程序,这时就已经不能像刚才那样自动获取到数据配置文件了。

[root@linuxprobe ~]# rm -rf /var/named/slaves/*
[root@linuxprobe ~]# systemctl restart named
[root@linuxprobe ~]# ls  /var/named/slaves/

第4步:配置从服务器,使其支持密钥验证。配置DNS从服务器和主服务器的方法大致相同,都需要在bind服务程序的配置文件目录中创建密钥认证文件,并设置相应的权限,然后把该文件做一个硬链接到/etc目录中。

[root@linuxprobe ~]# cd /var/named/chroot/etc
[root@linuxprobe etc]# vim transfer.key
key "master-slave" {
algorithm hmac-md5;
secret "1XEEL3tG5DNLOw+1WHfE3Q==";
};
[root@linuxprobe etc]# chown root:named transfer.key
[root@linuxprobe etc]# chmod 640 transfer.key
[root@linuxprobe etc]# ln transfer.key /etc/transfer.key

第5步:开启并加载从服务器的密钥验证功能。这一步的操作步骤也同样是在主配置文件中加载密钥认证文件,然后按照指定格式写上主服务器的IP地址和密钥名称。注意,密钥名称等参数位置不要太靠前,大约在第43行比较合适,否则bind服务程序会因为没有加载完预设参数而报错:

[root@linuxprobe etc]# vim /etc/named.conf1 //2 // named.conf3 //4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS5 // server as a caching only nameserver (as a localhost DNS resolver only).6 //7 // See /usr/share/doc/bind*/sample/ for example named configuration files.8 //9 include "/etc/transfer.key";10 options {11 listen-on port 53 { 127.0.0.1; };12 listen-on-v6 port 53 { ::1; };13 directory "/var/named";14 dump-file "/var/named/data/cache_dump.db";15 statistics-file "/var/named/data/named_stats.txt";16 memstatistics-file "/var/named/data/named_mem_stats.txt";17 allow-query { localhost; };18 19 /* 20 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.21 - If you are building a RECURSIVE (caching) DNS server, you need to enable 22 recursion. 23 - If your recursive DNS server has a public IP address, you MUST enable access 24 control to limit queries to your legitimate users. Failing to do so will25 cause your server to become part of large scale DNS amplification 26 attacks. Implementing BCP38 within your network would greatly27 reduce such attack surface 28 */29 recursion yes;30 31 dnssec-enable yes;32 dnssec-validation yes;33 dnssec-lookaside auto;34 35 /* Path to ISC DLV key */36 bindkeys-file "/etc/named.iscdlv.key";37 38 managed-keys-directory "/var/named/dynamic";39 40 pid-file "/run/named/named.pid";41 session-keyfile "/run/named/session.key";42 };43 server 192.168.21.11244 {45 keys { master-slave; };46 }; 47 logging {48 channel default_debug {49 file "data/named.run";50 severity dynamic;51 };52 };53 54 zone "." IN {55 type hint;56 file "named.ca";57 };58 59 include "/etc/named.rfc1912.zones";60 include "/etc/named.root.key";61

第6步:DNS从服务器同步域名区域数据。现在,两台服务器的bind服务程序都已经配置妥当,并匹配到了相同的密钥认证文件。接下来在从服务器上重启bind服务程序,可以发现又能顺利地同步到数据配置文件了。

[root@linuxprobe ~]# systemctl restart named
[root@linuxprobe ~]# ls /var/named/slaves/192.168.21.arpa  linuxprobe.com.zone

Linux学习笔记RHEL 7(九)--RHEL7.0 DNS服务配置相关推荐

  1. RHEL7.0 DNS服务配置

    系统版本: [root@localhostnamed]# uname -a Linuxmainserver.fengslab.com 3.10.0-123.el7.x86_64 #1 SMP Mon ...

  2. Linux学习笔记RHEL 7(一)--RedHatEnterpriseLinux 7.0安装过程

    一.前两天安装了centOS6.5的版本,最近在跟着刘遄老师学习<Linux就该这么学>,所以按照老师的讲述:说一下RHEL7.0的安装过程:RedHatEnterpriseLinux 7 ...

  3. Linux学习笔记RHEL 7(十)--使用Vsftpd服务传输文件和使用Samba或NFS实现文件共享

    一.文件传输协议 vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性 ...

  4. Kali linux 学习笔记(十九)缓冲区溢出——linux(crossfire) 2020.3.1

    前言 上一篇在windows下用SLMail的漏洞实现缓冲区溢出 这次在Linux下用crossfire的漏洞实现缓冲区溢出 crossfire穿越火线 多人在线rpg游戏 1.9.0版本接受入站so ...

  5. Linux学习笔记(十九)文件压缩

    一.常见的压缩文件 Windows .rar .zip .7z Linux .zip,.gz,.bz2,.xz,.tar.gz,.tar.bz2,.tar.xz 文件压缩可以节省内存,也可以节省传输速 ...

  6. Linux学习笔记二十九——http服务

    基础概念: HTTP:Hyper Text Transfer Protocol 超文本传输协议 versions: HTTP/0.9:只接收GET一种请求方法,只支持纯文本 HTTP/1.0:支持PU ...

  7. [Linux学习笔记]Gtk-WARNING **: cannot open display: :0解决方法

    我在其他账户上命令行登录root建立了一个700权限的文件夹 试图用eog打开里面的一张图片时出现这样的问题 No protocol specified Unable to init server: ...

  8. Linux学习笔记(十八) -- 运行程序,出现Failed to load module canberra-gtk-module错误的解决方案

    1.错误内容 错误描述 执行程序时,提示如下错误: Failed to load module "canberra-gtk-module" 2.解决方案 (1)执行语句: sudo ...

  9. Cty的Linux学习笔记(九)

    Linux学习笔记--第九篇 命令(command): df(disk filesystem):用于查看已挂载的磁盘的总容量,使用容量,剩余容量,不可以加任何参数 -i:表示查看inodes的使用情况 ...

最新文章

  1. 【OpenCV 例程200篇】63. 图像锐化——Laplacian 算子
  2. Unity官方宣传片Adam 播放地址
  3. ios 开发需要看的书籍
  4. IT职场人生系列之二十:危险职业(续1)
  5. Linux进不了进程,既然在Linux中程序不是进程,那么到底什么才算是进程呢?
  6. 大数据可视化常见的三种错误
  7. win10设置HTML桌面背景,Win10系统直接将视频设置为桌面背景的方法
  8. Audio HAL 通话录音上下行分离
  9. android fastboot模式下载以及出现的问题
  10. docker安装mysql后无法执行mysql命令
  11. 3000字长文:探讨报销系统使用满意度的NPS指标设计
  12. 苹果8a1660是什么版本_苹果7a1660是什么版本
  13. word文档怎么删除论文末尾尾注的横线
  14. 定义图书类Book,具有属性账号id,铭name.作者author和价格price,在创建图书对象时要求通过构造器进行创建,- -次性将四个属性全部赋值
  15. 12306抢票工具的使用
  16. 计算机文件类型与扩展表,新建excel表格的文件格式和扩展名不匹配怎么办
  17. Visio2019安装教程(与正版office同时使用)
  18. AI教程:自定义参考线
  19. 极客日报第 31 期:编写贩卖《和平精英》游戏外挂,5人被判刑;苹果推出轻App码
  20. 如何培养自己的赚钱能力

热门文章

  1. 斯坦福大学-自然语言处理入门 笔记 第十九课 单词含义与相似性
  2. 大型养猪场智能监控系统开发
  3. 2019icpc南京网络赛 Holy Grail(SPFA)
  4. PS制作马赛克效果、炫酷光线
  5. JS:原生JS实现message消息提示框
  6. 比特率 波特率 数据传输速率 区别
  7. linux dir大全,Linux常用命令大全
  8. 轻松选择/复制word文档的整个章节的内容
  9. 基于Pytorch实现的快速人脸识别模型
  10. html 图片 气泡,微信气泡的图片铺满怎么做的?canvas做出来吗?css呢?