Stanley's Blog

  • 首页

  • 分类

  • 归档

  • 搜索

实验文档5:DNS工具和rndc远程管理DNS实战

发表于 2018-12-16 | 更新于 2020-09-03 | 分类于 Web DNS技术
本文字数: 6.1k | 阅读时长 ≈ 6 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


DNS管理工具

安装

1
# yum install bind-utils -y

工具一:nslookup

Windows操作系统也有的一个常用工具

交互式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#nslookup 
> server localhost
Default server: localhost
Address: 127.0.0.1#53
Default server: localhost
Address: 127.0.0.1#53
> www.bkjf-inc.com
Server: localhost
Address: 127.0.0.1#53

Name: www.bkjf-inc.com
Address: 192.144.198.128
-------以上是权威应答
> server 8.8.8.8
Default server: 8.8.8.8
Address: 8.8.8.8#53
> www.bkjf-inc.com
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: www.bkjf-inc.com
Address: 192.144.198.128
-------以上是非权威应答

非交互式

1
2
3
4
5
6
7
8
9
10
#nslookup www.baidu.com
Server: 183.60.83.19
Address: 183.60.83.19#53

Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 220.181.112.244
Name: www.a.shifen.com
Address: 220.181.111.37

工具二:host

简单粗暴的小工具

1
2
3
4
#host -t A www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 220.181.112.244
www.a.shifen.com has address 220.181.111.37

工具三:dig

功能强大的DNS工具,重点掌握

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#dig -t A www.baidu.com @localhost

; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> -t A www.baidu.com @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46476
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 6

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com. IN A

;; ANSWER SECTION:
www.baidu.com. 1200 IN CNAME www.a.shifen.com.
www.a.shifen.com. 300 IN A 220.181.111.37
www.a.shifen.com. 300 IN A 220.181.112.244

;; AUTHORITY SECTION:
a.shifen.com. 1200 IN NS ns3.a.shifen.com.
a.shifen.com. 1200 IN NS ns2.a.shifen.com.
a.shifen.com. 1200 IN NS ns4.a.shifen.com.
a.shifen.com. 1200 IN NS ns5.a.shifen.com.
a.shifen.com. 1200 IN NS ns1.a.shifen.com.

;; ADDITIONAL SECTION:
ns5.a.shifen.com. 1200 IN A 180.76.76.95
ns1.a.shifen.com. 1200 IN A 61.135.165.224
ns3.a.shifen.com. 1200 IN A 112.80.255.253
ns4.a.shifen.com. 1200 IN A 14.215.177.229
ns2.a.shifen.com. 1200 IN A 220.181.57.142

;; Query time: 561 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Mar 01 09:45:51 CST 2019
;; MSG SIZE rcvd: 271

常用参数:

  • +[no]addition
  • +short

工具四:nsupdate

不常用,需要在zone配置文件里声明allow-update { acl; };

调整zone配置文件

/etc/named.rfc1912.zones
1
2
3
4
5
zone "bkjf-inc.com" IN {
type master;
file "bkjf-inc.com.zone";
allow-update { 10.4.7.11/32; };
};

重启named服务

1
# systemctl restart named

新增一条记录

1
2
3
4
5
#nsupdate 
> server 10.4.7.11
> update add update.bkjf-inc.com 60 A 10.4.7.11
> send
> quit

检查:

1
2
3
4
5
6
#nslookup update.bkjf-inc.com
Server: 10.4.7.11
Address: 10.4.7.11#53

Name: update.bkjf-inc.com
Address: 10.4.7.11

查看区域数据库文件

/var/named/
1
2
3
4
-rw-r--r-- 1 root  root   335 Feb 28 10:57 bkjf-inc.com.zone
-rw-r--r-- 1 named named 733 Mar 1 09:54 bkjf-inc.com.zone.jnl
#file bkjf-inc.com.zone.jnl
bkjf-inc.com.zone.jnl: data

产生了一个jnl的数据文件,不能使用文本编辑器打开

jnl文件(journal文件)是BIND9动态更新的时候记录更新内容所生成的日志文件。

删除一条记录

1
2
3
4
5
#nsupdate 
> server 10.4.7.11
> update delete update.bkjf-inc.com
> send
> quit

检查

1
2
3
4
5
#nslookup update.bkjf-inc.com
Server: 10.4.7.11
Address: 10.4.7.11#53

** server can't find update.bkjf-inc.com: NXDOMAIN

更新一条记录

不支持直接更新,需要先执行删除,再新增

nsupdate使用小结:

  • 优点
    • 命令简单,便于记忆
    • 不用手动变更SOA的serial序列号,自动滚动
    • 不需要重启/重载BIND9服务/配置,生效快
    • 可以通过配置acl实现远程管理
  • 缺点
    • jnl文件无法使用文本文件的方式打开
    • 只能依赖完全区域传送查看所有区域的记录
    • 更新操作复杂,先删再增
    • 远程管理有安全隐患,需要加强审计
    • 动态域在rndc管理上多一步

rndc远程管理DNS

生成rndc-key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#rndc-confgen -r /dev/urandom
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "MFM4AocpN0lcoL4fN2lA6Q==";
};

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 "MFM4AocpN0lcoL4fN2lA6Q==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

把rndc-key和controls配置到bind的主配置文件的options段里

/etc/named.conf
1
2
3
4
5
6
7
8
9
key "rndc-key" {
algorithm hmac-md5;
secret "MFM4AocpN0lcoL4fN2lA6Q==";
};

controls {
inet 10.4.7.11 port 953
allow { 10.4.7.11;10.4.7.12; } keys { "rndc-key"; };
};

注意:这里要配置一下controls段的acl,限定好哪些主机可以使用rndc管理DNS服务

重启bind9服务

1
# systemctl restart named

rndc的服务端监听在953端口,检查一下端口是否起来

1
2
# netstat -luntp|grep 953
tcp 0 0 10.4.7.11:953 0.0.0.0:* LISTEN 11136/named

在远程管理主机上安装bind

rndc命令在bind包里,所以远程管理主机需要安装bind(不需要启动named)

在远程管理主机上做rndc.conf

使用rndc进行远程管理的主机上,都需要配置rndc.conf,且rndc-key要和DNS服务器上的key一致

/etc/rndc.conf
1
2
3
4
5
6
7
8
9
10
key "rndc-key" {
algorithm hmac-md5;
secret "MFM4AocpN0lcoL4fN2lA6Q==";
};

options {
default-key "rndc-key";
default-server 10.4.7.11;
default-port 953;
};

使用rndc命令远程管理DNS

查询DNS服务状态(可以取值做监控)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#rndc status 
version: 9.9.4-RedHat-9.9.4-73.el7_6 <id:8f9657aa>
CPUs found: 2
worker threads: 2
UDP listeners per interface: 2
number of zones: 105
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

管理静态域(allow-update { none; };)

静态域zone文件
1
2
3
4
5
zone "od.com" IN {
type master;
file "od.com.zone";
allow-update { none; };
};

增、删、改一条记录后

1
2
# rndc reload od.com
zone reload up-to-date

管理动态域(allow-update { 10.4.7.11; };)

动态域zone文件
1
2
3
4
5
zone "host.com" IN {
type master;
file "host.com.zone";
allow-update { 10.4.7.11; };
};

增、删、改一条记录后

1
2
#rndc reload host.com
rndc: 'reload' failed: dynamic zone

直接reload会报错,需要先freeze再thaw才行

1
2
3
#rndc freeze host.com
#rndc thaw host.com
The zone reload and thaw was successful.

实验文档6:智能DNS实战

发表于 2018-12-16 | 更新于 2020-09-03 | 分类于 Web DNS技术
本文字数: 2.8k | 阅读时长 ≈ 3 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


BIND9的acl访问控制列表

4个内置acl

  • any:任何主机
  • none:没有主机
  • localhost:本机
  • localnet:本地子网所有IP

自定义acl

简单acl

1
2
3
acl "someips" {                               //定义一个名为someips的ACL  
10.0.0.1; 192.168.23.1; 192.168.23.15; //包含3个单个IP
};

复杂acl

1
2
3
4
5
6
7
acl "complex" {             //定义一个名为complex的ACL  
"someips"; //可以嵌套包含其他ACL
10.0.15.0/24; //包含10.0.15.0子网中的所有IP
!10.0.16.1/24; //非10.0.16.1子网的IP
{10.0.17.1;10.0.18.2;}; //包含了一个IP组
localhost; //本地网络接口IP(含实际接口IP和127.0.0.1)
};

使用acl

1
2
3
allow-update { "someips"; };
allow-transfer { "complex"; };
...

BIND9的view视图功能

view语句定义了视图功能。视图是BIND9提供的强大的新功能,允许DNS服务器根据客户端的不同,有区别地回答DNS查询,每个视图定义了一个被特定客户端子集见到的DNS名称空间。这个功能在一台主机上运行多个形式上独立的DNS服务器时特别有用。

view的语法范例

1
2
3
4
5
6
7
8
view view_name [class] {
match-clients { address_match_list } ;
match-destinations { address_match_list } ;
match-recursive-only { yes_or_no } ;
[ view_option; ...]
[ zone-statistics yes_or_no ; ]
[ zone_statement; ...]
};

view配置范例1:按照不同业务环境解析

注:以下是内网DNS的view使用范例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
acl "env-test" {
10.4.7.11;
};
acl "env-prd" {
10.4.7.12;
};

view "env-test" {
match-clients { "env-test"; };
recursion yes;
zone "od.com" {
type master;
file "env-test.od.com.zone";
};
};
view "env-prd" {
match-clients { "env-prd"; };
recursion yes;
zone "od.com" {
type master;
file "env-prd.od.com.zone";
};
};
view "default" {
match-clients { any; };
recursion yes;
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
};

view配置范例2:智能DNS

注:以下特指公网智能DNS配置范例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//电信IP访问控制列表
acl "telecomip"{ telecom_IP; ... };
//联通IP访问控制列表
acl "netcomip"{ netcom_IP; ... };
view "telecom" {
match-clients { "telecomip"; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.telecom.zone";
};
};
view "netcom" {
match-clients { "netcomip"; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.netcom.zone";
};
};
view "default" {
match-clients { any; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.zone";
};
};

实验文档7:bind-chroot和dnssec技术实战

发表于 2018-12-16 | 更新于 2020-09-03 | 分类于 Web DNS技术
本文字数: 17k | 阅读时长 ≈ 15 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


安装部署bind-chroot

系统环境

服务器:腾讯云主机,有公网IP
OS:CentOS Linux release 7.4.1708 (Core)
bind-chroot:bind-chroot-9.9.4-73.el7_6.x86_64

yum 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# yum install bind-chroot -y
=============================================================================================================================================================

Package Arch Version Repository Size
=============================================================================================================================================================

Installing:
bind-chroot x86_64 32:9.9.4-73.el7_6 updates 88 k
Installing for dependencies:
bind x86_64 32:9.9.4-73.el7_6 updates 1.8 M
Updating for dependencies:
bind-libs x86_64 32:9.9.4-73.el7_6 updates 1.0 M
bind-libs-lite x86_64 32:9.9.4-73.el7_6 updates 741 k
bind-license noarch 32:9.9.4-73.el7_6 updates 87 k
bind-utils x86_64 32:9.9.4-73.el7_6 updates 206 k

Transaction Summary
=============================================================================================================================================================

Install 1 Package (+1 Dependent package)
Upgrade ( 4 Dependent packages)

Installed:
bind-chroot.x86_64 32:9.9.4-73.el7_6


Dependency Installed:
bind.x86_64 32:9.9.4-73.el7_6


Dependency Updated:
bind-libs.x86_64 32:9.9.4-73.el7_6 bind-libs-lite.x86_64 32:9.9.4-73.el7_6 bind-license.noarch 32:9.9.4-73.el7_6 bind-utils.x86_64 32:9.9.4-73.el7_6

Complete!

配置bind-chroot

bind-chroot本质上是使用chroot方式给bind软件换了个“根”,这时bind软件的“根”在/var/named/chroot下,弄懂这一点,配置起来就跟BIND9没什么区别了
把yum安装的bind-chroot在/etc下的产生的配置文件硬链接到/var/named/chroot/etc下

/var/named/chroot/etc/
1
2
3
4
[root@VM_0_13_centos ~]# cd /var/named/chroot/etc/
[root@VM_0_13_centos etc]# ls /etc/named
named/ named.conf named.iscdlv.key named.rfc1912.zones named.root.key
[root@VM_0_13_centos etc]# ln /etc/named.* .
/var/named/chroot/var/named
1
2
3
4
5
6
7
8
9
10
11
12
[root@VM_0_13_centos named]# ln /var/named/named.* .
[root@VM_0_13_centos named]# mkdir data/ dynamic/ slaves/ dnssec-key/
[root@VM_0_13_centos named]# chgrp -R named *
[root@VM_0_13_centos named]# ll
drwxrwx--- 2 root named 4096 Feb 27 18:30 data
drwxr-xr-x 3 root named 4096 Feb 28 14:31 dnssec-key
drwxrwx--- 2 root named 4096 Feb 28 14:33 dynamic
-rw-r----- 2 root named 2281 May 22 2017 named.ca
-rw-r----- 2 root named 152 Dec 15 2009 named.empty
-rw-r----- 2 root named 152 Jun 21 2007 named.localhost
-rw-r----- 2 root named 168 Dec 15 2009 named.loopback
drwxrwx--- 2 root named 4096 Jan 30 01:23 slaves

/etc/named.conf主配置文件

编辑主配置文件,这里把53端口开放到公网

/etc/named.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { 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 no;

dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};

zone "." IN {
type hint;
file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

使用dnssec技术维护一个业务域

在公网上使用BIND9维护的业务域,最好使用dnssec技术对该域添加数字签名
DNSSEC(DNS Security Extension)—-DNS安全扩展,主要是为了解决DNS欺骗和缓存污染问题而设计的一种安全机制。

DNSSEC技术参考文献1
DNSSEC技术参考文献2

打开dnssec支持选项

/etc/named.conf
1
2
3
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

配置一个业务域bkjf-inc.com

/etc/named.rfc1912.zones
1
2
3
4
5
6
7
8
zone "bkjf-inc.com" IN {
type master;
file "bkjf-inc.com.zone";
key-directory "dnssec-key/bkjf-inc.com";
inline-signing yes;
auto-dnssec maintain;
allow-update { none; };
};

创建数字签名证书

/var/named/chroot/var/named/dnssec-key
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@VM_0_13_centos dnssec-key]# mkdir bkjf-inc.com
[root@VM_0_13_centos dnssec-key]# chgrp named bkjf-inc.com
[root@VM_0_13_centos dnssec-key]# cd bkjf-inc.com
[root@VM_0_13_centos bkjf-inc.com]# dnssec-keygen -a RSASHA256 -b 1024 bkjf-inc.com
Generating key pair..................................++++++ .++++++
Kbkjf-inc.com.+008+53901
[root@VM_0_13_centos bkjf-inc.com]# dnssec-keygen -a RSASHA256 -b 2048 -f KSK bkjf-inc.com KSK bkjf-inc.com
Generating key pair..........................................................................................+++ ............................................
.....+++
Kbkjf-inc.com.+008+40759

[root@VM_0_13_centos bkjf-inc.com]# chgrp named *
[root@VM_0_13_centos bkjf-inc.com]# chmod g+r *.private
[root@VM_0_13_centos bkjf-inc.com]# ll
total 16
-rw-r--r-- 1 root named 607 Feb 28 14:10 Kbkjf-inc.com.+008+40759.key
-rw-r----- 1 root named 1776 Feb 28 14:10 Kbkjf-inc.com.+008+40759.private
-rw-r--r-- 1 root named 433 Feb 28 14:10 Kbkjf-inc.com.+008+53901.key
-rw-r----- 1 root named 1012 Feb 28 14:10 Kbkjf-inc.com.+008+53901.private

这里如果生成密钥的速度很慢,需要yum安装一下haveged软件并开启

1
# systemctl start haveged.service

创建区域数据库文件

/var/named/chroot/var/named/bkjf-inc.com.zone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@VM_0_13_centos named]# cat bkjf-inc.com.zone
$TTL 600 ; 10 minutes
@ IN SOA ns1.bkjf-inc.com. 87527941.qq.com. (
2018121605 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS ns1.bkjf-inc.com.
NS ns2.bkjf-inc.com.
$ORIGIN bkjf-inc.com.
$TTL 60 ; 1 minute
ns1 A 192.144.198.128
ns2 A 192.144.198.128
www A 192.144.198.128
eshop CNAME www

启动bind-chroot服务

1
# systemctl start named-chroot

自动生成了签名zone

如果启动成功且配置无误,应该自动生成了带签名的zone

/var/named/chroot/var/named/
1
2
3
4
5
6
7
[root@VM_0_13_centos named]# ll
total 60
-rw-r--r-- 1 root named 507 Feb 28 14:34 bkjf-inc.com.zone
-rw-r--r-- 1 named named 512 Feb 28 14:26 bkjf-inc.com.zone.jbk
-rw-r--r-- 1 named named 742 Feb 28 14:35 bkjf-inc.com.zone.jnl
-rw-r--r-- 1 named named 4102 Feb 28 14:44 bkjf-inc.com.zone.signed
-rw-r--r-- 1 named named 7481 Feb 28 14:35 bkjf-inc.com.zone.signed.jnl

检查签名区需要用到完全区域传送命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@VM_0_13_centos named]# dig -t AXFR bkjf-inc.com @localhost

; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> -t AXFR bkjf-inc.com @localhost
;; global options: +cmd
bkjf-inc.com. 600 IN SOA ns1.bkjf-inc.com. 87527941.qq.com. 2018121608 10800 900 604800 86400
bkjf-inc.com. 86400 IN RRSIG NSEC 8 2 86400 20190330063503 20190228053503 53901 bkjf-inc.com. 0fyLJXxaDOI+RWnYjK2tGpd6WgbWmgeIADtjpPQFQLrv1X9fuDLi2MFR q0+csg5P22eVUdasKi3q5tMmFW8GZtLEBBVtOtSba3/FvtoitvyBGcG6 KJ155dPbhEFe/eR0/JhWtFsIsyj/UHtgELB4eGYJYCeEI+WzUopT7voz 4UE=
bkjf-inc.com. 86400 IN NSEC eshop.bkjf-inc.com. NS SOA RRSIG NSEC DNSKEY TYPE65534
bkjf-inc.com. 600 IN RRSIG NS 8 2 600 20190330063017 20190228053309 53901 bkjf-inc.com. Y/T0m4p0yNrJwJiHc0mjDgit/9E4h7MXPb5F2WgBd+huXYgL0pS0vOb3 c2aRvHHW/zngPjShOfy3sYY5203SzPS15tN6E/RAs36/I33sZE7jZBFo 9q0KjEdKHNsoC9XISSdbLPCX879/B1rKZcmhpPNmhpAK6P351nWWgd9L jtU=
bkjf-inc.com. 600 IN RRSIG SOA 8 2 600 20190330063503 20190228053503 53901 bkjf-inc.com. eE3nKlCmAZrjJ3DwdzPStYmrC38X6VCqCxIc6otLJDX65Uk2uSqGSPre WIu16zEsbuuxq7/38ABrupQNwkPAgaSaiLIRC/000PXzKsUPhll0xO4x u9tLg2LBRATQ+4dHpKtLsoBTX0nXVHlz09YeAAA82r5wyQye2/ebesxH +A4=
bkjf-inc.com. 0 IN RRSIG TYPE65534 8 2 0 20190330054441 20190228053309 53901 bkjf-inc.com. sEX7jpdTbUZ3hlIR2CRWHbgceAQFVOVKnVl6CXvyQhavIFjUyBMMhXTw hKYwXd2Hc0LGg9koWJqlt0oYS8YbXacKbeBUrLovmcbYP46Uhm05zaVo jswG7oYYsYDE3ekbl5ImnAEyjksSNOgk8if/WoUvXfF5QH6Rdl+6Q3qG cEI=
bkjf-inc.com. 600 IN RRSIG DNSKEY 8 2 600 20190330063309 20190228053309 53901 bkjf-inc.com. rUGjMTxmbthB6UbmemoorQOfuen8u0xeOosl7lPRNLV2Hk7KsAZzUD2/ tRAJaY9NRZ1JhZHkmX/N5hncuVpPxZnrp8UB7qOoairqgjA73IFGoT0F 00KIU0FZaqsQAbBSzpzfbwr9KVbn1hTAq6/5Q/wrWZvQOASMYrF5Xhr9 lW4=
bkjf-inc.com. 600 IN RRSIG DNSKEY 8 2 600 20190330063309 20190228053309 40759 bkjf-inc.com. lBXWXbTshdeH/oOkBGdwIspet0ABbhUZfzAXUjOP3ivCMW5sse3ZayEA qPe6mZncURqomWNA/xQKemoJJjtlAwc5F4CjmtrUierdy3EVVKS0NFnz 9L3PxiJcOxl1VVtSBX+XAOPa0xkS3cpEbFVOym4NaKsoLgcqKKBjjBu4 dhWoXoxXk7PE5fogo9/BM0heGI4XpnixUSTbucMw4bcnNYPY0qKUBs2o alt1CvrGz78oOO10//pXpw/ml89UwWo28/FDvxeuXS7soeImDRklTLlE xV/Q3//v7o73ZosAdSR+9xFdcZtVs43Jjo3Cy8WL1Zjz6BdRd59Fyu6h WghEKg==
bkjf-inc.com. 0 IN TYPE65534 \# 5 08D28D0001
bkjf-inc.com. 0 IN TYPE65534 \# 5 089F370001
bkjf-inc.com. 600 IN DNSKEY 256 3 8 AwEAAflXAWLXAVJUEj29iidwVvZALuQr03hLn1bEl81XDtD63H7wwHS9 i9fNDYL0q0FkRDkuzXEQpb3UUleu/RYtSd9w6Ads0RWNUyB6X1E4Djmv sPwFwvo570svZSVky2rjEHnySgVI2ywqhcRYLMKjxE6pXuzXrqecQcF2 qrMq2xmJ
bkjf-inc.com. 600 IN DNSKEY 257 3 8 AwEAAbxFYlbq+R8y/hGg/xL8xDBasZGYtgPOqVd3bP68p98YHsFwHyG8 u3svatzRoq8STNjKKZEluDC2bcUIn9/mRHyorTYPtwyePxPEgVE4yhBy 9xqD4ES+ty7kuHOUz/WEHdNdYRhYyHe+SGf4dHnmU49pHIBCE8xFX6fs t270webjuXs4Pt6qRlyoFC3XmpRDiMNVwtM+doUxo/MRK4mw5zTeHyyf dFLVOvE3mW/ZKgBfnrsj0zE71bnD5nTxJIjDv1bUppbiRy5RK40jPhHu zaa3quxg1yS/BceYcjJpZJUc3LS55HGzatfuK799KvukuDKf7u71ylW+ 5ynT7Sxhbt0=
bkjf-inc.com. 600 IN NS ns1.bkjf-inc.com.
bkjf-inc.com. 600 IN NS ns2.bkjf-inc.com.
eshop.bkjf-inc.com. 86400 IN RRSIG NSEC 8 3 86400 20190330063503 20190228053503 53901 bkjf-inc.com. dHM2PhYs7BVuhD//iGhcwPZGZmHDkBCfWKju6ZZlvSx3I+QmWWvVdKCj 8YCw2AkWhgARxFfRMzhxRwDjgEgHhxUr4UGPH9+kJpvGi+UpFBVoBvPw iL43qCn/4J2f6URuAY8Dcq0DFpR0QLVJgIXBZpyhUYu5hZNWI2tzfyhO GlM=
eshop.bkjf-inc.com. 86400 IN NSEC ns1.bkjf-inc.com. CNAME RRSIG NSEC
eshop.bkjf-inc.com. 60 IN RRSIG CNAME 8 3 60 20190330063503 20190228053503 53901 bkjf-inc.com. 9ONt81AjpHFrM8YwDm7pQAg62oDBgaNzdtDIqtBHt5h/BPl83fOP/dOp P0Xi+y/OsFjDzHBSBDU4sy3fJwHBqm8uuMc6m33pIZfTq15fxFXF+2hU ift1bc0b0dk/L7ANZ5haEsDcl+hSVjwru2o2ISJtvp5zySZ61pdMvA6y ktg=
eshop.bkjf-inc.com. 60 IN CNAME www.bkjf-inc.com.
ns1.bkjf-inc.com. 60 IN RRSIG A 8 3 60 20190330063017 20190228053309 53901 bkjf-inc.com. 9MUZhsTxlmn5B6QXg/iCQoFyilRh8H4OJcTgpu1KgSyMTiBoEwJGdhIx k2XimlJZr9/MrSeRbuLwMZOnwFJ7w9fcIunrYHiE1T71y0BcLnQOKaJf SkJI5VKUam80+J6unkscCj0i/Y1kXTjXWLODKsZzw4+zLz5cGJk6hvsn XP4=
ns1.bkjf-inc.com. 86400 IN RRSIG NSEC 8 3 86400 20190330063017 20190228053309 53901 bkjf-inc.com. EFeX2LsEd/flN2/5lCgKlSTtC93WH0LDw9GW1RAlLIfxFAptPsXkmy7y B0Blt7tOuaxA/cTNbnFZBnyo8G3YW90LnYagqeuNzl+90gjUxsbbhE4f pTkQkRXRsvcagYDKQjs9nkN1SAF13SagnupR8D2crHADICjy8RHjHtgA byM=
ns1.bkjf-inc.com. 86400 IN NSEC ns2.bkjf-inc.com. A RRSIG NSEC
ns1.bkjf-inc.com. 60 IN A 192.144.198.128
ns2.bkjf-inc.com. 60 IN RRSIG A 8 3 60 20190330063017 20190228053309 53901 bkjf-inc.com. N2ssp0Eh6SyHBYHskedxUpfIp29DETt2g74sCuhrXwMuwLjOdVwuB02i /LqzDLyDbVZnMZncqoQ367AV2b/ttU/FJZcHiAlI2tLRTxVuNyj/E2YN BIDAtIqueNdJzsyE7n1yz9sPcsTrOidrIqqbM3qom5tMQvdo+2jrnhR3 UoY=
ns2.bkjf-inc.com. 86400 IN RRSIG NSEC 8 3 86400 20190330063017 20190228053309 53901 bkjf-inc.com. sTTRnUQxPBbeAG0WrQpn4iK/U62D2s8umLwx8w8bx+bwxQdhR8Yyz8Ke tSelkffgctCtyUi5i7ibSTnvUJTcvOcvWWteMOQfQqXJmAngADx87cba /M+OJqRwp8tu3PEniPpTYN3msGSEFILyxLCO/2cyBzK+8jhFFKYyMOn/ ViQ=
ns2.bkjf-inc.com. 86400 IN NSEC www.bkjf-inc.com. A RRSIG NSEC
ns2.bkjf-inc.com. 60 IN A 192.144.198.128
www.bkjf-inc.com. 60 IN RRSIG A 8 3 60 20190330063017 20190228053309 53901 bkjf-inc.com. aKI5N4y6eqN/xunC7+4vYa3cSHyXcW533iGA6/q34/ahvq0sTgYN36aF oBO0t8fRvwS3chZaPxwuqbk6hGSW+tRhJ8x/Nnwtbcn004W0ZxI1k046 JW/ePLhq1Cw2GPHXJTsfCjYmAOcwssX2yUv6q9/vocXx/mipuTMljrId yhE=
www.bkjf-inc.com. 86400 IN RRSIG NSEC 8 3 86400 20190330063017 20190228053309 53901 bkjf-inc.com. 0q3C+xMKE1p586q+p8U4AHGiNjzzI899TcmL2P4x8x1B7rkc22rsakX9 AnNFAzkPOTVLr81GQtBraI1K6El2QDKcPkE9+0e+34tirpuUzVlzjYB2 f4WHGxTscdOMpCestqnmspQpmXm37+EBWS0alBBq3Db8T+F/3CSEGRS7 Ao0=
www.bkjf-inc.com. 86400 IN NSEC bkjf-inc.com. A RRSIG NSEC
www.bkjf-inc.com. 60 IN A 192.144.198.128
bkjf-inc.com. 600 IN SOA ns1.bkjf-inc.com. 87527941.qq.com. 2018121608 10800 900 604800 86400
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Feb 28 15:22:46 CST 2019
;; XFR size: 31 records (messages 1, bytes 3433)

这里看到了每个记录都附带了一个RRSIG记录,说明已经进行了数字签名

检查本地解析

1
2
3
[root@VM_0_13_centos named]# dig -t A www.bkjf-inc.com @localhost +dnssec +short
192.144.198.128
A 8 3 60 20190330063017 20190228053309 53901 bkjf-inc.com. aKI5N4y6eqN/xunC7+4vYa3cSHyXcW533iGA6/q34/ahvq0sTgYN36aF oBO0t8fRvwS3chZaPxwuqbk6hGSW+tRhJ8x/Nnwtbcn004W0ZxI1k046 JW/ePLhq1Cw2GPHXJTsfCjYmAOcwssX2yUv6q9/vocXx/mipuTMljrId yhE=

DS记录

在生成证书的目录对ZSK执行dnssec-dsfromkey命令,得到bkjf-inc.com的DS记录,这里我们使用比较长的那个

/var/named/chroot/var/named/dnssec-key/bkjf-inc.com
1
2
3
[root@VM_0_13_centos bkjf-inc.com]#  dnssec-dsfromkey `grep -l zone-signing *key`
bkjf-inc.com. IN DS 53901 8 1 5E13F6C0ECEE84248C2543693CE7D8617920983B
bkjf-inc.com. IN DS 53901 8 2 3006068B784AFBBC67133F123A0C389514959FCB6CAB0032DB200F08E6E5C384

其中:

  • 53901:关键标签,用于标识域名的DNSSEC记录,一个小于65535的整数值
  • 8:生成签名的加密算法,8对应RSA/SHA-256
  • 2:构建摘要的加密算法,2对应SHA-256
  • 最后一段:摘要值,就是DS记录值

参考万网(阿里云)上关于dnssec配置的文档:参考文档

DS记录需要通过运营商提交到上级DNS的信任锚中,这里是通过万网的配置页面,提交到.com域

注意:要在阿里云上将该域名的dns服务器指向自定义DNS服务器:参考文档

后续维护

dnssec需要定期轮转,所以需要经常变更签名,其中

  • ZSK轮转

    建议每年轮转

  • KSK轮转

    建议更新ssl证书后尽快轮转?

轮转方法:

  • ZSK(zone-signing key)

    /var/named/chroot/var/named/dnssec-key/bkjf-inc.com
    1
    2
    3
    4
    5
    $ cd /var/named/chroot/var/named/dnssec-key/bkjf-inc.com
    $ dnssec-settime -I yyyy0101 -D yyyy0201 Kbkjf-inc.com.+008+53901
    $ dnssec-keygen -S Kbkjf-inc.com.+008+53901
    $ chgrp bind *
    $ chmod g+r *.private
  • KSK轮转(key-signing key)

    /var/named/chroot/var/named/dnssec-key/bkjf-inc.com
    1
    2
    3
    4
    5
    $ cd /var/named/chroot/var/named/dnssec-key/bkjf-inc.com
    $ dnssec-settime -I yyyy0101 -D yyyy0201 Kbkjf-inc.com.+008+40759
    $ dnssec-keygen -S Kbkjf-inc.com.+008+40759
    $ chgrp bind *
    $ chmod g+r *.private

注意:KSK轮转需要同步在万网上更新DS记录

在任意客户端验证解析

1
2
3
4
5
6
7
#dig -t A www.bkjf-inc.com @8.8.8.8 +dnssec +short
192.144.198.128
A 8 3 60 20190330063017 20190228053309 53901 bkjf-inc.com. aKI5N4y6eqN/xunC7+4vYa3cSHyXcW533iGA6/q34/ahvq0sTgYN36aF oBO0t8fRvwS3chZaPxwuqbk6hGSW+tRhJ8x/Nnwtbcn004W0ZxI1k046 JW/ePLhq1Cw2GPHXJTsfCjYmAOcwssX2yUv6q9/vocXx/mipuTMljrId yhE=

#dig CNAME eshop.bkjf-inc.com @8.8.8.8 +dnssec +short
www.bkjf-inc.com.
CNAME 8 3 60 20190330063503 20190228053503 53901 bkjf-inc.com. 9ONt81AjpHFrM8YwDm7pQAg62oDBgaNzdtDIqtBHt5h/BPl83fOP/dOp P0Xi+y/OsFjDzHBSBDU4sy3fJwHBqm8uuMc6m33pIZfTq15fxFXF+2hU ift1bc0b0dk/L7ANZ5haEsDcl+hSVjwru2o2ISJtvp5zySZ61pdMvA6y ktg=

在第三方网站验证

https://en.internet.nl/site/www.bkjf-inc.com/473349/

浏览器插件

https://www.dnssec-validator.cz/

参考文献

实验文档8:企业级Web DNS实战

发表于 2018-12-16 | 更新于 2020-09-03 | 分类于 Web DNS技术
本文字数: 24k | 阅读时长 ≈ 21 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


系统环境

1
2
3
4
5
#cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

#uname -a
Linux node 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

安装部署namedmanager

准备rpm包

https://repos.jethrocarr.com/pub/jethrocarr/linux/centos/7/jethrocarr-custom/x86_64/

下载最新版

1
2
3
4
[root@hdss7-11 opt]# ll
total 62244
-rw-r--r-- 1 root root 102136 Feb 1 18:17 namedmanager-bind-1.9.0-2.el7.centos.noarch.rpm
-rw-r--r-- 1 root root 1084340 Feb 1 18:17 namedmanager-www-1.9.0-2.el7.centos.noarch.rpm

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@hdss7-11 opt]# yum localinstall namedmanager-* -y
...
Installed:
namedmanager-bind.noarch 0:1.9.0-2.el7.centos namedmanager-www.noarch 0:1.9.0-2.el7.centos

Dependency Installed:
apr.x86_64 0:1.4.8-3.el7_4.1 apr-util.x86_64 0:1.5.2-6.el7 bind.x86_64 32:9.9.4-73.el7_6
httpd.x86_64 0:2.4.6-88.el7.centos httpd-tools.x86_64 0:2.4.6-88.el7.centos libzip.x86_64 0:0.10.1-8.el7
mailcap.noarch 0:2.1.41-2.el7 mariadb.x86_64 1:5.5.60-1.el7_5 mariadb-libs.x86_64 1:5.5.60-1.el7_5
mariadb-server.x86_64 1:5.5.60-1.el7_5 mod_ssl.x86_64 1:2.4.6-88.el7.centos perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7
perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7 perl-DBD-MySQL.x86_64 0:4.023-6.el7 perl-DBI.x86_64 0:1.627-4.el7
perl-IO-Compress.noarch 0:2.061-2.el7 perl-Net-Daemon.noarch 0:0.48-5.el7 perl-PlRPC.noarch 0:0.2020-14.el7
php.x86_64 0:5.4.16-46.el7 php-cli.x86_64 0:5.4.16-46.el7 php-common.x86_64 0:5.4.16-46.el7
php-intl.x86_64 0:5.4.16-46.el7 php-ldap.x86_64 0:5.4.16-46.el7 php-mysqlnd.x86_64 0:5.4.16-46.el7
php-pdo.x86_64 0:5.4.16-46.el7 php-process.x86_64 0:5.4.16-46.el7 php-soap.x86_64 0:5.4.16-46.el7
php-xml.x86_64 0:5.4.16-46.el7

Dependency Updated:
bind-libs.x86_64 32:9.9.4-73.el7_6 bind-libs-lite.x86_64 32:9.9.4-73.el7_6 bind-license.noarch 32:9.9.4-73.el7_6 bind-utils.x86_64 32:9.9.4-73.el7_6

Complete!

先配mysql

启动mysql

1
[root@hdss7-11 mysql]# systemctl start mariadb.service

开机自启动

1
2
[root@hdss7-11 ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

配mysql的root密码

1
[root@hdss7-11 mysql]# mysqladmin -uroot password 123456

导入namedmanager的数据库脚本

/usr/share/namedmanager/resources/autoinstall.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@hdss7-11 ~]# cd /usr/share/namedmanager/resources/
[root@hdss7-11 resources]# ./autoinstall.pl
autoinstall.pl

This script setups the NamedManager database components:
* NamedManager MySQL user
* NamedManager database
* NamedManager configuration files

THIS SCRIPT ONLY NEEDS TO BE RUN FOR THE VERY FIRST INSTALL OF NAMEDMANAGER.
DO NOT RUN FOR ANY OTHER REASON

Please enter MySQL root password (if any): 123456

输入123456

Searching ../sql/ for latest install schema...
../sql//version_20131222_install.sql is the latest file and will be used for the install.
Importing file ../sql//version_20131222_install.sql
Creating user...
Updating configuration file...
DB installation complete!

You can now login with the default username/password of setup/setup123 at http://localhost/namedmanager

配置namedmanager

config.php,增加一条配置

/etc/namedmanager/config.php
1
$_SERVER['HTTPS'] = "TRUE";

config-bind.php,修改以下三条配置

/etc/namedmanager/config-bind.php
1
2
3
4
$config["api_url"]              = "http://dns-manager.od.com/namedmanager";     // Application Install Location
$config["api_server_name"] = "dns-manager.od.com"; // Name of the DNS server (important: part of the authentication process)
$config["api_auth_key"] = "verycloud"; // API authentication key
$config["log_file"] = "/var/log/namedmanager_bind_configwriter";

php.ini,修改一条配置

/etc/php.ini
1
2
; How many GET/POST/COOKIE input variables may be accepted
max_input_vars = 10000

绑host(临时)

/etc/hosts
1
10.4.7.11   dns-manager.od.com

配apache

/etc/httpd/conf/httpd.conf
1
2
3
4
5
6
7
Listen 10.4.7.11:8080
ServerName dns-manager.od.com
<Directory />
AllowOverride none
allow from all
#Require all denied
</Directory>

配nginx

/etc/nginx/conf.d/dns-manager.od.com.conf
1
2
3
4
5
6
7
8
9
10
11
12
server {
server_name dns-manager.od.com;

location =/ {
rewrite ^/(.*) http://dns-manager.od.com/namedmanager permanent;
}
location / {
proxy_pass http://10.4.7.11:8080;
proxy_set_header Host $http_host;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}
}

启动apache和nginx

  • 启动apache

    1
    2
    3
    [root@hdss7-11 ~]# systemctl start httpd
    [root@hdss7-11 ~]# systemctl enable httpd
    Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
  • 启动nginx

    1
    2
    3
    4
    [root@hdss7-11 ~]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@hdss7-11 ~]# nginx

访问http://dns-manager.od.com,看看页面是否正常

继续改namedmanager的配置

改namedmanager_bind_configwriter.php

/usr/share/namedmanager/bind/namedmanager_bind_configwriter.php
1
2
3
4
if (flock($fh_lock, LOCK_EX ))
{
log_write("debug", "script", "Obtained filelock");
}

启动namedmanager_logpush.rcsysinit

加执行权限

/usr/share/namedmanager/resources/namedmanager_logpush.rcsysinit
1
[root@hdss7-11 resources]# chmod u+x namedmanager_logpush.rcsysinit

启动该脚本

/usr/share/namedmanager/resources/namedmanager_logpush.rcsysinit
1
2
3
[root@hdss7-11 resources]# sh namedmanager_logpush.rcsysinit start
Starting namedmanager_logpush service:
[root@hdss7-11 resources]# nohup: redirecting stderr to stdout

检查是否启动

1
2
[root@hdss7-11 resources]# ps -ef|grep php|egrep -v grep
root 10738 1 0 10:49 pts/1 00:00:00 php -q /usr/share/namedmanager/bind/namedmanager_logpush.php

用supervisor管理起来

这个脚本非常重要,是整个namedmanager软件的核心,所以要保证它一直在后台启动,这里我们用supervisor这个软件把它管理起来

先安装supervisor软件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@hdss7-11 resources]# yum install supervisor -y
ependencies Resolved

=============================================================================================================================================================
Package Arch Version Repository Size
=============================================================================================================================================================
Installing:
supervisor noarch 3.1.4-1.el7 epel 446 k
Installing for dependencies:
python-meld3 x86_64 0.6.10-1.el7 epel 73 k
python-setuptools noarch 0.9.8-7.el7 base 397 k

Transaction Summary
=============================================================================================================================================================
Install 1 Package (+2 Dependent packages)

Total download size: 916 k
Installed size: 4.4 M
...
Installed:
supervisor.noarch 0:3.1.4-1.el7

Dependency Installed:
python-meld3.x86_64 0:0.6.10-1.el7 python-setuptools.noarch 0:0.9.8-7.el7

Complete!
创建脚本启动的配置文件
/etc/supervisord.d/namedmanager_logpush.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[program:namedmanager_logpush]
command=php -q /usr/share/namedmanager/bind/namedmanager_logpush.php 2>&1 > /var/log/namedmanager_logpush
numprocs=1
directory=/usr/share/namedmanager/resources
autostart=true
autorestart=true
startsecs=22
startretries=4
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=false
stdout_logfile=/var/log/namedmanager_logpush.out
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
stderr_logfile=/var/log/namedmanager_logpush.err
stderr_logfile_maxbytes=64MB
stderr_logfile_backups=4
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
启动supservisord服务
1
[root@hdss7-11 resources]# systemctl start supervisord
开机自启
1
2
[root@hdss7-11 resources]# systemctl enable supervisord
Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.

查看脚本启动情况

1
2
3
4
[root@hdss7-11 resources]# supervisorctl status
namedmanager_logpush RUNNING pid 9194, uptime 0:01:44
[root@hdss7-11 resources]# ps -ef|grep -v grep|grep php
root 9194 8979 0 11:14 ? 00:00:00 php -q /usr/share/namedmanager/bind/namedmanager_logpush.php 2>&1 > /var/log/namedmanager_logpush

这样脚本就可以保证高可用性了

检查日志

/var/log/namedmanager_logpush
1
2
[root@hdss7-11 resources]# tail -fn 200 /var/log/namedmanager_logpush
Error: Unable to authenticate with NamedManager API - check that auth API key and server name are valid

有报错,所以需要继续配置

改inc_soap_api.php

/usr/share/namedmanager/bind/include/application/inc_soap_api.php
1
preg_match("/^http:\/\/(\S*?)[:0-9]*\//", $GLOBALS["config"]["api_url"], $matches);

重启namedmanager_logpush.rcsysinit

如果已经用supervisor软件管理起来了,只需要kill掉脚本进程即可

1
2
3
4
5
[root@hdss7-11 resources]# ps -ef|grep -v grep|grep php|awk '{print $2}'|xargs kill -9
[root@hdss7-11 resources]# ps -ef|grep -v grep|grep php
root 9295 8979 1 11:18 ? 00:00:00 php -q /usr/share/namedmanager/bind/namedmanager_logpush.php 2>&1 > /var/log/namedmanager_logpush
[root@hdss7-11 resources]# supervisorctl
namedmanager_logpush RUNNING pid 9295, uptime 0:00:23

否则需要手动重启脚本

/usr/share/namedmanager/resources/namedmanager_logpush.rcsysinit
1
2
3
4
[root@hdss7-11 resources]# sh namedmanager_logpush.rcsysinit restart
Stopping namedmanager_logpush services:
Starting namedmanager_logpush service:
nohup: redirecting stderr to stdout

配置BIND9

先配rndc

rndc.key

1
2
3
4
5
[root@hdss7-11 ~]# cat /etc/rndc.key 
key "rndc-key" {
algorithm hmac-sha256;
secret "CD/4vqb9l0WiMy5TXjfeu1cMhyRerQ9kL2jwdBFWwa4=";
};

如果没有,使用如下命令生成rndc.key

1
[root@hdss7-11 ~]# rndc-confgen -r /dev/urandom

配rndc.conf

/etc/rndc.conf
1
2
3
4
5
6
7
8
9
10
key "rndc-key" {
algorithm hmac-sha256;
secret "CD/4vqb9l0WiMy5TXjfeu1cMhyRerQ9kL2jwdBFWwa4=";
};

options {
default-key "rndc-key";
default-server 10.4.7.11;
default-port 953;
};

删除rndc.key

1
[root@hdss7-11 ~]# rm -f /etc/rndc.key

BIND9主配置文件

/etc/named.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
options {
listen-on port 53 { 10.4.7.11; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
allow-transfer { 10.4.7.12; };
also-notify { 10.4.7.12; };

/*
- 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 no;
dnssec-validation no;


/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

key "rndc-key" {
algorithm hmac-sha256;
secret "CD/4vqb9l0WiMy5TXjfeu1cMhyRerQ9kL2jwdBFWwa4=";
};

controls {
inet 10.4.7.11 port 953
allow { 10.4.7.11; } keys { "rndc-key"; };
};

logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};

zone "." IN {
type hint;
file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
include "/etc/named.namedmanager.conf";

改named.namedmanager.conf文件属性

/etc/named.namedmanager.conf
1
2
3
[root@hdss7-11 named]# chown apache.apache /etc/named.namedmanager.conf
[root@hdss7-11 named]# ls -l /etc/named.namedmanager.conf
-rw-r--r-- 1 apache named 112 Dec 16 11:19 /etc/named.namedmanager.conf

检查配置并启动BIND9

检查配置

1
[root@hdss7-11 ~]# named-checkconf

启动BIND9

1
[root@hdss7-11 ~]# systemctl start named

开机自启动

1
[root@hdss7-11 ~]# systemctl enable named

检查启动情况

1
2
3
4
[root@hdss7-11 ~]# netstat -luntp|grep 53
tcp 0 0 10.4.7.11:53 0.0.0.0:* LISTEN 10922/named
tcp 0 0 10.4.7.11:953 0.0.0.0:* LISTEN 10922/named
udp 0 0 10.4.7.11:53 0.0.0.0:* 10922/named

配置NamedManager页面

浏览器打开http://dns-manager.od.com(提前绑好host),用户名/密码:setup/setup123

配置Configuration选项卡

Zone Configuration Defaults

  • DEFAULT_HOSTMASTER

    87527941@qq.com

  • DEFAULT_TTL_SOA

    86400

  • DEFAULT_TTL_NS

    120

  • DEFAULT_TTL_MX

    60

  • DEFAULT_TTL_OTHER

    60

API Configuration

  • ADMIN_API_KEY

    verycloud

Date and Time Configuration

  • DATEFORMAT

    yyyy-mm-dd

  • TIMEZONE_DEFAULT

    Asia/Shanghai

Save Changes

配置New Servers选项卡

Add NewServer

Server Details

  • Name Server FQDN *

    dns-manager.od.com
    注意:这里一定要填config-bind.php里对应$config["api_server_name"]项配置的值

  • Description

    dns server for od.com

    Server Type

  • Server Type

    API (supports Bind)

  • API Authentication Key *

    verycloud

    Server Domain Settings

    必须勾选以下三项
  • Nameserver Group *

    default – Default Nameserver Group

  • Primary Nameserver *

    Make this server the primary one used for DNS SOA records.

  • Use as NS Record *

    Adds this name server to all domains as a public NS record.

Save Changes

保存后View Name Servers选项卡下,Logging Status应变绿且成为status_synced,如一直不变绿,需要进行排错,不要继续往下做了。

配置Domain/Zones选项卡

添加Domain/Zone

两种方式

  • 手动添加域
  • 自动导入域

Add Domain(手动添加)

Domain Details
  • Domain Type *

    Standard Domain
    Reverse Domain (IPv4)
    Reverse Domain (IPv6)
    根据实际情况选择,这里选择Standard Domain(正解域)

  • Domain Name *

    od.com

  • Description

    od.com domain

Domain Server Groups

注意:一定要勾选域服务器组

default – Default Nameserver Group

Start of Authority Record
  • Email Administrator Address *

    Email Administrator Address *

  • Domain Serial *

    2018121601

  • Refresh Timer *

    21600

  • Refresh Retry Timeout *

    3600

  • Expiry Timer *

    604800

  • Default Record TTL *

    60
    注意:这里配置SOA记录最后一个参数值没有按套路出牌,配置的并不是否定应答超时时间(NegativeAnswerTTL),而是默认资源记录的过期时间

Save Changes

Import Domain(自动导入)

  • Import Source

    Bind 8/9 Compatible Zonefile

  • Zone File

    选择文件host.com.txt

导入一个正解域
upload,选择文件

附1:host.com.txt

host.com.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
$ORIGIN .
$TTL 600 ; 10 minutes
host.com IN SOA dns-manager.od.com. 87527941.qq.com. (
2019013106 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
$ORIGIN host.com.
$TTL 60 ; 1 minute
HDSS7-11 A 10.4.7.11
HDSS7-12 A 10.4.7.12

注意:这里可以不用给NS记录和对应的A记录了,会默认生成

Save Changes

点保存进入下一个配置页面

Domain Details

这里可以配置域的信息和描述,我们这里先配一个Standard Domain(正解域)

Start of Authority Record

这里注意SOA记录的最后一个选项Default Record TTL *

Domain Records

检查一下和导入文件里的记录是否一致

Save Changes

先点一次保存

Domain Details

检查一遍域信息和描述

Domain Server Groups

注意:这里一定要勾选服务器组(上个页面没有,这里新出来的选项)

Start of Authority Record

检查一遍SOA记录

Save Changes

最后点一下保存,导入成功

导入一个反解域
upload,选择文件

附2:7.4.10.in-addr.arpa.txt

7.4.10.in-addr.arpa.txt
1
2
3
4
5
6
7
8
9
10
11
12
$TTL 600	; 10 minutes
@ IN SOA dns-manager.od.com. 87527941.qq.com. (
2018121603 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
$ORIGIN 7.4.10.in-addr.arpa.
$TTL 60 ; 1 minute
11 PTR HDSS7-11.host.com.
12 PTR HDSS7-12.host.com.

注意:这里可以不用给NS记录和对应的A记录了,会默认生成

Save Changes

点保存进入下一个配置页面

Domain Details

注意:

  • Domain Type *应为Reverse Domain (IPv4)
  • IPv4 Network Address *应为10.4.7.0/24
Start of Authority Record

配置SOA记录

Domain Records

检查一下和导入文件里的记录是否一致

Save Changes

先点一次保存

Domain Details

检查一遍域信息和描述

Domain Server Groups

注意:这里一定要勾选服务器组(上个页面没有,这里新出来的选项)

Start of Authority Record

检查一遍SOA记录

Save Changes

最后点一下保存,导入成功

在对应的Zone里操作资源记录(增、删、改)

View Domains选项卡

details 按钮

维护domain的基本配置,略

delete 按钮

删除domain,略

domain record(od.com)
配置页面
  • Domain Details

    Domain od.com selected for adjustment

  • Nameserver Configuration

    这里是配置NS记录的配置区,默认会生成一条

Type TTL Name/Origin Content -
NS 120 od.com dns-manager.od.com -
  • Mailserver Configuration

    略,暂不配置MX记录

  • Host Records Configuration

    这里是配置重点,A记录、CNAME记录、TXT记录等都在这个里配置
    这里增加两条A记录解析,增加一条CNAME解析

Type TTL Name Content ReversePTR -
A 60 dns-manager 10.4.7.11 no delete
A 60 www 10.4.7.11 no delete
CNAME 60 eshop www.od.com no delete
Save Changes
domain record(host.com)
配置页面
  • Domain Details

    Domain host.com selected for adjustment

  • Nameserver Configuration

    这里是配置NS记录的配置区,默认会生成一条

Type TTL Name/Origin Content -
NS 120 host.com dns-manager.od.com -
  • Mailserver Configuration

    略,暂不配置MX记录

  • Host Records Configuration

    这里是配置重点,A记录、CNAME记录、TXT记录等都在这个里配置
    因为是从文件导入的域,默认会有记录

Type TTL Name Content ReversePTR -
A 60 HDSS7-11 10.4.7.11 √ delete
A 60 HDSS7-12 10.4.7.12 √ delete
Save Changes
domain record(7.4.10.in-addr.arpa)
配置页面
  • Domain Details

    Domain 7.4.10.in-addr.arpa selected for adjustment

  • Nameserver Configuration

    这里是配置NS记录的配置区,默认会生成一条

Type TTL Name/Origin Content -
NS 120 7.4.10.in-addr.arpa dns-manager.od.com -
  • Mailserver Configuration

    略,暂不配置MX记录

  • Host Records Configuration

    这里是配置重点,A记录、CNAME记录、TXT记录等都在这个里配置
    因为是从文件导入的域,默认会有记录

Type TTL Name Content -
PTR 60 11 HDSS7-11.host.com delete
PTR 60 12 HDSS7-12.host.com delete
Save Changes

返回Name Servers选项卡

查看页面DNS服务器状态

  • Logging Status
    status_synced
  • Zonefile Status
    status_synced

全部变绿且为status_synced即为正常

查看服务器上配置文件(都是由namedmanager服务自动生成的)

named.namedmanager.conf

/etc/named.namedmanager.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//
// NamedManager Configuration
//
// This file is automatically generated any manual changes will be lost.
//
zone "od.com" IN {
type master;
file "od.com.zone";
allow-update { none; };
};
zone "host.com" IN {
type master;
file "host.com.zone";
allow-update { none; };
};
zone "7.4.10.in-addr.arpa" IN {
type master;
file "7.4.10.in-addr.arpa.zone";
allow-update { none; };
};

这里生成了三个zone,两个正解域,一个反解域,依次检查三个域的区域数据库文件:

od.com.zone

/var/named/od.com.zone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ORIGIN od.com.
$TTL 60
@ IN SOA dns-manager.od.com. 87527941.qq.com. (
2018121610 ; serial
21600 ; refresh
3600 ; retry
604800 ; expiry
60 ; minimum ttl
)

; Nameservers

od.com. 120 IN NS dns-manager.od.com.

; Mailservers


; Reverse DNS Records (PTR)


; CNAME


; HOST RECORDS

dns-manager 60 IN A 10.4.7.11
www 60 IN A 10.4.7.11
eshop 60 IN CNAME www.od.com.

host.com.zone

/var/named/host.com.zone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ORIGIN host.com.
$TTL 60
@ IN SOA dns-manager.od.com. 87527941.qq.com. (
2018121604 ; serial
10800 ; refresh
900 ; retry
604800 ; expiry
60 ; minimum ttl
)

; Nameservers

host.com. 120 IN NS dns-manager.od.com.

; Mailservers


; Reverse DNS Records (PTR)


; CNAME


; HOST RECORDS

HDSS7-11 60 IN A 10.4.7.11
HDSS7-12 60 IN A 10.4.7.12

7.4.10.in-addr.arpa.zone

/var/named/7.4.10.in-addr.arpa.zone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ORIGIN 7.4.10.in-addr.arpa.
$TTL 60
@ IN SOA dns-manager.od.com. 87527941.qq.com. (
2018121603 ; serial
10800 ; refresh
900 ; retry
604800 ; expiry
60 ; minimum ttl
)

; Nameservers

7.4.10.in-addr.arpa. 120 IN NS dns-manager.od.com.

; Mailservers


; Reverse DNS Records (PTR)

11 60 IN PTR HDSS7-11.host.com.
12 60 IN PTR HDSS7-12.host.com.

; CNAME


; HOST RECORDS

检查资源记录解析是否生效

1
2
3
4
5
6
7
8
# dig -t A www.od.com @10.4.7.11 +short
10.4.7.11

#dig -t A HDSS7-12.host.com @10.4.7.11 +short
10.4.7.12

#dig -x 10.4.7.11 @10.4.7.11 +short
HDSS7-11.host.com.

验证页面增、删、改是否均生效

注意:

  • 增、删、改资源记录时,对应域的SOA记录的serial序列号会自动滚动,非常方便
  • 这里在页面上操作资源记录,会先写mysql,再由php脚本定期刷到磁盘文件上,所以大概需要1分钟的时间生效
  • 在维护主机域时,添加正解记录,并勾选后面的reverse选项,将同时生成一条反解记录,简化了操作
  • 由于服务器上的区域数据库文件是由php进程定期更新的(根据mysql数据库里的数据),所以手动在服务器上修改资源记录是无法生效的,应该严格禁止

配置DNS主辅同步

略

配置客户端的DNS服务器

/etc/resolv.conf
1
2
3
4
# Generated by NetworkManager
search od.com host.com
nameserver 10.4.7.11
nameserver 10.4.7.12

把所有客户端绑定的临时hosts删除

/etc/hosts
1
#10.4.7.11   dns-manager.od.com

配置客户端DNS服务器的小技巧

用户系统及操作审计功能

用户系统

可以创建不同的管理员用户

User Management选项卡

该页面下可以查看所有的系统用户,并可以进行用户管理

Create a new User Account 增加用户

User Details

  • Username *

    wangdao

  • Real Name *

    StanleyWang

  • Contact Email *

    stanley.wang.m@qq.com

User Password

  • password *

    123456

  • password_confirm *

    123456

Save Changes

User Permissions 用户权限

  • disabled

    勾上,用户不生效
    不勾,用户生效
    这里不勾

  • admin(超级管理员)

    勾上,可以创建用户管理用户权限
    不勾,不可以创建用户管理用户权限
    这里不勾

  • namedadmins(管理员)

    勾上,dns管理员,可以管理zone和资源记录
    不勾,不可以管理zone和资源记录
    这里勾选

Save Changes

delete

删除用户,略

details

这里可以配置用户的基本信息

User Password

超级管理员可以帮助用户修改密码

User Options

  • option_shrink_tableoptions

    Automatically hide the options table when using defaults
    默认勾选,高级查询框显示与否

  • option_debug

    Enable debug logging - this will impact performance a bit but will show a full trail of all functions and SQL queries made
    默认不勾,勾选上可以在页面显示debug日志,建议部署时使用,投产后关闭

  • option_concurrent_logins

    Permit this user to make multiple simultaneous logins
    默认不勾,允许该用户在多点同时登录,应该严格禁止(审计)

使用wangdao用户登录

可以进行DNS服务管理,但无法管理用户

审计

使用wangdao用户在页面增加一条资源记录

操作过程略

Changelog选项卡

可以看到所有用户的操作记录,实现审计功能,做到操作可溯

Tips

  • 生产上强烈建议新生成一个超级管理员用户并将setup用户删除!
  • 超级管理员用户应只有一个且不要轻易外泄,可以创建多个管理员账户。(一般根据业务而定,每个管理员负责一个子域)
  • 管理员账户创建好后,应由各人自行登录修改密码。
  • 超级管理员用户密码的复杂度要足够高,定期更换超级管理员用户密码。

Markdown语法范例

发表于 2018-01-11 | 更新于 2020-09-03 | 分类于 Linux基础
本文字数: 14k | 阅读时长 ≈ 13 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


分级标题

  • 效果
  • 代码

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题
1
2
3
4
5
6
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

字体

样式

  • 效果
  • 代码

斜体
粗体
加粗斜体
删除线

1
2
3
4
\*斜体\*
\*\*粗体\*\*
\*\*\*加粗斜体\*\*\*
\~\~删除线\~\~

颜色、字号

  • 效果
  • 代码

颜色
字号

1
2
<font color="FF7F50">颜色</font>
<font size="20">字号</font>

列表

有序列表

有序列表则使用数字接着一个英文句点。

  • 效果
  • 代码
  1. 有序列表项 一
  2. 有序列表项 二
  3. 有序列表项 三
1
2
3
1. 有序列表项 一
2. 有序列表项 二
3. 有序列表项 三

在特殊情况下,项目列表很可能会不小心产生,像是下面这样的写法:

1
1986. What a great season.

会显示成:

  1. What a great season.

前面的1986成了序号,换句话说,也就是在行首出现了数字-句点-空白,要避免这样的状况,你可以在句点前面加上反斜杠:

1
1986\. What a great season.

则会正确的显示为:

1986. What a great season.

无序列表

使用 *,+,-表示无序列表。

  • 效果
  • 代码
  • 无序列表项 一
  • 无序列表项 二
  • 无序列表项 三
1
2
3
- 无序列表项 一
- 无序列表项 二
- 无序列表项 三

定义型列表

定义型列表由名词和解释组成。一行写上定义,紧跟一行写上解释。解释的写法“:”紧跟一个缩进(Tab)

  • 效果
  • 代码
Markdown
: 轻量级文本标记语言,可以转换成html,pdf等格式(左侧有一个可见的冒号和四个不可见的空格)
代码块 2
这是代码块的定义(左侧有一个可见的冒号和四个不可见的空格)
1
2
3
4
Markdown
: 轻量级文本标记语言,可以转换成html,pdf等格式(左侧有一个可见的冒号和四个不可见的空格)
代码块 2
: 这是代码块的定义(左侧有一个可见的冒号和四个不可见的空格)

引用

一般引用

引用需要在被引用的文本前加上>符号。

  • 效果
  • 代码

这是一个有两段文字的引用
无意义的占行文字1.
无意义的占行文字2.

无意义的占行文字3.
无意义的占行文字4.

引用
1
2
3
4
5
6
> 这是一个有两段文字的引用
> 无意义的占行文字1.
> 无意义的占行文字2.
>
> 无意义的占行文字3.
> 无意义的占行文字4.

引用嵌套

区块引用可以嵌套(例如:引用内的引用),只要根据层次加上不同数量的 > :

  • 效果
  • 代码

请问 Markdwon 怎么用? - 小白

自己看教程! - 愤青

教程在哪? - 小白

1
2
3
> 请问 Markdwon 怎么用? - 小白
>> 自己看教程! - 愤青
>>> 教程在哪? - 小白

引用其它要素

引用的区块内也可以使用其他的 Markdown 语法,包括标题、列表、代码区块等:

  • 效果
  • 代码
  1. 这是第一行列表项。
  2. 这是第二行列表项。

引用代码行:
return shell_exec("echo $input | $markdown_script");
引用代码段:

1
2
3
for (list in $lists);do
echo $list;
done
1
2
3
4
5
6
7
8
9
10
11
> 1.   这是第一行列表项。
> 2. 这是第二行列表项。
>
> 引用代码行:
> `return shell_exec("echo $input | $markdown_script");`
> 引用代码段:
>{\% code %}
for (list in $lists);do
echo $list;
done
{\% endcode %}

note标签引用

  • default
  • primary
  • info
  • success
  • warning
  • danger

default with-icon

default 1.1

default 1.2

defalt no-icon

default 1.1

default 1.2

primary with-icon

primary 1.1

primary 1.2

primary no-icon

primary 1.1

primary 1.2

info with-icon

info 1.1

info 1.2

info no-icon

info 1.1

info 1.2

success with-icon

success 1.1

success 1.2

success no-icon

success 1.1

success 1.2

warning with-icon

warning 1.1

warning 1.2

warning no-icon

warning 1.1

warning 1.2

danger with-icon

danger 1.1

danger 1.2

danger no-icon

danger 1.1

danger 1.2

居中引用

效果:

Something

代码:

1
{% cq %}Something{% endcq %}

表格

第一行为表头,第二行分隔表头和主体部分,第三行开始每一行为一个表格行。
列于列之间用管道符|隔开。原生方式的表格每一行的两边也要有管道符。
第二行还可以为不同的列指定对齐方向。默认为左对齐,在“-”右边加上“:”就右对齐,在“-”两边都加上“:”就居中对齐。

  • 效果:左对齐
  • 代码:左对齐
  • 效果:右对齐
  • 代码:右对齐
  • 效果:居中
  • 代码:居中
学号 姓名 分数
小明 男 75
小红 女 79
小陆 男 92
成绩表
1
2
3
4
5
学号|姓名|分数
-|-|-
小明|男|75
小红|女|79
小陆|男|92
学号 姓名 分数
小明 男 75
小红 女 79
小陆 男 92
成绩表
1
2
3
4
5
学号|姓名|分数
-:|-:|-:
小明|男|75
小红|女|79
小陆|男|92
学号 姓名 分数
小明 男 75
小红 女 79
小陆 男 92
成绩表
1
2
3
4
5
学号|姓名|分数
:-:|:-:|:-:
小明|男|75
小红|女|79
小陆|男|92

分割线

你可以在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。你也可以在星号或是减号中间插入空格。下面每种写法都可以建立分隔线:

  • 效果
  • 代码





1
2
3
4
5
\* \* \*
\***
\*****
- - -
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-

代码

行内代码

  • 效果
  • 代码

C语言里的函数 scanf() 怎么使用?
C语言里的函数 scanf() 怎么使用?
C语言里的函数 scanf() 怎么使用?
C语言里的函数 scanf() 怎么使用?
C语言里的函数 scanf() 怎么使用?
C语言里的函数 scanf() 怎么使用?
C语言里的函数 scanf() 怎么使用?

1
2
3
4
5
6
7
C语言里的函数 \`scanf()\` 怎么使用?
C语言里的函数 {\% label default@scanf() %} 怎么使用?
C语言里的函数 {\% label primary@scanf() %} 怎么使用?
C语言里的函数 {\% label info@scanf() %} 怎么使用?
C语言里的函数 {\% label success@scanf() %} 怎么使用?
C语言里的函数 {\% label warning@scanf() %} 怎么使用?
C语言里的函数 {\% label danger@scanf() %} 怎么使用?

多行代码

  • 效果
  • 代码
1
2
3
for (list in $lists);do
echo $list
done
1
2
3
4
5
\`\`\`
for (list in $lists);do
echo $list
done
\`\`\`

超链接

行内式超链接

  • 效果
  • 代码

不带title:
欢迎来到我的博客
带title:
欢迎来到我的博客

1
2
3
4
不带title:
欢迎来到\[我的博客\]\(https://blog.stanley.wang\)
带title:
欢迎来到\[我的博客\]\(https://blog.stanley.wang "Stanley's Blog"\)

自动超链接

  • 效果
  • 代码

https://blog.stanley.wang
stanley.wang.m@qq.com

1
2
\<https://blog.stanley.wang\>
\<stanley.wang.m@qq.com\>

锚点超链接

暂不支持锚点超链接

公式

示例

  • 效果
  • 代码

When $a \ne 0$, there are two solutions to $ax^2$ + bx + c = 0 and they are: $$x= {-b \pm \sqrt{b^2-4ac} \over 2a}$$

1
When $a \ne 0$, there are two solutions to $ax^2$ + bx + c = 0 and they are: $$x= {-b \pm \sqrt{b^2-4ac} \over 2a}$$

语法规范

呈现位置

  • 行内公式: 使用$…$定义,此时公式在一行内显示
    • 效果
    • 代码

    $\displaystyle\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$

    1
    $\displaystyle\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$
  • 文内公式: 使用$$…$$定义,此时公式居中放大显示
    • 效果
    • 代码

    $$\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$$

    1
    $$\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$$

字母、运算符与杂项

希腊字母

显示 命令 显示 命令
$\alpha$ \alpha $\beta$ \beta
$\gamma$ \gamma $\delta$ \delta
$\epsilon$ \epsilon $\zeta$ \zeta
$\eta$ \eta $\theta$ \theta
$\iota$ \iota $\kappa$ \kappa
$\lambda$ \lambda $\mu$ \mu
$\nu$ \nu $\xi$ \xi
$\pi$ \pi $\rho$ \rho
$\sigma$ \sigma $\tau$ \tau
$\upsilon$ \upsilon $\phi$ \phi
$\chi$ \chi $\psi$ \psi
$\omega$ \omega — —
- 如果要大写希腊字母,则首字母大写即可,如$\Gamma$显示为$\Gamma$
- 如果要使希腊字母显示为斜体,则前面添加var即可,如$\varGamma$显示为$\varGamma$

字母修饰

上下标
  • 上标:^
  • 下标:_

    举例:$C_n^2$显示为:$C_n^2$

矢量
  • 单字母向量:

    $\vec a$显示为$\vec a$
    $\overrightarrow a$显示为$\overrightarrow a$

  • 多字母向量:

    $\vec {abcde}$显示为$\vec {abcde}$
    $\overrightarrow {abcde}$显示为$\overrightarrow {abcde}$

  • 特殊修饰:

    上尖号:$\hat {abcde}$显示为$\hat {abcde}$
    宽上尖号: $\widehat {abcde}$显示为$\widehat {abcde}$
    上划线:$\overline {abc}de$显示为$\overline {abc}de$
    下划线:$\underline ab{cde}$显示为$\underline ab{cde}$

字体
  • TypeWriter:$\mathtt {A}$显示为:$\mathtt {ABCDEFGHIJKLMNOPQRSTUVWXYZ}$
  • Blackboard blod:$\mathbb {A}$显示为:$\mathbb {ABCDEFGHIJKLMNOPQRSTUVWXYZ}$
  • Sans Serif:$\mathsf {A}$显示为:$\mathsf {ABCDEFGHIJKLMNOPQRSTUVWXYZ}$
空格
  • 语法本身忽略空格,$ab$和$a b$都显示为$ab$ $a b$
  • 小空格:$a\ b$显示为$a\ b$
  • 4格空格:$a\quad b$显示为$a\quad b$

分组

  • 使用{}将同一级的括在一起,成组处理

    $x_i^2$显示为$x_i^2$
    $x_{i^2}$显示为$x_{i^2}$

括号

  • 小括号:$(...)$显示为$(…)$
  • 中括号:$[...]$显示为$[…]$
  • 大括号:$\\{...\\}$显示为$\{…\}$
  • 尖括号:$\langle ... \rangle$显示为$\langle … \rangle$
  • 绝对值:$\vert ... \vert$显示为$\vert … \vert$
  • 双竖线:$\Vert ... \Vert$显示为$\Vert … \Vert$
  • 使用$\left$和$\right$使符号大小与邻近的公式相适应,该语句适用于所有括号类型

    $\\{\frac{(x+y)}{[\alpha+\beta]}\\}$显示为$\{\frac{(x+y)}{[\alpha+\beta]}\}$
    $\left\\{\frac{(x+y)}{[\alpha+\beta]}\right\\}$显示为$\left\{\frac{(x+y)}{[\alpha+\beta]}\right\}$

常用数学运算符

基础符号
运算符 说明 应用举例 命令
+ 加 $x+y$ $x+y$
- 减 $x−y$ $x-y$
\times 叉乘 $x\times y$ $x\timesy$
\cdot 点乘 $x\cdot y$ $x\cdot y$
\ast(*) 星乘 $x\ast(y)$ $x\ast(y)$
\div 除 $x\div y$ $x\div y$
\pm 加减 $x\pm y$ $x\pm y$
\mp 减加 $x\mp y$ $x\mp y$
\approx 约等于 $x\approx y$ $x\approx y$
\equiv 恒等于 $x\equiv y$ $x\equiv y$
\cong 全等于 $\triangle ABC\cong \triangle BCD$ $\triangle ABC\cong \triangle BCD$
\sim 相似于 $x\sim y$ $x\sim$ y
\bigodot 定义运算符 $x\bigodot y$ $x\bigodot y$
\bigotimes 定义运算符 $x\bigotimes y$ $x\bigotimes y$
比较运算符
运算符 说明 应用举例 命令
= 等于 $x=y$ $x=y$
\lt 小于 $x\lt y$ $x\lt y$
\gt 大于 $x\gt y$ $x\gt y$
\le 小于等于 $x\le y$ $x\le y$
\ge 大于等于 $x\ge y$ $x\ge y$
\ne 不等于 $x\ne y$ $x\ne y$
逻辑运算符
运算符 说明 应用举例 命令
\land 与 $x\land y$ $x\land y$
\lor 或 $x\lor y$ $x\lor y$
\lnot 非 $\lnot x$ $\lnot x$
\oplus 异或 $x\oplus y=(\lnot x\land y)\lor(x\land \lnot y)$ $x\oplus y=(\lnot x\land y)\lor(x\land \lnot y)$
\forall 针对所有 $\forall x \in N$ $\forall x \in N$
\exists 存在 $\exists \xi$ $\exists \xi$
集合符号
运算符 说明 应用举例 命令
\in 属于 $x\in y$ $x\in y$
\subseteq 子集 $x\subseteq y$ $x\subseteq y$
\subset 真子集 $x\subset y$ $x\subset y$
\supset 超集 $x\supset y$ $x\supset y$
\supseteq 超集 $x\supseteq y$ $x\supseteq y$
\varnothing 空集 $\varnothing$ $\varnothing$
\cup 并 $x\cup y$ $x\cup y$
\cap 交 $x\cap y$ $x\cap y$
特殊符号
符号 命令 符号 命令
$\infty$ $\infty$ $\partial$ $\partial$
$\nabla$ $\nabla$ $\triangle$ $\triangle$
$\top$ $\top$ $\bot$ $\bot$
$\vdash$ $\vdash$ $\vDash$ $\vDash$
$\star$ $\star$ $\ast$ $\ast$
$\circ$ \circ $\bullet$ $\bullet$

注:想要表达非的概念只需前加\not,会添加删除斜线,如:$x\not=y$显示为$x\not=y$,$x\not\in y$显示为$x\not\in y$

其他

运算符 说明 应用举例 命令
\overbrace 上大括号 $\overbrace{a+\underbrace{b+c}_{1.0}+d}^{2.0}$ $\overbrace{a+\underbrace{b+c}_{1.0}+d}^{2.0}$
\underbrace 下大括号 $\underbrace{a+d}_3$ $\underbrace{a+d}_3$
\partial 偏导数 $\frac{\partial z}{\partial x}$ $\frac{\partial z}{\partial x}$
\ldots 底端对齐的省略号 $1,2,\ldots,n$ $1,2,\ldots,n$
\cdots 中线对齐的省略号 $1,2,\cdots,n$ $1,2,\cdots,n$
\uparrow 上箭头 $\uparrow$ $\uparrow$
\Uparrow 双上箭头 $\Uparrow$ $\Uparrow$
\downarrow 下箭头 $\downarrow$ $\downarrow$
\Downarrow 双下箭头 $\Downarrow$ $\Downarrow$
\leftarrow 左箭头 $\leftarrow$ $\leftarrow$
\Leftarrow 双左箭头 $\Leftarrow$ $\Leftarrow$
\rightarrow 右箭头 $\rightarrow$ $\rightarrow$
\Rightarrow 双右箭头 $\Rightarrow$ $\Rightarrow$

求和、极限与积分

求和、求积

  • 求和符号$\sum$显示为$\sum$,注意要用\displaystyle显示成文内公式的模样,或者使用$$\sum$$(这时样式为居中)

    举例:不加\displaystyle,$\sum_{i=0}^n$显示为$\sum_{i=0}^n$
    举例:加\displaystyle,$\displaystyle\sum_{i=0}^n$显示为$\displaystyle\sum_{i=0}^n$
    举例:$$\sum_{i=0}^n$$显示为$$\sum_{i=0}^n$$

  • 求积符号$\prod显示为$\prod$

    举例:$\displaystyle\prod_{i=0}^n$显示为$\displaystyle\prod_{i=0}^n$

集合

  • 大交集$\bigcap$显示为$\bigcap$

    举例:$\displaystyle\bigcap_{i=0}^n$显示为$\displaystyle\bigcap_{i=0}^n$

  • 大并集$\bigcup$显示为$\bigcup$

    举例:$\displaystyle\bigcup_{i=0}^n$显示为$\displaystyle\bigcup_{i=0}^n$

极限

  • 极限符号$\lim$显示为$\lim$

    举例: $\displaystyle\lim_{x\to\infty}$显示为$\displaystyle\lim_{x\to\infty}$

积分

  • 积分符号
    • 效果
    • 代码

    $\int$
    $\iint$
    $\iiint$
    $\oint$

    1
    2
    3
    4
    $\int$
    $\iint$
    $\iiint$
    $\oint$

    举例:$\int_0^\infty{fxdx}$显示为$\int_0^\infty{fxdx}$

分式与根式

分式

  • $\frac{公式1}{公式2}$显示为$\frac{公式1}{公式2}$

    举例:$\frac{b_i^2}{a_i^2}$显示为$\frac{b_i^2}{a_i^2}$

  • 连分式用$\cfrac{公式1}{公式2}$,样式与$\frac{公式1}{公式2}$略有不同

    举例: 连分式$$x=a_0 + \cfrac {1^2}{a_1 + \cfrac {2^2}{a_2 + \cfrac {3^2}{a_3 + \cfrac {4^2}{a_4 + ...}}}}$$显示为$$x=a_0 + \cfrac {1^2}{a_1 + \cfrac {2^2}{a_2 + \cfrac {3^2}{a_3 + \cfrac {4^2}{a_4 + …}}}}$$
    举例: 连分式$$x=a_0 + \frac {1^2}{a_1 + \frac {2^2}{a_2 + \frac {3^2}{a_3 + \frac {4^2}{a_4 + ...}}}}$$显示为$$x=a_0 + \frac {1^2}{a_1 + \frac {2^2}{a_2 + \frac {3^2}{a_3 + \frac {4^2}{a_4 + …}}}}$$

根式

  • $\sqrt[x]{y}$显示为$\sqrt[x]{y}$

特殊函数

  • 语法:$\函数名$

    举例: $\sin x$,$\ln x$,$\log_n^2$,$\max(A,B,C)$显示为$\sin x$,$\ln x$,$\log_n^2$,$\max(A,B,C)$

矩阵

基本语法

  • 起始标记:$\begin{matrix},结束标记:\end{matrix}$
  • 每一行末尾标记\\\,行间元素之间以&分隔
    • 效果
    • 代码

    $\begin{matrix}
    1&0&0\
    0&1&0\
    0&0&1\
    \end{matrix}$

    1
    2
    3
    4
    5
    $\begin{matrix}
    1&0&0\\\
    0&1&0\\\
    0&0&1\\\
    \end{matrix}$

矩阵边框

  • 在起始、结束标记处用下列词替换matrix
    • pmatrix
    • 小括号
    • bmatrix
    • 中括号
    • Bmatrix
    • 大括号
    • vmatrix
    • 单竖线
    • Vmatrix
    • 双竖线

    $\begin{pmatrix}
    1&0&0\
    0&1&0\
    0&0&1\
    \end{pmatrix}$

    1
    2
    3
    4
    5
    $\begin{pmatrix}
    1&0&0\\\
    0&1&0\\\
    0&0&1\\\
    \end{pmatrix}$

    $\begin{bmatrix}
    1&0&0\
    0&1&0\
    0&0&1\
    \end{bmatrix}$

    1
    2
    3
    4
    5
    $\begin{bmatrix}
    1&0&0\\\
    0&1&0\\\
    0&0&1\\\
    \end{bmatrix}$

    $\begin{Bmatrix}
    1&0&0\
    0&1&0\
    0&0&1\
    \end{Bmatrix}$

    1
    2
    3
    4
    5
    $\begin{Bmatrix}
    1&0&0\\\
    0&1&0\\\
    0&0&1\\\
    \end{Bmatrix}$

    $\begin{vmatrix}
    1&0&0\
    0&1&0\
    0&0&1\
    \end{vmatrix}$

    1
    2
    3
    4
    5
    $\begin{vmatrix}
    1&0&0\\\
    0&1&0\\\
    0&0&1\\\
    \end{vmatrix}$

    $\begin{Vmatrix}
    1&0&0\
    0&1&0\
    0&0&1\
    \end{Vmatrix}$

    1
    2
    3
    4
    5
    $\begin{Vmatrix}
    1&0&0\\\
    0&1&0\\\
    0&0&1\\\
    \end{Vmatrix}$

省略元素

  • 横省略号:$\cdots$
  • 竖省略号:$\vdots$
  • 斜省略号:$\ddots$
    • 效果
    • 代码

    $\begin{bmatrix}
    {a_{11}}&{a_{12}}&{\cdots}&{a_{1n}}\
    {a_{21}}&{a_{22}}&{\cdots}&{a_{2n}}\
    {\vdots}&{\vdots}&{\ddots}&{\vdots}\
    {a_{m1}}&{a_{m2}}&{\cdots}&{a_{mn}}\
    \end{bmatrix}$

    1
    2
    3
    4
    5
    6
    $\begin{bmatrix}
    {a_{11}}&{a_{12}}&{\cdots}&{a_{1n}}\\\
    {a_{21}}&{a_{22}}&{\cdots}&{a_{2n}}\\\
    {\vdots}&{\vdots}&{\ddots}&{\vdots}\\\
    {a_{m1}}&{a_{m2}}&{\cdots}&{a_{mn}}\\\
    \end{bmatrix}$

阵列

  • 需要array环境:起始、结束处以$\begin{array}、\end{array}$声明
  • 对齐方式:在{array}后以{}逐行统一声明,左对齐:l;居中:c;右对齐:r
  • 竖直线:在声明对齐方式时,插入|建立竖直线
  • 插入水平线:\hline
  • 换行: \\\,行间元素之间以&分隔
    • 效果
    • 代码

    $\begin{array}{c|lll}
    {\downarrow}&{a}&{b}&{c}\
    \hline
    {R_1}&{c}&{b}&{a}\
    {R_2}&{b}&{c}&{c}\
    \end{array}$

    1
    2
    3
    4
    5
    6
    $\begin{array}{c|lll}
    {\downarrow}&{a}&{b}&{c}\\\
    \hline
    {R_1}&{c}&{b}&{a}\\\
    {R_2}&{b}&{c}&{c}\\\
    \end{array}$

方程组

  • 需要cases环境:起始、结束处以$\begin{cases}、\end{cases}$声明
  • 换行:\\\,行间元素之间以&分隔
    • 效果
    • 代码

    $\begin{cases}
    a_1x+b_1y+c_1z=d_1\
    a_2x+b_2y+c_2z=d_2\
    a_3x+b_3y+c_3z=d_3\
    \end{cases}
    $

    1
    2
    3
    4
    5
    6
    $\begin{cases}
    a_1x+b_1y+c_1z=d_1\\\
    a_2x+b_2y+c_2z=d_2\\\
    a_3x+b_3y+c_3z=d_3\\\
    \end{cases}
    $

分段函数

  • 与方程组定义方法类似
    • 效果
    • 代码

    $f(n)=
    \begin{cases}
    \cfrac n2, &if\ n\ is\ even\
    3n + 1, &if\ n\ is\ odd\
    \end{cases}$

    1
    2
    3
    4
    5
    $f(n)=
    \begin{cases}
    \cfrac n2, &if\ n\ is\ even\\\
    3n + 1, &if\ n\ is\ odd\\\
    \end{cases}$

多行表达式

  • 效果
  • 代码

$\begin{equation}\begin{split}
a&=b+c-d \
&\quad +e-f\\
&=g+h\
&=i\
\end{split}\end{equation}$

1
2
3
4
5
6
$\begin{equation}\begin{split} 
a&=b+c-d \\\
&\quad +e-f\\\
&=g+h\\\
&=i\\\
\end{split}\end{equation}$

插入图片

语法说明:![图片Alt](图片地址 "图片Title")

  • 效果
  • 代码

哆啦A梦

1
!\[哆啦A梦\]\(/images/duola.jpg "哆啦A梦"\)

JVM基础知识和调优基础原理

发表于 2017-03-14 | 更新于 2020-09-03 | 分类于 Linux基础
本文字数: 4k | 阅读时长 ≈ 4 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


JVM原理

什么是jvm

java虚拟机,就是个应用程序,工作在用户态

详解

JVM是按照运行时数据的存储结构来划分内存结构的,JVM在运行java程序时,将它们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据。运行时数据包括java程序本身的数据信息和JVM运行java需要的额外数据信息。

JVM运行时数据区

  • 程序计数器–线程私有

    行号,指示程序执行到哪个位置

  • Java虚拟机栈–线程私有
  • 本地方法栈–线程私有

    操作系统底层的方法

  • Java堆–线程公用

JVM内存分配

栈内存分配 -xss 默认1M

保存参数、局部变量、中间计算过程和其他数据。退出方法的时候,修改栈顶指针就可以把栈帧中的内容销毁。

  • 栈的优点:存取速度比堆块,仅次于寄存器,栈数据可以共享。
  • 栈的缺点:存在栈中的数据大小、生存期是在编译时就确定的,导致其缺乏灵活性。

    stack out of memory

    一般情况下不会溢出,方法不会写那么大

    堆内存分配:

    保存对象
  • 堆的优点:动态分配内存大小,生存期不必事先告诉编译器,它是在运行期动态分配的,垃圾回收器会自动收走不再使用的空间区域。
  • 堆的缺点:运行时动态分配内存,在分配和销毁时都要占用时间,因此堆的效率较低。

    堆结构:

  • Young:E区,S0,S1
  • Old:
  • Permanent:

JVM堆配置参数:

概述

  • -Xms 初始堆大小

    默认物理内存的1/64(<1GB)

  • -Xmx最大堆大小

    默认物理内存的1/4(<1GB),实际中建议不大于4GB

  • 一般建议设置 -Xms=-Xmx

    好处是避免每次在gc后,调整堆的大小,减少系统内存分配开销

  • 整个堆大小=年轻代大小+年老代大小+持久代大小

新生代:

  • 新生代=1个eden区+2个survivor区
  • -Xmn 年轻代大小(1.4 or later)

    -XX:NewSize,-XX:MaxNewSize(设置年轻代大小,1.4之前)

  • -XX:NewRatio

    年轻代(包括E区和两个S区)与年老代的比值(除去持久代)
    一般情况下设置了Xms=Xmx并且设置了Xmn的情况下,该参数不需要设置。

  • -XX:ServivorRatio

    1个S区与E区大小的比值,默认设置为8,则1个S区占整个年轻代的1/10

  • 新生代用来存放JVM刚分配的Java对象

老年代:

  • 老年代=整个堆-年轻代大小-持久代大小
  • 年轻代中经过垃圾回收没有回收掉的对象被复制到年老代
  • 老年代存储对象比年轻代年龄大的多,而且不乏大对象(缓存)
  • 新建的对象也有可能直接进入老年代
    • 大对象,可通过启动参数设置-XX:PretnureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。
    • 大的数组对象,切数组中无引用外部对象
  • 老年代大小无配置参数

持久代:

  • 持久代=整个堆-年轻代大小-老年代大小
  • -XX:PermSize -XX:MaxPermSize

    设置持久代的大小,一般情况推荐把-XX:PermSize设置成-XX:MaxPermSize的值为相同的值,因为持久代大小的调整也会导致堆内存需要触发fgc。

  • 存放Class、Method元信息,其大小与项目的规模、类、方法的数量有关。一般设置为128M就足够,设置原则是预留30%的空间。
  • 持久代的回收方式
    • 常量池中的常量,无用的类信息,常量的回收很简单,没有引用了就可以被回收
    • 对于无用的类进行回收,必须保证3点:
      • 类的所有实例都已经被回收
      • 加载类的ClassLoader已经被回收
      • 类对象Class对象没有被引用(即没有通过反射引用该类的地方)

JVM内存垃圾回收:

垃圾收集算法:

  • 引用计数算法(濒临被抛弃
  • 根搜索算法:

    从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明对象是不可用的。即不可达对象。
    在Java语言中,GC Roots包括:

  • 虚拟机栈中引用的对象。(大部分被回收的)
  • 方法区中静态属性实体引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI引用的对象。

垃圾回收算法:

复制算法(Copying)

当空间存活的对象比较少时,极为高效,此算法用于新生代内存回收,从E区回收到S0或S1

标记清除算法(Mark-Sweep)

产生碎片,适合老年代垃圾回收。

标记整理压缩算法(Mark-Compac)

稍慢,适合老年代垃圾回收,解决碎片问题,对象连续,成本更高

名词解释:

  • 串行回收:gc单线程内存回收、会暂停所有用户线程,用于client端
  • 并行回收:收集是指多个GC线程并行工作,但此时用户线程是暂停的
  • 并发回收:是指用户线程与GC线程同时执行(不一定是并行,可能交替,但总体上是同时执行的),不需要停顿用户线程(其实CMS中用户线程还是需要停顿的,只是非常短,GC线程在另一个CPU上执行)

JVM常见的垃圾回收器:

Serial回收器(串行回收器)

是一个单线程的收集器,只能使用一个CPU或者一条线程去完成垃圾收集,在进行垃圾收集时,必须暂停所有其他工作线程,直到收集完成

  • -XX:+UseSerialGC来开启(新生代和老年代都开启)
  • 使用复制算法(新生代)标记-压缩算法(老年代)
  • 串行的、独占式的垃圾回收器
  • 缺点:Stop-The-World

ParNew回收器(并行回收器)

也是独占式回收器,在收集过程中,应用程序全部暂停。如果是单CPU上或者并发能力较弱的系统上,还不如串行回收器性能好。

  • -XX:+UseParNewGC开启
  • -XX:ParallelGCThreads指定线程数,默认最好与CPU数量相当

新生代Parallel Scavenge回收器

吞吐量优先回收器

  • 关注CPU吞吐量,即运行用户代码的时间/总时间,适合运行后台运算
  • -XX:+UserParallelGC开启,这也是在Server模式下的默认值
  • -XX:GCTimeRatio
  • -XX:MaxGCPauseMillis

老年代ParallelOld回收器

  • -XX:+UseParallelOldGC开启

CMS(并发标记清除)回收器

用的最广泛,标记和重新标记两个阶段仍然需要停止用户线程,但时间很快

初始标记
并发标记
重新标记
并发清除

  • 标记-清除算法:同时它又是一个使用多线程并发回收的垃圾收集器
  • -XX:ParallelCMSThreads:手工设定CMS线程数量,CMS默认启动的线程数是(ParallelGCThreads+3)/4
  • -XX:+UseConcMarkSweepGC开启
  • -XX:CMSInitialtingOccupancyFraction
    设置CMS收集器在老年代空间被使用多少后触发垃圾收集,默认值为68%,仅在CMS收集器时有效,-XX:CMSInitiatingOccupancyFraction=70
  • -XX:+UseCMSCompactAtFullCollection
    由于CMS收集器会产生碎片,此参数设置在垃圾收集器后是否需要一次内存碎片整理过程,仅在CMS收集器时有效。
  • -XX:+CMSFullGCBeforeCompaction
    设置CMS收集器在进行若干次垃圾收集后再进行一次内存碎片整理过程,通常与UseCMSCompactAtFullCollection参数一起使用
  • -XX:CMSInitiatingPermOccupancyFraction
    设置持久代

GC性能指标

吞吐量

应用花在非GC上的时间百分比

GC负荷

花在GC时间百分比

暂停时间(看GClog)

应用划在GC stop-the-world的时间

GC频率

反应速度

从一个对象变成垃圾到这个对象被回收的时间

小结

  • 一个交互式的应用要求暂停时间越少越好,然而,一个非交互式的应用,希望GC负荷越低越好
  • 一个实时系统对暂停时间和GC负荷要求,都是越低越好

内存容量配置原则

年轻代大小选择

  • 响应时间优先的应用

    尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择),在此情况下,年轻代收集发生的频率也是最小的,同时减少到达老年代的对象

  • 吞吐量优先的应用

    尽可能设置大,可能到达Gbit的程度,因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用
    避免设置过小,当新生代设置过小时会导致

  • YGC次数更加频繁
  • 可能导致YGC对象直接进入老年代,如果此时老年代满了,会触发FGC

老年代大小选择

  • 响应时间优先的应用

    使用并发垃圾收集器(CMS)设置小了会造成内存碎片,高回收频率以及应用暂停而使用传统的标记清除方式,如果堆大了,需要较长的收集时间,最优化的方案,一般参考以下数据获得:
    并发垃圾收集信息、持久代并发收集次数、传统GC信息、花在年轻代和年老代回收上的时间比例

  • 吞吐量优先的应用

    一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽量存放长期存活对象。

java排障

使用jps获取java进程的pid

1
# jps -lvm

导出CPU占用高进程的线程栈

1
jstack `$pid` >> java.txt

查看对应进程的哪个线程占用CPU过高

1
# top -H -p 22056

将线程的pid转换为16进制

1
# echo "obase=16;`$pid`"|bc

第二步中导出的java.txt中查找转换为16进制的线程pid,找到对应的线程栈

分析负载高的线程栈都是什么业务操作,优化程序并处理问题

RPM包制作

发表于 2017-01-15 | 更新于 2020-09-03 | 分类于 Linux基础
本文字数: 3k | 阅读时长 ≈ 3 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


RPM包能制作什么

  • 一个应用程序
  • 库文件
  • 配置文件
  • 文档包

制作步骤

创建制作目录

  • BUILD

    源代码解压以后,放在这个目录,不用用户参与,只需提供这个目录,真正的制作车间。

  • RPMS

    制作完成的RPM包放在这个目录。有子目录,跟硬件架构相关,特定平台子目录,i386,ARM等等。交叉编译。

  • SOURCES

    所有的原材料。

  • SPECS

    spec文件存放目录,制作RPM包的纲领性文件。软件包名.spec。

  • SRPMS

    SRC格式的RPM包存放目录。没有平台相关的概念。

注意:一般制作RPM包,建议不要用root用户,所以,以上制作目录结构,建议使用普通用户创建,不要用系统默认的。

  • 宏定义
    macrofiles:~/.rpmmacros,以最后这个为准
    rmpbuild –showrc|grep _topdir
    所以切换普通用户
    1
    %_topdir           /home/xxx/rpmbuild

命令:

1
2
# mkdir -pv rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
# rpmbuild --showrc|grep _topdir

把源文件放进适当目录

制作spec文件(至关重要)

信息说明段(introduction section)Name,Version,Release,Group必须,其他可选。

rpm -qpi 可以查看一个rpm包的相关信息
定义各种tag

  • Name:软件包的名字
  • Relocations:是否可换安装地址。not relocatable
  • Version:版本号,至关重要,只能用X.XX.XXX不能使用-
  • Release:发行版本号 1%{?dist}
  • License:声明版权,例如:GPLv2
  • Group:属于那个组,不要自己定义,在以下组里找,只要存在的组就可以 less /usr/share/doc/rpm-4.4.2.3/GROUPS
  • URL
  • Packager:制作者<邮箱>
  • Vendor:提供商
  • Summary:概要
  • %description:描述
  • Source:源文件,链接,Source0:解压缩主原材料,Source1:脚本等等
  • BuildRoot:编译好的程序,临时安装根目录,配合file section,收集哪些文件,打包到RPM包,最后在clean section中删除。可以规定任意目录:/%{_tmppath}/%{name}-%{version}-%{release}-root
  • BuildRequires:定义依赖关系,编译依赖和安装依赖。

准备段prep section

解压缩源码包到制作目录,cd进去,设定工作环境、宏,等等。
单独的宏来定义:

  • %prep
  • %setup -q 静默模式

制作段build section

1
2
3
%build
./configure balabalabala.......................
%{__make} %{?_smp_mflags} 多CPU上,这个标识可以加快编译速度

安装段install section

1
2
3
4
5
%install
%{__rm} -rf %{buildroot}
%{__make} install DESTDIR="%{buildroot}"
%find_long %{name}
%{__install} -p -D 0755 %{SOURCE1} %{buildroot}/etc/init.d/nginx 安装自定义的资源文件 -p保留原材料时间戳

补充:Linux系统install命令:类似于cp
install /etc/fstab /tmp
install -d /tmp/test 创建目录
install -D /etc/fstab /tmp/noexistsdir/fstab
可以直接指定安装目标处不存在的目录,但是要把安装的源文件名也指定

脚本段script section

1
2
3
4
5
6
7
8
9
10
11
%pre安装前 $1=0,1,2 卸载,安装,升级
$1 == 1
加个用户
%post安装后
$1 == 1
chkconfig --add
%preun卸载前
$1 == 0
service xxx stop
chkconfig --del
%postun卸载后

清理段clean cection

1
2
%clean
%{__rm} -rf %{buildroot}

文件段files section

除了debug信息,都要做进RPM包

1
2
3
4
5
6
%files -f %{name}.lang
%defattr (-,root,root,0755) 定义文件默认权限
%doc API CHANGES COPYING CREDITS README axelrc.examlpe 文档
%config(noreplace) %{_sysconfdir}/axelrc 配置文件,noreplace不替换原来的
/usr/local/bin/axel 包含的所有文件,可以直接写目录
%attr (0755,root,root) /etc/rc.d/init.d/nginx 定义自定义资源的属性,不指定则继承%defattr

更改日志段change log section

1
2
3
%changelog
* xxx 日期,制作人,版本号
- Initial Version release号

制作RPM包

rpmbuild命令
-bp 只执行到prep段
-bi 只执行到install段
-bc 只执行到build段
-bb 制作二进制格式的RPM包
-bs 制作源码格式的RPM包
-ba 既制作二进制格式又制作源码格式
-bl 检查files字段和buildroot文件是否一一对应,不一致则报错

展开rpm源码包

rpm2cpio xxxx-src.rpm | cpio -id

到哪去找源码包呢?
rpmfind.net
rpm.pbone.net

YUM后的rpm包保留在本地的方法

1
# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf

rpm包默认存放路径

1
/var/cache/yum/base/packages

fpm制作rpm包

1
2
3
4
# yum install ruby
# gem source -a http://mirrors.aliyun.com/rubygems/
# gem source -r http://rubygems.org/
# gem install fpm

参考文档

CentOS操作系统基础优化

发表于 2017-01-14 | 更新于 2020-09-03 | 分类于 Linux基础
本文字数: 1.9k | 阅读时长 ≈ 2 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


内核优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ECHOSTR='net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time =600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120'
echo "$ECHOSTR" >> /etc/sysctl.conf &&\
modprobe ip_conntrack && modprobe bridge
echo "modprobe ip_conntrack" >> /etc/rc.local
echo "modprobe bridge" >> /etc/rc.local
/sbin/sysctl -p

文件描述符

/etc/security/limits.conf
1
2
3
4
*                hard    nofile          65535
* soft nofile 65535
* hard noproc 65535
* soft noproc 65535

更新yum源,安装epel源

vi /etc/yum.repo.d/CentOS-Base.repo 略

1
# yum install epel-release -y

系统时钟同步

1
2
3
# yum install chrony -y
# systemctl start chronyd
# systemctl enable chronyd

关闭SELinux和防火墙

1
2
3
4
if [ -f /etc/selinux/config ]; then
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
setenforce 0
fi
1
2
# systemctl stop firewalld
# systemctl disable firewalld

调整系统字符集

1
2
3
# echo 'export LC_ALL=C'>> /etc/profile
# echo 'export LANG=en_US.UTF-8' >> /etc/profile
# source /etc/profile

安装基础工具

1
# yum install wget net-tools telnet tree nmap sysstat lrzsz dos2unix -y

清华大学yum源--CentOS7

发表于 2017-01-14 | 更新于 2020-09-03 | 分类于 Linux基础
本文字数: 1.7k | 阅读时长 ≈ 2 分钟

欢迎加入王导的VIP学习qq群:==>932194668<==


CentOS-Base.repo

#

The mirror system uses the connecting IP address of the client and the

update status of each mirror to pick mirrors that are updated to and

geographically close to the client. You should use this for CentOS updates

unless you are manually picking other mirrors.

#

If the mirrorlist= does not work for you, as a fall back you can try the

remarked out baseurl= line instead.

#
#

[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearch/

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/centosplus/$basearch/

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

12
Stanley Wang

Stanley Wang

19 日志
4 分类
GitHub E-Mail
© 2020 Stanley Wang | 278k | 4:13