LINUX系统与dns服务
dns服务
dns:domain name service //协议
实现:bind(berkeley internet name domain)
监听端口:
udp:53
tcp:53
名称解析:将一种格式的信息转化为另外一种格式,以某关键字为标准查找某一数据库的过程
passwd <--> nsswitch转换
login:nsswitch为login提供服务
nsswitch配置文件在/etc/nsswitch
hosts:存放的为主机与ip、别名
由于主机是在太多,所以将数据库和服务器进行分片管理。 分布式数据库:将数据库切割,放在不同的服务器上。实际上还需要一个类似于"引路人"一般的放置着引导向各个分布式数据库的数据库的服务器。当外部需要进行dns域名转换时,便告诉他需要到哪个数据库上进行名称解析,再找到那个数据库。实际上每个数据库都要通过这个服务器进行登记备案。否则将不承认,也无法找到你自己所建立的。实际上,由于数量过大,一些分布式数据库需要再进行分布。
其中的结构其实可以类比成linux上的根文件系统,每个人都要通过根为入口来进行访问文件和目录,底下的目录一层套着一层,最终才能找到自己需要的文件。
根域(.)-->一级域(iccna)-->二级域(组织域) 实际上我们平时输入的域名都是自下而上进行输入的如(www.baidu.com)www是最小的域,由此自下而上。
namespace:名称空间
一级域:
组织域:.com,.org,.mil,.gov,.edu,
国家域:.cn,.hk,.tw,.jp,.ir(伊朗),.iq(伊拉克),.us,.uk
反向域:.in-addr.arpa
另外任何想要访问其他主机信息的,都需要以跟作为入口去寻找,除非是在同一个服务器管辖下的域名,只需要找自己的服务器就行。但是确又不会进行逐层的递归解析,否则根的工作量太大。每一次访问的时候,都只会告诉其一个下一次要寻找的地址让他自行去寻找。如找到根,根返回消息说让他去找.com,于是.com再说你去找baidu 直到找到负责管辖的 再给以正确的ip地址信息。
递归:逐层解析
迭代:dns才会迭代
根拒绝回答递归问题 所谓的递归和迭代在这边通俗一点讲,就是递归只需发出一次请求就能够收到消息。而迭代则是发出好几次请求。
客户端指向的dns服务器,一定是允许给本地主机做递归的
数据库每一个条叫一个资源记录(resource record),资源记录有类型 ,用于表示资源的功能
soa:start of authority,起始授权
ns:name server,域名服务器
mx:mail exchanger:邮件交换器
a:address,(fqdn-->ip)
ptr: poiter,(ip-->fqdn)
aaaa:address,fqdn-->ipv6
cname:canonical name,正式名称(别名记录)
dns:fqdn --> ip
正反向解析技术不同,因此不应该存放于同一个数据库文件中进行
域:domain,逻辑概念
区域:zone,物理概念
dns服务器的类型
主dns服务器
辅助dns服务器 辅助服务器不能够自行的血区域数据文件,只能够从主服务器上读取。该过程称为区域传送
缓存名称服务器
转发器
dns的数据库文件(区域数据文件,区域自身有名字):文本文件,只能包含资源记录或宏定义,每行一个
资源记录的格式:
name [ttl(缓存时间)] in 资源记录类型(rrtype) value
例子:
www 600(单位s) in a 1.2.3.4
www.magedu.com. 600 in a 1.2.3.4
soa:
name:只能是区域名称,通常可以简写为@,例如:magedu.com.
value:有n个数值,最主要的是主dns服务器的fqdn,点不可省略
注意:soa必须是区域数据库文件第一条记录
例子:
@ 600 in soa na.magedu.com. 管理员邮箱(dnsadmin.magedu.com.)(
序列号(serial number) ;注释内容,十进制数据,不能超过10位,通常使用日期,例如2014031001 用以让辅助服务器知道数据发生了改变的,主服务器上每次数据改变,序列号都会发生改变
刷新时间(refresh time) ;即每隔多久到主服务器检查一次
重试时间(retry time) ;应该小于refresh time
过期时间(expire time)
netgative answer ttl ;否定答案的ttl
)
ns:可以有多条
name:区域名称,通常可以简写为@
value:dns服务器的fqdn(可以使用相对名称)
例子:
@ 600 in ns na
a:只能定义在正向区域数据文件中
name:fqdn(可以使用相对名称)
value:ip
例子:
www 600(单位s) in a 1.2.3.4
www 600(单位s) in a 1.2.3.5
可做轮询
www 600(单位s) in a 1.2.3.4
ftp 600(单位s) in a 1.2.3.4
但凡以fqdn做为其值的记录,应该给这个值做一条a记录
aaaa:
mx:可以有多个
name:区域名称,用于标识smtp服务器
value:包含优先级和fqdn
优先级:0-99,数字越小,级别越高,
例子:
@ 600 in mx 10 mail
@ 600 in mx 20 mail2 先找优先级高的,实在太过繁忙,则找第二个。并没有在轮换工作
ptr:ip --> fqdn,只能定义在反向区域数据文件中,反向区域名称为逆向网络地址加.in.addr.arpa.后缀组成
name:ip,逆向的主机地址,例如172.16.100.7的name为7.100,完全格式为7.100.16.172.in-addr-arpa.
value:fqdn
例子:
4.3.2. 600 in ptr www.magedu.com.
区域传送:
辅助dns服务器从主dns服务器或其他的辅助dns服务器请求数据传输过程
完全区域传送:传送区域的所有数据,axfr
增量区域传送:传送区域中改变的数据部分,ixfr
辅助服务器按时间段去跟主服务器进行请求数据的跟新,如果多次主服务器未能响应请求,则认为主服务器瘫痪,不再与主服务器进行通信(一般相关规定定义在soa中了)。另外主服务器如果有数据跟新,也会立刻通知辅助服务器数据的跟新,以实现数据的同步
bind:组织维护者isc(www.isc.org) dhcp
4:功能简单,安全
9:
协议dns,实现bind,进程named
chroot 为安全提供的机制 chroot假根,让其以这个作为根,保证安全性
主配置文件:定义区域 /etc/named.conf
至少有三个区域:
根、
locahost、
127.0.0.1
区域数据文件:/var/named
named
用户:named
组:named
先由主配置文件声明各种区域,然后再到/var/named 文件目录下读取相关的区域数据文件
主配置文件:
options{
//全局选项
}
zone "zone name" {
//定于区域
}
logging{
//日志文件
}
include:加载别的文件
自定义
optins{
directory "/var/named";
};
zone "." in{
type{hint(根)|master(主)|slave(从)|forward(转发)}
file "named.ca"
}
例子如果你申请到了域名test.com
那么你可以配置
zone "test.com." in{
type{master(主)}
file "test.com.zone"
}
再在/var/named目录下创建test.com.zone文件 文件内容
$ttl 600
@ in soa dns.test.com. admin test.com.(
.
.
)
@ in ns dns (这里用了soa上定义的相对名称)
@ in mx 10 mail
dns in a 192.168.48.128
mail in a 192.168.48.128
www in a 192.168.48.128
pop in cname mail
ftp in cname www
之后改个属组属主和权限
name-checkconf 检查主配置文件
named -u named
name-checkzone "区域文件" 配置文件
定义监听的地址
recursion 是否允许递归查询
dig 命令
dig [-t type] [-x addr] name @dns服务器
+[no]trace [不]适用迭代
+[no]tcp 是否使用tcp
+[no]recurse:是否使用递归
host
host[-t type] {name} [server]
nslookup
nslookup>
server dns_server_ip
set q=type
{name}
反向解析区域数据库文件:区域名称以逆向的网络地址,并以.in-addr.arpa为后缀
第一条必须soa
应该具有ns记录,但不能出现mx和a记录
较常见的微ptr记录
名称为逆向的主机名
$ttl 600
@ in soa dns.test.com. admin test.com.(
.
.
)
@ in ns dns (这里用了soa上定义的相对名称)
@ in mx 10 mail
in ns dns.test.com
7 in ptr dns.test.com
1 in ptr www.test.com
区域传送:
用dig模拟完全区域传送
dig -t axfr 区域名称 @server
主从同步:
/etc/resolv.conf
主从:
主:bind版本可以低于从的
主从可以不再同一网段
向区域中添加从服务器的关键两步
在上级获得授权
在区域数据文件中为从服务器添加一条ns记录和对应的a或ptr记录,另外soa里的序列号也要加个1
配置从服务器的步骤
zone"test.com" in {
type slave;
masters {192.168.48.128; };
file "slaves/test.com.zone" ; 注意这里辅助服务器的区域数据文件需要放在/var/named/slaves下
};
区域传送安全控制
allow-transfer{127.0.0.1;127.16.100.1}
allow-transfer{none;}
rndc:remote name domain controller
远程管理bind的工具
rndc:密钥
rndc:持有一半密钥,保存于rndc的配置文件中
bind:持有一般密钥,保存在主配置文件中
rndc的配置文件/etc/rndc.conf 现在好像已经没有了
生成密钥 rndc-confgen 生产的密钥文件中的一半用于bind的文本复制到bind的主配置文件中将注释去掉 便可以使用rndc
rndc
reload
reload zone
reconfig:重读配置文件并加载新增的区域
querylog:关闭或开启查询日志
stop 关闭服务
flush 清空服务器的缓存
flushname name:只清空指定名称相关的缓存
trace:打开debug,调试模式,debug有级别的概念,每执行一次提升一个等级
trace level:指定debug的级别
如果rndc无法正常工作,可尝试使用rndc-confgen生成/etc/rndc。conf配置文件,并将配置文件中的后半部分复制到bind的主配置文件中按指示启用即可
bind子域授权的实现:
在父域的配置文件中添加如下项:
授权的子区域名称
子区域的名称服务器
子区域的名称服务器的ip地址
例子:
tech.test.com in ns dns.tech.test.com
dns.tech.test.com in a 192.168.48.160
tech.test.com in ns ns2.tech.test.com
ns2.tech.test.com in a 192.168.48.161 另外子域服务器需要副服务器的话,也需要再主服务器上进行标明
接着子域服务器,需要同主服务器那样配置属于自己的dns服务器
子域服务器与主副服务器最大的配置差别就是,子域服务器的域名和父服务器的域名是不同的,而主副服务器的域名是相同的
配置区域转发:转发域
解析某本机不负责的区域内的名称时不转发给根,而是转给指定的主机:
zone "zone name" in{
type forward;
forwarders { dns_server; };
forward only(仅转发)|first(先转发在找根)
}
配置转发的方式
转发非本机负责解析的所有区域
options{
forward only|frist
forwarders{ ip; }
}
转发某特定区域
zone"特定区域" in{
type forward;
forwarders{ ip; }
forward only|frist
}
转发必须对方服务器支持对本服务器的递归
安全控制选项:
allow-transfer{};通常都需要启用,从服务器
allow-query{};此项仅用于服务器是缓存名称服务器时,只开放查询功能给本地客户端
allow-recursion{可以使用网段};允许递归的白名单
allow-update{ none; }:允许动态更新数据文件的主机白名单
acl:bind支持使用访问控制列表
acl acl_name{
172.16.0.0/16
192.168.0.0/24
127.0.0.0/8
}
访问控制列表只有定义后才能使用,通常acl要定义在named.conf的最上方
bind有四个内置的acl
any:任何主机
none:无一主机
local:本机
localnet:本机所在的网络
dns编译安装,view视图,linux完全定制内核
3月11
view 视图,逻辑的dns服务器,即能够让不同网络(如电信和网通)访问同一个域名时,使其指向不同的主机ip实现访问速度的加快。能够实现让一个view实现多次
acl telecom{
1.2.0.0/16
4.5.8.0
}
acl unicom{
6.4.0.0/16
4.5.3.0
}
view view_name {
match-clients{ telecom; }
zone"magelinux.com" in{
type master;
file "magelinux.com.telcom";
}
}
view view_name {
match-clients{ unicom; }
zone"magelinux.com" in{
type master;
file "magelinux.com.unicom";
}
}
view view_name {
match-clients{ any; }
zone"magelinux.com" in{
type master;
file "magelinux.com.unicom";
}
}
只要写入view,所有的都应该写在view中 包括将/etc/named.conf下的zone "."根也放在view中
自上而下匹配
/dev/random:自动生成
熵池
/dev/udandom:软件生成
bind dlz
rndc reeconfig
源码安装named
thrads 线程
epoll 时间库
--diabled-chroot
前提:配置好开发环境,安装包组
1.下载源代码。编译安装
tar xf bind-9.9.5.tar.gz
cd bind-9.9.5
./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/--enable-threads --enable-epoll --disabled--chroot
make && make install
2配置主配置文件
3.创建区域数据文件
3.1 name.ca
dig -t ns @ >/var/named/named.ca
3.2 name.localhost
3.3 named.loopback
4创建用户,并测试启动
groupadd -g 53 -r named
useradd -g named-r named
chown root:named /etc/named/* /var/named/*
chmod 640 /etc/named/named.conf /var/named/*
vim /etc/profile.d/nmaed.sh
export path=/usr/local/bind9/bin:/usr/local/bind9/sbin:$path'
named -u named -c /etc/named/named.conf
5、rndc
rndc -confgen -r /dev/
6、准备启动脚本dns 编译安装 02 23分到53分
7、性能测试
banckmark
queryperf
dnstop
<dns and bind>
bash编程之变量
1、bash的内置变量:
path ps1 hostname uid histfile histeilesize histcontrol
$bash:bash二进制程序文件的路径
$bash_subshell:子shell的层次
$bash_version
$editor:默认编辑器
$euid:有效的用户id
$uid:当前用户的id号
$funcname:当前函数的名称
$groups:当前用户显示的组
$home:当前用户的家目录
$hosttype:主机架构类型,用来识别系统硬件
$machtype:平台类型,系统平台依赖的编译平台
$ostype:os系统类型
$ifs:输入数据时的字段分隔符,默认是空白符(空格、制表符、换行符)
$oldpwd:上次使用的目录
$pwd:当前目录
$ppid:父进程
$ps1:主提示符
$ps2:第二提示符,主要用于补充完全命令输入时的提示符
$ps3:第三提示符,用于select命令中
$ps4:第四提示符,当使用-x选项调用脚本时,显示的提示符,默认为+号
$seconds:当前脚本已经运行的时长
$shlvl:shell的级别。bash别嵌入的深度
2、特殊变量:
$0:脚本名称自身
$1,$2。。。。:位置参数
$#:命令行参数个数
$*:所有的参数,被当作一个字符串
$@:所有的参数,每个参数都是一个独立的字符串
$-:传递给脚本的标记
$!:运行于后台的最后一个作业的pid
$_:上一条命令的最后一个参数的值
$?:上一条命令状态的返回值
$$:脚本自身的pid
操作变量:
${#var} :返回变量中字符串的长度
${var}:变量引用
${var:-default}:如果var没有声明或者为空,则返回default字串,否则返回var自身的值
${var:+default}:如果var没有声明或者为空,则返回空字串,否则返回default的值
${var:=default}:如果var没有声明或者为空,则返回default字串,并且将default赋值给var,否则返回var自身的值
${var:?default}:如果var没有声明或者为空,则以default为错误信息返回,否则
zb 返回var自身的值
字串消除
${var#*word}:查找var中自左而右第一个被word匹配到的串,并将此串及向左的所有内容都删除
${var#*word}:查找var中自左而右最后一次被word匹配到的串,并将此串及向左的所有内容都删除
${var%word*}:查找var中自右而左第一个被word匹配到的串,并将此串及向右的所有内容都删除
${var%%word*}:查找var中自右而左最后一次被word匹配到的串,并将此串及向右的所有内容都删除
取字串:
${var:pos}:偏移pos个字符,取余下的字串
name=jerry,${name:2}结果为rry
${var:pos:num}偏移pos个字符,取num个字符长度的字串
name='hello world' ${name:2:5}结果为llo w
字串替换
${var/pattern/replaceplacement} :以pattern为模式匹配var中的字串,将第一次匹配到的替换为replaceplacement
${var// pattern/replaceplacement} :以pattern为模式匹配var中的字串,将全部匹配到的替换为replaceplacement6
声明变量:
declare
-i:整形
-a:数值
-x:环境变量
-r:只读变量,不能撤销,不能修改,相当于readonly
-f:声明函数
openssh:
ssh openssh
安装配置dropbear
1.编译安装
tar
cd
./configure
make progrms="dropbear dbclient dropberkey scp"
make progrms="dropbear dbclient dropberkey scp" install
2.脚本
3配置文件位置/etc/sysconfig/dropbear
keysize=2048
port=22022
4后配置
chmod +x /etc/rc.d/init.d/dropbear
chkconfig -add dropbear
定制linux内核
tar -xf -c /usr/src
cd /usr/src/linux
cp /boot/config-version /usr/src/linux/.config 自己选的可能会导致驱动的缺少,所以复制一份模板,再执行make menuconfig来增删改查
make menuconfig
make
make modules_install
make install
make clean
make mrproper
make distclean
单内核:核心+ko模块
/lib/modules/version
make allnoconfig 自定义一个最小功能的内核,能够让系统正常运行。此时就需要完全配置
第一步 给一个将要被新主机识别的装有内核文件的磁盘不需要太大。
fdisk /dev/sdb 创建新分区,并添加2个分区 sdb1 50m sdb2 512m
mke2fs -t ext4 /dev/sdb1 /dev/sdb2 分区格式化
mkdir /mnt/{boot,sysroot}
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot 创建两个虚拟的根目录,将磁盘挂在到上面
grub-install -root-directory=/mnt /dev/sdb 安装grub
第二步 下载一个内核版本 假设叫linux3.1
tar xf linux3.1.tar.xz -c /usr/src 解压内核文件
cd /usr/src
ln -sv linux.3 linux 软连接一下(猜测应该是便于被系统识别)
make allnoconfig 将.config文件中的绝大部分可以省略的内核功能给关闭
make menuconfig 定制内核 这边省略 较复杂,可以看视频如何定制的,10-17分
make bzi(大写的i)mage 这个只编译压缩格式的内核核心,并不编译内核模块
cp arch/x86/boot/bzimage /mnt/boot/
vim /mnt/boot/grub/grub.conf 此处省略
default=0
timeout=3
title customzed linux
root (hd0,0)
kernel /bzimage ro root=/dev/sda2 init=/bin/bash
为什么要将bash 软连接成 sh ,难道识别的时候是识别sh吗?
pc server cpu + men + i/o
make bzimage 只编译核心不编译模块