BoyChai's Blog - 网络服务 https://blog.boychai.xyz/index.php/category/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/ VSFTPD-FTP服务器 https://blog.boychai.xyz/index.php/archives/24/ 2022-08-05T07:23:00+00:00 VSFTPDvsftpd 是一款UNIX/LINUX上的FTP服务器软件,号称是"可能是类UNIX系统中最安全、最快的FTP服务器",其具有安全、快速、稳定、开源 (基于 GPLv2 协议开源)的特点。官网:https://security.appspot.com/vsftpd.html安装方式yum -y install vsftpd相关文件配置文件:/etc/vsftpd/vsftpd.conf服务脚本:/usr/lib/systemd/system/vsftpd.service,/etc/rc.d/init.d/vsftpd用户认证配置文件:/etc/pam.d/vsftpd两种模式FTP采用双通道协议,命令连接和数据连接,并且还有两种连接模式,如下连接模式命令连接数据连接主动(PORT)客户端随机端口---->服务器tcp21客户端随机端口<----服务器tcp20被动(PORT)客户端随机端口---->服务器tcp21客户端随机端口---->服务器随机端口端口配置配置项值作用listen_port端口号(默认21)命令端口号修改ftp_data_port端口号(默认为20)主动模式端口号修改pasv_min_port端口号(0为随机分配)被动模式端口号最小值pasv_max_port端口号(0为随机分配)被动模式端口号最大值匿名配置配置项值作用anonymous_enableYES/NO(默认NO)是否支持匿名用户no_anon_passwordYES/NO(默认NO)匿名用户略过口令检查anon_world_readable_onlyYES/NO(默认YES)匿名是否只能下载全部权限为读的文件anon_upload_enableYES/NO(默认NO)匿名上传,注意:文件系统权限anon_mkdir_write_enableYES/NO(默认NO)匿名是否可以创建目录anon_umask000-777匿名上传文件的umaskanon_other_write_enableYES(默认NO)匿名用户是否可修改修改和上传文件用户配置配置项值作用guest_enableYES/NO(默认NO)所有系统用户是否都映射guest用户guest_username系统用户名配合guest_enable生效,指定guest用户local_enableYES/NO(默认YES)是否允许linux用户登录write_enableYES/NO(默认YES)允许系统用户上传文件local_umask000-777指定系统用户上传文件的umasklocal_root系统目录guest用户登录所在目录chroot_local_userYES/NO(默认NO)禁锢系统用户只能在自己的家目录活动chroot_list_enableYES/NO禁锢或不禁锢特定的系统用户在家目录中chroot_list_file系统文件目录配合chroot_list_enable,chroot_list_enable=YES则chroot_list_file文件中的用户不被禁锢否则相反日志配置配置项值作用xferlog_enableYES/NO(默认YES)启用记录上传下载日志xferlog_std_formatYES/NO(默认YES)使用wu-ftp日志格式xferlog_file系统文件目录(默认 /var/log/xferlog)指定wu-ftp日志文件,可自动生成dual_log_enableYES/NO(默认NO)使用vsftpd日志格式vsftpd_log_file系统文件目录(默认/var/log/vsftpd.log)指定vsftpd日志文件,可自动生成登录控制配置项值作用userlist_enableYES/NO(默认YES)是否启用控制用户登录的列表文件userlist_denyYES/NO(默认YES)黑名单,不提示口令,NO为白名单userlist_file文件目录(默认 /etc/vsftpd/users_list)用户列表文件网络限制配置项值作用max_clientsNULL最大并发连接数max_per_ipNULL每个IP同时发起的最大连接数anon_max_rateNULL匿名用户的最大传输速率local_max_rateNULL本地用户的最大传输速率connect_timeoutNULL主动模式数据连接超时时长accept_timeoutNULL被动模式数据连接超时时长data_connection_timeoutNULL数据连接无数据输超时时长idle_session_timeoutNULL无命令操作超时时长ascii_upload_enableYES/NO(默认YES)上传时优先以文本方式传输ascii_download_enableYES/NO(默认YES)下载时优先以文本方式传输SSL配置配置项值作用ssl_enableYES/NO(默认NO)是否启用SSLallow_anon_sslYES/NO(默认NO)匿名是否启用SSLforce_local_logins_sslYES/NO(默认NO)本地用户登录是否加密force_local_data_sslYES/NO(默认NO)本地用户数据传输是否加密rsa_cert_file文件位置证书文件位置PS:在配置之前请查看是否支持 SSL,使用命令"ldd\`which vsftpd\`"返回libssl.so即可其他配置配置项值作用use_localtimeYES/NO(默认NO)使用当地时间(默认为NO,使用GMT)ftpd_banner"欢迎信息"登录提示信息banner_file文件目录(默认:/etc/vsftpd/ftpbanner.txt)指定一个文件作为登录提示信息,ftpd_banner优先生效dirmessage_enableYES/NO(默认YES)目录访问提示信息message_file文件名称(默认.message)目录的提示信息文件,默认是目录下的".message"文件pam_service_name文件名称(默认vsftpd)使用pam(Pluggable Authentication Modules)完成用户认证,默认对应"/etc/pam.d/vsftpd"文件nopriv_user系统用户vsftpd服务指定用户身份运行 SendMail-邮件服务器搭建 https://blog.boychai.xyz/index.php/archives/21/ 2022-07-22T12:08:00+00:00 环境: rocky8.5 selinux和防护墙关闭。安装: yum -y install sendmail sendmail-cf配置:编辑/etc/mail/sendmail.mc,大概在121行这个Addr参数就是指定监听的ip,把127.0.0.1修改成自己的ip或者0.0.0.0,也可以修改成网段之类的,这里不多赘述。修改后保存退出。...... 119 dnl # address restriction to accept email from the internet or intranet. 120 dnl # 121 DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl 122 dnl # 123 dnl # The following causes sendmail to additionally listen to port 587 for ......sendmail的配置文件是由m4这个工具生成,使用下面命令生成配置文件m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf之后编辑/etc/mail/access,在最后面追加以下内容,意为谁可以使用这个服务器来进行发送邮件。网段形式的ip可以这样写"192.168.0"。Connect:0.0.0.0 RELAY启动:systemctl start sendmailtelnet测试邮件发送:# telnet 127.0.0.1 25 #连接sendmail服务器 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 s ESMTP Sendmail 8.15.2/8.15.2; Sat, 23 Jul 2022 05:08:11 -0400 HELO boychai.xyz #和服务器说明我是那个域 250 s Hello localhost [127.0.0.1], pleased to meet you mail from:admin@boychai.xyz #发件人 250 2.1.0 admin@boychai.xyz... Sender ok rcpt to:1972567225@qq.com #收件人 250 2.1.5 1972567225@qq.com... Recipient ok data #发送内容 354 Enter mail, end with "." on a line by itself subject:hello #指定标题 hello sendmail #邮件内容 . #写好内容之后用"."结束 250 2.0.0 26N98BZR011316 Message accepted for delivery quit #退出 221 2.0.0 s closing connection Connection closed by foreign host.qq邮箱那边收到邮件之后可能会在垃圾桶里面,效果如下 Jenkins-持续性集成平台(平台优化) https://blog.boychai.xyz/index.php/archives/14/ 2022-06-01T08:25:00+00:00 更换插件源进入到Jenkins里面依次点击Manage Jenkins(系统管理) -> Plugin Manager(插件管理) -> Advanced(高级)之后修改Update Site(升级站点)选项的地址,默认地址为:https://updates.jenkins.io/update-center.json是jenkins的官方插件源,下载插件会很慢,建议使用国内的,这里把我他替换成清华大学的源地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json,更换好后需要点击submit保存一下之后重启jenkins切换中文插件名称:Localization: Chinese (Simplified)在Plugin Manager(插件管理)界面点击Available(可选插件),搜索Chinese之后勾选复选框点击"Install without restart"即可安装,这个插件安装好需要重启才可以生效。安装过程中点击Restart Jenkins那个复选框即可权限管理插件名称:Role-based Authorization Strategy默认jenkins是没有做用户权限这块的内容的,所以需要这个插件。在Plugin Manager(插件管理)界面点击Available(可选插件),搜索Role-based之后勾选复选框点击"Install without restart"即可安装。安装好之后依次点击Manage Jenkins(系统管理) -> Configure Global Security(全局安全配置),找到授权策略,选择"Role-Based Strategy"项,保存。之后依次点击 Manage Jenkins(系统管理) -> Manage and Assign Roles(管理和分配角色) -> Manage Roles(管理角色)。角色(Roles)就可以理解为权限组,进入之后会有三种角色类型,如下表角色类型作用Global Roles平台全局的权限Item Roles针对项目的权限Node RolesJenkins的节点权限关于角色的权限信息对照全面权限作用Administer系统管理员权限Read浏览框架(登录)代理权限作用Build该权限允许用户在代理上允许任务。Configure该权限允许用户配置代理。Connect该权限允许用户连接代理或者让代理上线。Create该权限允许用户创建代理。Delete该权限允许用户删除已存在的代理。Disconnect该权限允许用户断开或者临时下线代理。Provision设置新节点任务权限作用Build该权限允许启动一个新的构建任务。Cancel该权限允许取消计划或终止运行中的构建任务。Configure修改任务的配置。Create创建新的任务。Delete删除任务。Discover该权限允许查找任务。比读取的权限低,当用户试图访问任务时会重定向到登录页面。如果没有该权限,就不能查找工程名称,并会得到404错误。Read查看任务。(可以拒绝该权限,但允许发现,迫使匿名用户登录到看到任务)Workspace该权限允许获取 Jenkins 执行构建任务时检出的工作空间内容。如果你不希望用户通过工作空间浏览器访问工作空间中的文件(例如: SCM 检出的源码或者构建的中间产物),你可以取消该权限。视图权限作用Configure该权限允许用户改变视图的配置。Create该权限允许用户创建新的视图。Delete该权限允许用户删除已有的视图。Read该权限允许用户查看视图(允许读取访问)。这里我创建了两个角色一个全局的一个项目的,分配的权限如下图,其中item的角色添加会有一个pattern的一个项,这里面是写正则表达式的,”item01.*“的意思为前缀以item01的项目。最后点击save(保存)角色创建好之后我们创建一个用户测试一下,依次点击Manage Jenkins(系统管理) -> Manage Users(管理用户) -> Create User(新建用户),创建好之后如下图之后依次点击 Manage Jenkins(系统管理) -> Manage and Assign Roles(管理和分配角色) -> Assign Roles(指派角色)。把创建的角色添加到全局和项目角色里面,并且勾选刚才创建的角色组里面。记得点击Save(保存)。此时我们创建一个item01的项目,依次点击New Item(新建任务) -> 输入item01 -> 点击"构建一个自由风格的软件项目" -> OK(确定) -> Save(保存)此时我们就创建了一个项目,如下图这个时候退出管理员登录刚才创建的用户,效果如下凭证管理插件名称:Credentials Binding在使用jenkins的时候会有很多的项目需要去pull,会涉及到很多账户的管理,默认jenkins是不提供这方面的管理的。依次点击 Manage Jenkins(系统管理) -> Manage Credentials(凭据) -> global-> Add Credentials(添加凭据) 可以进行对凭据的管理类型分别为,Username with password(用户名和密码)、SSH Username with private key(具有私钥的SSH用户名)、Secret file(机密文件)、Secret text(机密文本)、Certificate(证书)GIT插件插件名称:Git安装之前请确保系统里有git这个工具,jenkins的docker会自带git。jenkins默认是没有git克隆代码这个能力的,这个插件完美解决了这个问题。在项目配置里找到源码管理选择git并添加代码仓库地址保存,例如下图之后我们运行构建一下,查看一下状态,如下图 Jenkins-持续性集成平台(部署安装) https://blog.boychai.xyz/index.php/archives/13/ 2022-05-31T04:28:00+00:00 官方文档官方文档YUM的方式系统环境Rocky Linux 8.5,2G内存2核CPU,selinux和防火墙全部关闭安装sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install fontconfig java-11-openjdk yum install jenkins systemctl start jenkins启动后直接访问主机的8080端口即可Docker的方式系统环境Rocky Linux 8.5,2G内存2核CPU,selinux和防火墙全部关闭docker版本: 20.10.16安装useradd -s /sbin/nologin jenkins mkdir /srv/jenkins chown -R jenkins:jenkins /srv/jenkins docker run -d --name jenkins -p 8080:8080 -p 50000:50000 --restart=on-failure -v /srv/jenkins:/var/jenkins_home -u root jenkins/jenkins:lts-jdk1150000端口是一个代理端口,/srv/Jenkins是本地的目录需要自己创建,也可以自己改。初始化访问8080端口之后需要进入初始化阶段,访问之后如下图如果在本地直接部署的话可以直接cat这个文件“cat /var/lib/jenkins/secrets/initialAdminPassword”,如果是在docker中部署的可以使用docker logs jenkins来查,或者"cat /srv/jenkins/secrets/initialAdminPassword"来查看这个安装插件会从jenkins官网来下载插件,会很慢不建议初始化的时候安装任何的插件,这里点击选择插件来安装,之后需点击"无"之后在进行安装这个时候会让你创建一个管理员用户,这个用户无所谓根据自己来创建即可之后还会让你去配置一个url地址这个直接默认保存即可有域名可以配域名。之后就安装完成了 GitLab-代码仓库(部署安装) https://blog.boychai.xyz/index.php/archives/12/ 2022-05-28T11:23:00+00:00 官方文档官方文档系统直接安装的方式系统环境CentOS7,4核CPU和4G内存,selinux和防火墙全部关闭官方推荐最小配置为4核CPU和4G内存,GitLab很吃内存,太低可能部署不起来安装sudo yum install -y curl policycoreutils-python openssh-server perl //安装前置依赖软件 sudo systemctl enable sshd //设置开机自启 sudo systemctl start sshd //开启服务 curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash //配置yum源 sudo EXTERNAL_URL="http://gitlab.host.com" yum install -y gitlab-jh //设置访问地址之后安装GitLab安装好之后会出先一些备注信息,如下图使用Docker的方式系统环境CentOS7,4核CPU和4G内存,selinux和防火墙全部关闭官方推荐最小配置为4核CPU和4G内存,GitLab很吃内存,太低可能部署不起来docker版本为 20.10.16docker-compose版本为 v2.5.0安装系统变量配置在安装之前需要配置一个系统环境,用来存储GitLab安装时、运行时,产生的配置、日志文件。export GITLAB_HOME=/srv/gitlab本地位置容器位置存储内容$GITLAB_HOME/data/var/opt/gitlab用于存储应用程序数据。$GITLAB_HOME/logs/var/log/gitlab用于存储日志。$GITLAB_HOME/config/etc/gitlab用于存储极狐GitLab 配置文件。使用docker安装sudo docker run --detach \ --hostname gitlab.host.com \ --publish 443:443 --publish 80:80 --publish 23:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ --shm-size 256m \ registry.gitlab.cn/omnibus/gitlab-jh:latest其中--hostname需要替换成自己的域名。之后使用docker的方式安装下载好镜像启动之后容器会进行初始化,期间是访问不了的可以使用命令“sudo docker logs -f gitlab”来查看进度使用docker-compose安装docker-cmpose的yml文件内容为version: '3.6' services: web: image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest' restart: always hostname: 'gitlab.host.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'https://gitlab.example.com' # Add any other gitlab.rb configuration here, each on its own line ports: - '80:80' - '443:443' - '23:22' volumes: - '$GITLAB_HOME/config:/etc/gitlab' - '$GITLAB_HOME/logs:/var/log/gitlab' - '$GITLAB_HOME/data:/var/opt/gitlab' shm_size: '256m'启动命令: "docker-compose up -d"其中hostname需要替换成自己的域名,之后使用docker安装的话下载好镜像启动之后容器会进行初始化,期间是访问不了的,如果想要查看进度需要查看docker-compose运行容器的名称之后使用命令”docker logs -f [容器名称]“来看。安装完成此时访问配置好的域名即可访问,默认账号为root,密码存放在系统或者容器的/etc/gitlab/initial_root_password文件中,cat一下直接使用即可ps:容器密码文件存放在/srv/gitlab/config/initial_root_password文件中,全部的密码文件只会存在24小时,使用这个密码登录只后建议创建一个新的密码 BIND9-DNS服务器 https://blog.boychai.xyz/index.php/archives/7/ 2022-01-21T15:07:00+00:00 DNSDNS是将域名解析成IP地址的协议,有的时候也用于将IP地址反向解析成域名,也可以实现双向的解析。当客户端使用域名时会向DNS服务器发送请求,DNS会返回相应的IP给客户端之后客户端在向对应的IP发起请求。域名域名是网络上用于网络域、计算机、服务器等网络设备地址的标识。域名的结构如下图结构:域名是分层管理的,最高层的域名是根域"."就是一个点"."。根域:全世界只有13组根服务器,名字分别为A至M,其中10台设置在美国,另外三台设置于英国、瑞典、日本。顶级域名是由ICANN委任的注册机构负责运行。二级域名:二级域名不需要到ICANN进行申请,只需要到顶级域名的注册机构去检查带申请的名字是否可用,并且不是别人的商标时只需要缴纳一笔一年的费用即可得到相应的域名。BIND9BIND9是用于搭建DNS服务器的一个软件应用。安装[root@localhost ~]# yum -y install bind [root@localhost ~]# named -v BIND 9.11.26-RedHat-9.11.26-6.el8 (Extended Support Version) <id:3ff8620>主配置主配置文件为/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. // options { listen-on port 53 { 127.0.0.1; }; //监听的ipv4端口以及ip,需要改成自己的主机ip listen-on-v6 port 53 { ::1; }; //监听的ipv6端口以及ip,改成自己的ipv6地址。用不到可以直注释掉 directory "/var/named"; //区域文件存放位置 dump-file "/var/named/data/cache_dump.db"; //当执行rndc dumpdb时服务器存放数据库文件路径名 statistics-file "/var/named/data/named_stats.txt"; //当执行rndc stats命令的时候,服务器会统计信息追加到的文件路径 memstatistics-file "/var/named/data/named_mem_stats.txt"; //服务器输出的内存使用统计文件路径 secroots-file "/var/named/data/named.secroots"; //安全根的保存位置 recursing-file "/var/named/data/named.recursing"; //递归查询数据的保存位置 allow-query { localhost; }; //允许查询的ip,需要改为any /* - 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-enable yes; //开启dnssec dnssec-validation yes; //设置dnssec在递归查询服务器上开启 managed-keys-directory "/var/named/dynamic"; //指定目录中的文件储存,跟踪管理DNSSEC密钥 pid-file "/run/named/named.pid"; //pid文件路径 session-keyfile "/run/named/session.key"; //会话密钥路径 /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ include "/etc/crypto-policies/back-ends/bind.config"; }; // 日志相关内容 logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; //定义了根区域,没事可以看一下他这个区域文件(/var/named/named.ca),里面配置了13个根主机以及ipv4的地址还有ipv6的地址 zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; //标注的文件也作为配置生效,这个一般用于存放区域的配置 include "/etc/named.root.key"; //标注的文件也作为配置生效这个文件里面暂只需要修改的配置已列出:listen-on port 53 { 服务器的IP; }; //监听的ipv4端口以及ip,需要改成自己的主机ipallow-query { any; }; //允许查询的ip,需要改为any其他配置看自己需求来各种类型的记录SOA记录:起始授权记录 表示一个授权区域的开始NS记录:标识一个域的域名服务器A记录:将主机名转换为ipv4地址AAAA记录:将主机名转换为ipv6地址CNAME记录:别名记录 解析域名MX记录:邮件交换记录PTR记录:将地址转换成域名 反向解析配置一个正向解析域编辑区域文件/etc/named.rfc1912.zones在最底下添加内容[root@localhost ~]# tail -n5 /etc/named.rfc1912.zones zone "host.com." IN { type master; file "host.com.zone"; allow-update { none; }; };zone:定义一个区域写法为 zone "域名." IN {配置}type:设置类型为masterfile:设置区域的解析记录文件名称为host.com.zoneallow-update:设置动态更新的ip,我这写的是none即不允许动态更新现在设置此域名的解析记录,在/var/named/下创建对应文件host.com.zone并编辑[root@localhost named]# pwd /var/named [root@localhost named]# touch host.com.zone [root@localhost named]# vim host.com.zone host.com. 600 IN SOA ns1.host.com. chai.simplefish.cn. ( 202212101 ;序列号,每次更新记录则需要修改 10800 ;刷新时间,没隔多久到主服务器更新一次 900 ;重试时间,应该小于刷新时间 604800 ;过期时间,当辅助dns服务器无法联系主服务器的时间,超过这个时间则过期 86400 ;非权威应答的ttl,缓存DNS记录多长时间 ) host.com. 600 IN NS ns1.host.com. ns1.host.com. 60 IN A 192.160.0.100 dns.host.com. 60 IN A 192.160.0.100 bind.host.com. 60 IN A 192.160.0.100 www.host.com. 60 IN A 192.160.0.100 [root@localhost named]# systemctl start named //启动服务一共有六条记录,其中SOA和NS记录时必须要有的。记录写法为:主机名 TTL值 IN 记录类型 值在bind9里的所有配置文件中 所有的域名最后都必须带有".",这个"."意味着根域的意思所以必须要有,不然启动服务的时候会报语法错误。测试打开自己电脑的CMD执行一下操作C:\Users\SimpleFish>nslookup //使用nslookup工具 默认服务器: public1.114dns.com Address: 114.114.114.114 > server 192.168.0.100 //server设置测试dns的服务器地址 默认服务器: [192.168.0.100] Address: 192.168.0.100 > set type=any //设置类型为any(全部) > host.com //查看host.com的SOA记录 服务器: [192.168.0.100] Address: 192.168.0.100 host.com primary name server = ns1.host.com responsible mail addr = chai.simplefish.cn serial = 202212101 refresh = 10800 (3 hours) retry = 900 (15 mins) expire = 604800 (7 days) default TTL = 86400 (1 day) host.com nameserver = ns1.host.com ns1.host.com internet address = 192.160.0.100 > ls host.com //列出host.com的基本记录 [[192.168.0.100]] host.com. NS server = ns1.host.com bind A 192.160.0.100 dns A 192.160.0.100 ns1 A 192.160.0.100 www A 192.160.0.100 > 配置一个反向解析域[root@localhost ~]# tail -n5 /etc/named.rfc1912.zones //查看区域配置文件 zone "0.168.192.in-addr.arpa" IN { type master; file "0.168.192.in-addr.zone"; allow-update { none; }; }; [root@localhost ~]# cat /var/named/0.168.192.in-addr.zone //查看区域的解析文件 0.168.192.in-addr.arpa. 600 IN SOA ns1.host.com. chai.simplefish.cn. ( 202212101 ;序列号,每次更新记录则需要修改 10800 ;刷新时间,没隔多久到主服务器更新一次 900 ;重试时间,应该小于刷新时间 604800 ;过期时间,当辅助dns服务器无法联系主服务器的时间 86400 ;非权威应答的ttl,缓存DNS记录多长时间 ) 0.168.192.in-addr.arpa. 600 IN NS ns1.host.com. 100.0.168.192.in-addr.arpa. 600 IN PTR dns.host.com. 100.0.168.192.in-addr.arpa. 600 IN PTR bind.host.com. 100.0.168.192.in-addr.arpa. 600 IN PTR www.host.com. [root@localhost ~]# systemctl restart named和正向解析的写法略有差别,反向解析的去域名是网段反写加in-addr.arpa,然后解析记录文件也是必须要写SOA记录和NS记录的,反向解析的记录类型为PTR。然后依旧是必须带根域"."。测试C:\Users\SimpleFish>nslookup 默认服务器: public1.114dns.com Address: 114.114.114.114 > server 192.168.0.100 默认服务器: [192.168.0.100] Address: 192.168.0.100 > set type=PTR //设置类型为PTR反向解析记录 > 192.168.0.100 服务器: [192.168.0.100] Address: 192.168.0.100 100.0.168.192.in-addr.arpa name = dns.host.com 100.0.168.192.in-addr.arpa name = www.host.com 100.0.168.192.in-addr.arpa name = bind.host.com 0.168.192.in-addr.arpa nameserver = ns1.host.com ns1.host.com internet address = 192.160.0.100委派DNS委派DNS的意思实质上就是指自己域名的下一级域名交给另一台主机来管理,也可以叫做子域。具体配置如下[root@linux-1 ~]# tail -n 5 /etc/named.rfc1912.zones zone "host.com." IN { type master; file "host.com.zone"; allow-update { none; }; }; [root@linux-1 ~]# cat /var/named/host.com.zone host.com. 600 IN SOA dns1.host.com. chai.simplefish.cn. ( 0 ; serial 10800 ; refresh 900 ; retry 604800 ; expire 86400 ) ; minimum host.com. 600 IN NS ns1.host.com. dns1.host.com. 60 IN A 192.168.1.111 ns1.host.com. 60 IN A 192.168.1.111 www.host.com. 60 IN A 192.168.1.111 shanghai.host.com. 600 IN NS ns2.host.com. ns2.host.com. 60 IN A 192.168.1.112把需要委托的下一级域名指定一条NS记录,记录指向委派的主机,上面是把shanghai.host.com这个三级域委派给192.168.1.112主机再来看一下被委派主机的配置[root@linux-2 ~]# tail -5 /etc/named.rfc1912.zones zone "shanghai.host.com." IN { type master; file "shanghai.host.com.zone"; allow-update { none; }; }; [root@linux-2 ~]# cat /var/named/shanghai.host.com.zone shanghai.host.com. 600 IN SOA dns1.shanghai.host.com. chai.simplefish.cn. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum shanghai.host.com. 600 IN NS ns1.shanghai.host.com. ns1.shanghai.host.com. 60 IN A 192.168.1.112 dns1.shanghai.host.com. 60 IN A 192.168.1.112 www.shanghai.host.com. 60 IN A 192.168.1.112被委派的则就可以正常配置,测试的话只需要指定第一台dns即可查询到委派的信息第三台主机测试如下[root@linux-3 ~]# dig -t A www.host.com @192.168.1.111 +short 192.168.1.111 [root@linux-3 ~]# dig -t A www.shanghai.host.com @192.168.1.111 +short 192.168.1.112辅助DNS主DNS的配置需要修改的参数如下listen-on port 53 { 服务器的IP; }; //监听的ipv4端口以及ip,需要改成自己的主机ip allow-query { any; }; //允许查询的ip,需要改为any allow-transfer { 辅助DNS服务器的IP }; //允许同步自己信息的服务器,默认没有这个参数需要在主配置文件的options {}里面添加,这个参数可以写在区域文件里面。 also-notify { 辅助DNS服务器的IP }; //当服务器记录更新时通知对应设置的服务器,默认没有这个参数需要在主配置文件的options {}里面添加,这个参数可以写在区域文件里面。辅助DNS的配置需要修改的参数如下listen-on port 53 { 服务器的IP; }; //监听的ipv4端口以及ip,需要改成自己的主机ip allow-query { any; }; //允许查询的ip,需要改为any masterfile-format text; //设置同步到本地的文件格式,默认没有这个参数需要在主配置文件的options {}里面添加主DNS的区域配置和解析配置如下[root@master ~]# tail -n5 /etc/named.rfc1912.zones zone "host.com." IN { type master; file "host.com.zone"; allow-update { none; }; }; [root@master ~]# cat /var/named/host.com.zone host.com. 600 IN SOA ns1.host.com. chai.simplefish.cn. ( 202212201 ;序列号,每次更新记录则需要修改 10800 ;刷新时间,没隔多久到主服务器更新一次 900 ;重试时间,应该小于刷新时间 604800 ;过期时间,当辅助dns服务器无法联系主服务 器的时间 86400 ;非权威应答的ttl,缓存DNS记录多长时间 ) host.com. 600 IN NS ns1.host.com. ns1.host.com. 60 IN A 192.160.0.101 dns.host.com. 60 IN A 192.160.0.101 bind.host.com. 60 IN A 192.160.0.101 www.host.com. 60 IN A 192.160.0.101 [root@master ~]# systemctl restart named辅助DNS的区域配置和解析配置如下[root@slave ~]# tail -n5 /etc/named.rfc1912.zones zone "host.com." IN { type slave; masters { 192.168.0.101; }; file "slaves/host.com.zone"; }; [root@slave ~]# systemctl restart named辅助DNS只需要写一个区域配置即可,解析记录它会自动同步。这里类型设置成了slavemasters是设置主DNS服务器的IPfile这里设置了一个路径是slaves这个路径是可以自己改的,如果要改的话权限一定对的上不然可能会出问题,我建议就是创建的文件或者目录的用户和属组都换成named刷新成功后他会在/var/named/slaves下生成对应的文件[root@slave slaves]# pwd /var/named/slaves [root@slave slaves]# cat host.com.zone $ORIGIN . $TTL 600 ; 10 minutes host.com IN SOA ns1.host.com. chai.simplefish.cn. ( 202212201 ; serial 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS ns1.host.com. $ORIGIN host.com. $TTL 60 ; 1 minute bind A 192.160.0.101 dns A 192.160.0.101 ns1 A 192.160.0.101 www A 192.160.0.101他这种是宏定义的方式来同步解析文件这种写法后面也会说一下。反向解析的辅助DNS配置一样域名换一下即可。智能DNS智能DNS主要作用就是不同的网段去解析一个域名,可以实现解析不同的地址。ACL组ACL组可以用来定义一个ip的范围。any参数就是一个acl组,他代表的是全部的IP。定义方式如下acl "acl_name" { acl_name; //其他的acl组 192.168.0.0/24; //网段 !192.168.0.2; //不包括192.168.0.2这个ip { //添加ip组 192.168.1.2; 192.168.1.3; }; };view视图view视图可以对acl组单独设置dns的区域解析。写法方式如下view "view_name" { //设置view视图的名称 match-clients { acl组; }; //设置acl组 recursion yes; //允许递归查询 zone "host.com." { //正常写zone区域 type master; file "host.com.zone"; allow-update { none; }; }; };如果要使用view视图那么就需要把所有的区域都放到view视图里面,除了自己设置的默认还有一个默认的view视图,名称为"default",需要把根域"."加进去以及/etc/named.rfc1912.zones里的所有zone。配置[root@localhost named]# tail -n14 /etc/named.conf //查看主配置文件。 include "/etc/named-view.conf"; //引入我自己创建的视图文件 view "default" { match-clients { any; }; recursion yes; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; }; include "/etc/named.root.key"; [root@localhost named]# cat /etc/named-view.conf //查看我自己创建的视图文件内容 acl "test01" { 192.168.0.101; //定义acl test01 }; acl "test02" { 192.168.0.107; //定义acl test02 }; view "test01" { //配置视图test01 match-clients { test01; }; recursion yes; zone "host.com." { type master; file "host.com.test01.zone"; allow-update { none; }; }; }; view "test02" { //配置视图test02 match-clients { test02; }; recursion yes; zone "host.com." { type master; file "host.com.test02.zone"; allow-update { none; }; }; };我把根域和named.rfc1912.zones里的所有域都放到了default视图里面。然后我还引入了一个文件用来专门放acl和view的文件,配置文件是有前后之分的如果把"default"视图放到前面则都只会匹配"default"视图所以我把它放到了前面,文件里定义了两个acl,分别是两个ip,之后分别配置了一个视图,视图里都是同一个域名但是解析文件不一样。当匹配到acl规则之后会走对应的解析文件。否则走"default"视图。公网DNS因为BIND软件开源所以公网dns涉及到一个安全的问题,就有了BIND-CHROOT这个东西,当运行的时候bind会在另一个根下运行,当服务器因为DNS某些漏洞被黑入的时候他也只能在这个根下操作。从而保证整个服务器的数据安全。配置bind-chroot的方式[root@localhost ~]# yum -y install bind [root@localhost ~]# yum -y install bind-chroot [root@localhost ~]# cd /var/named/chroot/etc/ [root@localhost etc]# ln /etc/named* ./ ln: /etc/named: hard link not allowed for directory [root@localhost etc]# cd ../var/named/ [root@localhost named]# ln /var/named/* ./ ln: /var/named/chroot: hard link not allowed for directory ln: /var/named/data: hard link not allowed for directory ln: /var/named/dynamic: hard link not allowed for directory ln: /var/named/slaves: hard link not allowed for directory [root@localhost named]# mkdir data dynamic slaves [root@localhost named]# chown named:named data dynamic slaves [root@localhost named]# systemctl start named-chroot装好bind-chroot之后需要把原来的文件结构都搞到/var/named/chroot下这个chroot下就是一个服务运行的根,开启时服务名称改为named-chroot,文件结构不管是复制还是剪切都可以只要有对应结构的文件都在就行,我这里做的是硬链接,往后的配置都需要在/var/named/chroot/这个根下面进行。BIND-UTILS工具包安装[root@localhost named]# yum -y install bind-utils nslookup非交互式nslookup "解析的域名"[root@localhost ~]# nslookup ns1.host.com Server: 192.168.0.105 Address: 192.168.0.105#53 Name: ns1.host.com Address: 192.168.0.105交互式nslookup进入交互,"server DNS服务器地址"指定dns服务器地址、"set type=类型"可以设置类型SOA记录和MX记录需要单独设置才能查看、直接输入域名则输出解析的地址。[root@localhost ~]# nslookup > server 192.168.0.105 Default server: 192.168.0.105 Address: 192.168.0.105#53 > www.host.com Server: 192.168.0.105 Address: 192.168.0.105#53 Name: www.host.com Address: 192.168.0.105 > set type=SOA > host.com Server: 192.168.0.105 Address: 192.168.0.105#53 host.com origin = ns1.host.com mail addr = chai.simplefish.cn serial = 0 refresh = 86400 retry = 86400 expire = 86400 minimum = 86400 hosthost -t "类型" "域名" "DNS地址"[root@localhost ~]# host -t A www.host.com 192.168.0.105 Using domain server: Name: 192.168.0.105 Address: 192.168.0.105#53 Aliases: www.host.com has address 192.168.0.105 [root@localhost ~]# host -t ns host.com 192.168.0.105 Using domain server: Name: 192.168.0.105 Address: 192.168.0.105#53 Aliases: host.com name server ns1.host.com.digdig -t "类型" "域名" @"DNS地址" 参数+short 返回精简结果-x 进行逆向域名查询+noall 忽略全部,不进行输出+answer 只输出结果,省略过程+trace:进行迭代查[root@localhost ~]# dig -t A www.host.com @192.168.0.105 ; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> -t A www.host.com @192.168.0.105 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47724 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: d97935613cf3169f270c53e061ed0fe27016722968769c4a (good) ;; QUESTION SECTION: //说明查询内容 ;www.host.com. IN A ;; ANSWER SECTION: //查询结果 www.host.com. 60 IN A 192.168.0.105 ;; AUTHORITY SECTION: //查询附加内容 host.com. 600 IN NS ns1.host.com. ;; ADDITIONAL SECTION: //查询附加内容 ns1.host.com. 60 IN A 192.168.0.105 ;; Query time: 0 msec ;; SERVER: 192.168.0.105#53(192.168.0.105) ;; WHEN: Sun Jan 23 03:20:50 EST 2022 ;; MSG SIZE rcvd: 119 [root@localhost ~]# dig -t A www.host.com @192.168.0.105 +short 192.168.0.105nsupdatensupdate是用来添加和删除记录,不支持修改记录。使用方法只能是交互式使用。使用命令前需要把区域的allow-update参数修改一下,改成使用nsupdate主机的ip即可。可以使用acl。[root@localhost ~]# tail -n5 /etc/named.rfc1912.zones zone "host.com." IN { type master; file "host.com.zone"; allow-update { 192.168.0.105; }; //修改允许动态更新的ip地址 }; [root@localhost ~]# systemctl restart named //重启生效 [root@localhost ~]# nsupdate > server 192.168.0.105 //指定DNS服务器地址 > update add server.host.com 60 A 192.168.0.105 //add就是添加 之后写一条记录 记录写法很严格给必须是"记录 TTL 记录类型 记录值" > send //更新 > quit //退出 [root@localhost ~]# dig -t A server.host.com @192.168.0.105 +short 192.168.0.105 [root@localhost ~]# nsupdate > server 192.168.0.105 > update del server.host.com //del为删除删除记录 > send > quit [root@localhost ~]# dig -t A server.host.com @192.168.0.105 +short是用这个命令不会在自己创建的记录文件里添加记录,而是会生成一个jnl日志文件,正常编辑为乱码。[root@localhost named]# cat host.com.zone.jnl ;BIND LOG V9 ▒8▒▒JhostcomX6ns1hostcomchai simplefishcnQ▒Q▒Q▒Q▒JhostcomX6ns1hostcomchai simplefishcnQ▒Q▒Q▒Q▒serverhostcom<▒i▒JhostcomX6ns1hostcomchai simplefishcnQ▒Q▒Q▒Q▒serverhostcom<▒iJhostcomX6ns1hostcomchai simplefishcnQ▒Q▒Q▒Q▒[root@localhost named]# RNDC管理BIND9rndc可以对bind9进行热更新,可以对某个域的解析单独进行重载。使用方法如下[root@localhost ~]# rndc-confgen # Start of rndc.conf key "rndc-key" { algorithm hmac-md5; secret "e7SaG876PM54+/1bRFh/JQ=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; }; # End of rndc.conf # Use with the following in named.conf, adjusting the allow list as needed: # key "rndc-key" { # algorithm hmac-md5; # secret "e7SaG876PM54+/1bRFh/JQ=="; # }; # # controls { # inet 127.0.0.1 port 953 # allow { 127.0.0.1; } keys { "rndc-key"; }; # }; # End of named.confrndc-confgen这个命令会生成两段配置,使用"#"注释的配置字段需要放到服务端的配置文件里,未注释的字段需要放到控制端进行配置。服务端配置[root@localhost ~]# tail -n8 /etc/named.conf key "rndc-key" { algorithm hmac-md5; secret "e7SaG876PM54+/1bRFh/JQ=="; }; controls { inet 192.168.0.105 port 953 //这个地址需要修改成DNS服务器的主机地址 allow { any; } keys { "rndc-key"; }; //这个allow {} 是允许谁来进行操作,我这里写的any意思为全部,不建议这样搞建议写成控制端的ip。 }; [root@localhost ~]# systemctl restart named控制端配置[root@localhost ~]# cat /etc/rndc.conf key "rndc-key" { algorithm hmac-md5; secret "e7SaG876PM54+/1bRFh/JQ=="; }; options { default-key "rndc-key"; default-server 192.168.0.105; default-port 953; }; [root@localhost ~]# rm -rf /etc/rndc.key //默认系统里会自带一个rndc的key删除即可 [root@localhost ~]# rndc status //查看状态,不报错就可以用了 version: BIND 9.11.26-RedHat-9.11.26-6.el8 (Extended Support Version) <id:3ff8620> running on localhost.localdomain: Linux x86_64 4.18.0-305.3.1.el8.x86_64 #1 SMP Tue Jun 1 16:14:33 UTC 2021 boot time: Sun, 23 Jan 2022 10:21:45 GMT last configured: Sun, 23 Jan 2022 10:21:45 GMT configuration file: /etc/named.conf CPUs found: 1 worker threads: 1 UDP listeners per interface: 1 number of zones: 104 (97 automatic) debug level: 0 xfers running: 0 xfers deferred: 0 soa queries in progress: 0 query logging is OFF recursive clients: 0/900/1000 tcp clients: 3/150 TCP high-water: 3 server is up and running这是基本的配置,使用方式如下不允许动态更新的域allow-update { none; }; //配置区域的时候这个参数为none [root@localhost ~]# dig -t A a.host.com @192.168.0.105 +short [root@localhost ~]# echo "a A 192.168.0.105" >> /var/named/host.com.zone [root@localhost ~]# rndc reload host.com zone reload queued [root@localhost ~]# dig -t A a.host.com @192.168.0.105 +short 192.168.0.105允许动态更新的域allow-update { IP; }; //配置区域的时候这个参数有内容 [root@localhost ~]# dig -t A b.host.com @192.168.0.105 +short [root@localhost ~]# echo "b A 192.168.0.105" >> /var/named/host.com.zone [root@localhost ~]# rndc freeze host.com //冻结这个动态域 [root@localhost ~]# rndc reload host.com //重载 zone reload queued [root@localhost ~]# rndc thaw host.com //启用动态域 The zone reload and thaw was successful. [root@localhost ~]# dig -t A b.host.com @192.168.0.105 +short 192.168.0.105 其他宏定义写法$ORIGIN . //宏定义根域 $TTL 600 ; 10 minutes //宏定义TTL值 //定义之后的就可以不用谢TTL和根域了,就和这条SOA记录一样,他会自动的在域名后面加根域和TTL host.com IN SOA ns1.host.com. chai.simplefish.cn. ( 2 ; serial 86400 ; refresh (1 day) 86400 ; retry (1 day) 86400 ; expire (1 day) 86400 ; minimum (1 day) ) NS ns1.host.com. $ORIGIN host.com. //重新定义域名 $TTL 60 ; 1 minute //重新定义TTL dns A 192.168.0.105 //域名则可以省略掉宏定义的内容 ns1 A 192.168.0.105 www A 192.168.0.105如何验证我的配置?使用nslookup,host,dig,ping都可以来验证自己配置的DNS服务器,如果服务器可以重启依旧不同则可以依次检查服务器的防火墙、网络互通性、客户端的DNS是否为服务端来解决问题。