第六周作业

背景

[TOC]

一、简述DDL,DML,DCL,DQL,并且说明mysql各个关键字查询时候的先后顺序

1、DDL:(数据定义语言)是指CREATE,ALTER,DROP语句

DDL允许添加、修改、删除包含数据的逻辑结构,或允许用户访问、维护数据(数据库、表、键、视图等)的逻辑结构。DDL是关于元数据的。

2、DML: (数据操纵语言)是指INSERT,DELETE,UPDATE语句

DML允许自己添加、删除、修改数据

3、DQL:(数据查询语言)是指SELECT,SHOW,HELP语句

SELECT是主要的DQL指令,它会检索需要的数据;SHOW检索有关元数据的信息;HELP是帮助查询命令的作用和用法

4、DCL:(数据控制语言)是指GRANT,REVOKE语句

DCL用于授予、撤销对数据库及其内容的权限。MySQL的权限相当复杂,DCL是关于安全性的。

SELECT查询语句执行的先后顺序:

1
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause -->SELECT --> ORDER BY --> LIMIT

二、自行设计10个sql查询语句,需要用到关键字[GROUP BY/HAVING/ORDER BY/LIMIT],至少同时用到两个

为了方便后续实验,导入一个数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@Rocky ~]#mysql < hellodb_innodb.sql
[root@Rocky ~]#mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| sys |
| zabbix |
+--------------------+ #可以看见有hellodb数据库
mysql> use hellodb #进入hellodb数据库

①将teachers表按年龄从小到大排序,取前两个(order by:以某条件进行排序,默认为正序排序)

1
2
3
4
5
6
7
8
mysql> select * from teachers order by age limit 2;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 3 | Miejue Shitai | 77 | F |
+-----+---------------+-----+--------+
2 rows in set (0.00 sec)

②将teachers表按年龄从小到大排序,取第2个和第3个(limit 2:取前2个;limit 1,2:取第一个后面的两个)

1
2
3
4
5
6
7
8
mysql> select * from teachers order by age limit 1,2;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
2 rows in set (0.00 sec)

③将teachers表按年龄从大到小排序,取前两个( order by后添加desc,表示倒序排序 )

1
2
3
4
5
6
7
8
mysql> select * from teachers order by age desc limit 2;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 2 | Zhang Sanfeng | 94 | M |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
2 rows in set (0.00 sec)

④学生表中以班级为组,求出每个班级有几个,并按正序排序(group by:以某条件进行筛选,然后进行聚合运算;count(*):每个班级有几个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> select classid,count(*)数量 from students group by classid order by 数量;
+---------+--------+
| classid | 数量 |
+---------+--------+
| 5 | 1 |
| NULL | 2 |
| 2 | 3 |
| 7 | 3 |
| 1 | 4 |
| 4 | 4 |
| 3 | 4 |
| 6 | 4 |
+---------+--------+
8 rows in set (0.00 sec)

⑤学生表中以班级为组,求出每个班级有几个,并按正序排序,取前3个

1
2
3
4
5
6
7
8
9
mysql> select classid,count(*)数量 from students group by classid order by 数量 limit 3; 
+---------+--------+
| classid | 数量 |
+---------+--------+
| 5 | 1 |
| NULL | 2 |
| 2 | 3 |
+---------+--------+
3 rows in set (0.00 sec)

⑥学生表中以班级为组,求出每个班级有几个,并取前3个

1
2
3
4
5
6
7
8
9
mysql> select classid,count(*)数量 from students group by classid limit 3; 
+---------+--------+
| classid | 数量 |
+---------+--------+
| 2 | 3 |
| 1 | 4 |
| 4 | 4 |
+---------+--------+
3 rows in set (0.00 sec)

⑦将学生表中男生划分成一组,取男生的平均年龄(avg():平均值;having:对分组聚合运算后的结果指定过滤条件)

1
2
3
4
5
6
7
mysql> select gender,avg(age)平均年龄 from students group by gender having gender='M';
+--------+--------------+
| gender | 平均年龄 |
+--------+--------------+
| M | 33.0000 |
+--------+--------------+
1 row in set (0.00 sec)

⑧按不同班级进行分组,求每个班级的平均年龄,并取出平均年龄大于30的数据

1
2
3
4
5
6
7
8
9
mysql> select classid,avg(age)平均年龄 from students group by classid having 平均年龄 >30;
+---------+--------------+
| classid | 平均年龄 |
+---------+--------------+
| 2 | 36.0000 |
| 5 | 46.0000 |
| NULL | 63.5000 |
+---------+--------------+
3 rows in set (0.00 sec)

⑨按不同班级进行分组,求每个班级的平均年龄,并取出平均年龄大于30的前2条数据

1
2
3
4
5
6
7
8
mysql> select classid,avg(age)平均年龄 from students group by classid having 平均年龄 >30 limit 2;
+---------+--------------+
| classid | 平均年龄 |
+---------+--------------+
| 2 | 36.0000 |
| 5 | 46.0000 |
+---------+--------------+
2 rows in set (0.00 sec)

⑩按不同班级进行分组,求每个班级的平均年龄,并取出平均年龄大于30的数据,按照倒序排序

1
2
3
4
5
6
7
8
9
mysql> select classid,avg(age)平均年龄 from students group by classid having 平均年龄 >30 order by 平均年龄 desc;
+---------+--------------+
| classid | 平均年龄 |
+---------+--------------+
| NULL | 63.5000 |
| 5 | 46.0000 |
| 2 | 36.0000 |
+---------+--------------+
3 rows in set (0.00 sec)

三、xtrabackup备份和还原数据库练习

在centos7及以前的版本中,EPEL源中带有percona-xtrabackup包,可以直接yum进行安装。

在centos8中没有percona-xtrabackup包,需要先在官网上下载percona-xtrabackup包

下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/

image-20221022161404700

只需下载percona-xtrabackup-80-8.0.29-22.1.el8.x86_64.rpm这个包即可,并将包导入到Linux中

实验:利用xtrabackup8.0完全,增量备份及还原MySQL8.0

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
1、备份过程
#第一步:完全备份
[root@Rocky ~]#yum -y install percona-xtrabackup-80-8.0.29-22.1.el8.x86_64.rpm
#在原主机安装xtrabackup包
[root@Rocky ~]#mkdir /backup #在原主机上新建backup目录,用来存放备份的数据
[root@Rocky ~]#xtrabackup -uroot --backup --target-dir=/backup/base
2022-10-22T16:36:43.440670+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK! #将数据备份到/backup/base,其中base目录会自动创建

#第二步:第一次修改数据
mysql> insert teachers (name,age,gender) value('liu',40,'M');

#第三步:第一次增量备份
[root@Rocky ~]#xtrabackup -uroot --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
2022-10-22T17:03:23.595901+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
#将数据备份到/backup/inc1,基于/backup/base完全备份进行的增量备份

#第四步:第二次修改数据
mysql> insert teachers (name,age,gender) value('xiaoyun',42,'F');

#第五步:第二次增量备份
[root@Rocky ~]#xtrabackup -uroot --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
2022-10-22T17:10:36.646597+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
#将数据备份到/backup/inc2,基于/backup/inc1备份进行的增量备份

#第六步:将数据复制到目标主机(目标主机不用创建backup目录,直接复制目录本身)
[root@Rocky backup]#scp -r /backup/ 10.0.0.128:/

2、还原过程
#第一步:预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务
[root@Rocky8 ~]#yum -y install percona-xtrabackup-80-8.0.29-22.1.el8.x86_64.rpm #在目标主机安装xtrabackup包
[root@Rocky8 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base
2022-10-22T17:24:54.399051+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!

#第二步:合并第一次增量备份到完全备份
[root@Rocky8 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
2022-10-22T17:28:03.937839+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!

#第三步:合并第二次增量备份到完全备份,最后一次还原不需要加选项--apply-log-only
[root@Rocky8 ~]#xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
2022-10-22T17:30:03.748682+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!

#第四步:复制到数据库目录(数据库目录必须为空,且mysql服务不能启动)
[root@Rocky8 ~]#systemctl status mysqld
Active: inactive (dead) since Sat 2022-10-22 16:53:19 CST; 38min ago
#查看可确认服务已关闭
[root@Rocky8 ~]#ls /var/lib/mysql/ #查看确认为空
[root@Rocky8 ~]#xtrabackup --copy-back --target-dir=/backup/base
2022-10-22T17:34:33.338805+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!

#第五步:还原属性
[root@Rocky8 ~]#chown -R mysql.mysql /var/lib/mysql #将用户和组都更改为mysql

#第六步:启动服务
[root@Rocky8 ~]#systemctl start mysqld

image-20221022174336407

查看目标主机发现有hellodb数据库,且有增量备份的内容

四、实现mysql主从复制,主主复制和半同步复制

1、主从复制

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
主节点配置:
[root@master ~]#vim /etc/my.cnf #添加mysql服务器设置
[mysqld]
server-id=184 #设置不同的id号便于主从复制,id号无要求
log-bin=/data/logbin/mysql-bin #设置二进制存放位置
:wq
[root@master ~]#mkdir -p /data/logbin #创建二进制存放的目录,mysql-bin是自动生成的
[root@master ~]#chown mysql.mysql /data/logbin #更改用户和所属组
[root@master ~]#systemctl restart mysqld #重新启动服务
[root@master ~]#ls /data/logbin #可以看到二进制已存放到新位置
mysql-bin.000001 mysql-bin.index
[root@master ~]#mysql
mysql> create user repluser@"10.0.0.%" identified by "123456"; #创建账号
mysql> grant replication slave on *.* to repluser@'10.0.0.%'; #将所有数据库的replication slave权限授予账号
[root@master ~]#mkdir /backup #创建备份数据的目录
[root@master ~]#mysqldump -A -F --single-transaction --master-data >/backup/full-`date +%F`.sql #备份数据,full-`date +%F`.sql自动生成
[root@master ~]#ls /backup #查看已生成
full-2022-10-24.sql
#此时主节点设置完成,但从节点还没设置,所以主节点还没有dump线程
mysql> show processlist;
+----+---------------+---------+------+-------+------+------------------+----------+
| Id | User | Host | db |Command| Time | State | Info |
+----+---------------+---------+------+-------+------+------------+----------------+
| 5 |event_scheduler|localhost| NULL | Daemon| 1451 |Waiting on empty queue| NULL |
| 8 | root |localhost| NULL | Query | 0 | init |show processlist|
+----+--------------+----------+------+-------+------+------------+----------------+



从节点配置:
[root@slave1 ~]#vim /etc/my.cnf #添加mysql服务器设置
[mysqld]
server-id=185
read-only #设置数据库只读,针对supper user无效
:wq
[root@slave1 ~]#systemctl restart mysqld
[root@slave1 ~]#mkdir /backup

[root@master ~]#scp /backup/full-2022-10-24.sql 10.0.0.185:/backup #将备份的数据复制到从服务器上
[root@slave1 ~]#ls /backup #查看已复制完成
fullbackup_2022-10-24.sql
[root@slave1 ~]#vim /backup/full-2022-10-24.sql
CHANGE MASTER TO #在此行后添加下面4行
MASTER_HOST='10.0.0.184',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
:wq
[root@slave1 ~]#mysql
mysql> set sql_log_bin=0; #临时关闭二进制,防止复制数据时产生大量记录
mysql> source /backup/fullbackup_2022-10-24.sql #将数据导入从服务器
mysql> set sql_log_bin=1; #开启二进制
mysql> show databases; #查看确认数据已导入
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| sys |
| zabbix |
+--------------------+
#此时主从服务器还没有正是连接,主服务器添加数据,不会同步到从服务器
#在主服务器上插入一条数据
mysql> insert teachers (name,age,gender) values('wang',34,'M');
#在从服务器上查看没有此数据
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
#没有成功的原因是从服务器上的两个线程未开启
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 10.0.0.128
Master_User: REPLUSER
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 156
Relay_Log_File: slave1-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: No #线程关闭
Slave_SQL_Running: No #线程关闭
#此时只需要在从服务器上开启线程,即可实现主从复制
mysql> start slave; #开启线程
mysql> select * from teachers; #查看新数据已传送过来了
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | wang | 34 | M |
+-----+---------------+-----+--------+

2、主主复制

两个节点,都可以更新数据,并且互为主从

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
#前面已经将10.0.0.184设为主服务器了,10.0.0.185设为从服务器了
#现在只需也将10.0.0.184设置为10.0.0.185的从服务器即可

#先将10.0.0.185配置文件的设置read-only删除掉
#查看10.0.0.185现在的二进制文件位置
mysql> show master logs;
+---------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 | 459 | No |
+---------------+-----------+-----------+
#然后在10.0.0.184里面设置从10.0.0.185二进制什么位置进行复制
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.185',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='123456',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=156;
mysql> start slave; #启动线程
#此时已完成主主复制设置

#在10.0.0.184新增数据
mysql> insert teachers (name,age,gender) values('li',34,'M');
#在10.0.0.185可以看见新增的数据
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | wang | 34 | M |
| 6 | li | 34 | M |
+-----+---------------+-----+--------+
#在10.0.0.185新增数据
mysql> insert teachers (name,age,gender) values('sun',34,'M');
#在10.0.0.184可以看到新增的数据
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | wang | 34 | M |
| 6 | li | 34 | M |
| 7 | sun | 34 | M |
+-----+---------------+-----+--------+

#但需要注意的是两个服务器不能同时进行更改数据库,否则会产生冲突

3、半同步复制

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
#实现半同步主要依靠semisync包,mysql数据库自带的包,但需要在数据库里安装
[root@master ~]#rpm -ql mysql-server | grep semisync
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so

#主服务器配置
[root@master ~]#mysql
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> show plugins; #可以查看到插件已安装
[root@master ~]#vim /etc/my.cnf #修改配置文件
[mysqld]
server-id=184
rpl_semi_sync_master_enabled #开启此项设置
rpl_semi_sync_master_timeout=3000
:wq
[root@master ~]#systemctl restart mysqld
[root@master ~]#mysql
mysql> create user repluser@'10.0.0.%' identified by '123456'; #创建账号
mysql> grant replication slave on *.* to repluser@'10.0.0.%'; #将所有数据库的replication slave权限授予账号
[root@master ~]#mkdir /data #创建备份数据的目录
[root@master ~]#mysqldump -A -F --single-transaction --master-data > /data/all.sql #备份数据,all.sql自动生成,注意mysql8.0.26版本及以后版本--master-data更改为--source-data

#配置从服务器
[root@slave1 ~]#yum -y install mysql-server
[root@slave1 ~]#systemctl enable --now mysqld
[root@slave1 ~]#mkdir /data
[root@master ~]#scp /data/all.sql 10.0.0.185:/data
[root@slave1 ~]#mysql
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
[root@master ~]#vim /etc/my.cnf #修改配置文件
[mysqld]
server-id=185
read-only
rpl_semi_sync_slave_enabled #开启此项设置
:wq
[root@slave1 ~]#systemctl restart mysqld #或者可以进入mysql后输入mysql>SET GLOBAL rpl_semi_sync_slave_enabled=1; 临时修改变量
[root@slave1 ~]#vim /data/all.sql
CHANGE MASTER TO #在此行后添加下面4行
MASTER_HOST='10.0.0.184',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
:wq
[root@slave1 ~]#mysql < /data/all.sql
[root@slave1 ~]#mysql hellodb
mysql>start slave;

#此时实现了半同步复制

五、用mycat实现mysql的读写分离

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#先快速搭建mysql主从服务器
#主服务器
[root@master ~]#yum -y install mysql-server
[root@master ~]#systemctl enable --now mysqld
[root@master ~]#vim /etc/my.cnf #修改配置文件
[mysqld]
server-id=185
log-bin
:wq
[root@master ~]#systemctl restart mysqld #重新加载
[root@master ~]#mysql
mysql> create user repluser@'10.0.0.%' identified by '123456'; #创建账号
mysql> grant replication slave on *.* to repluser@'10.0.0.%'; #账号授权
[root@master ~]#mkdir /backup #创建备份目录
[root@master ~]#mysqldump -A -F --single-transaction --source-data > /backup/full-`date +%F`.sql #备份数据
[root@master ~]#ls /backup #查看是否备份成功
full-2022-10-25.sql




#从服务器
[root@slave ~]#yum -y install mysql-server
[root@slave ~]#systemctl enable --now mysqld
[root@slave ~]#vim /etc/my.cnf #修改配置文件
[mysqld]
server-id=186
read-only
:wq
[root@slave ~]#systemctl restart mysqld
[root@slave ~]#mkdir /backup #创建备份接受目录
[root@master ~]#scp /backup/full-2022-10-25.sql 10.0.0.186:/backup
#将备份数据复制到从服务器
[root@slave ~]#ls /backup #复制成功
full-2022-10-25.sql
[root@slave ~]#vim /backup/full-2022-10-25.sql #编辑备份数据
CHANGE MASTER TO #在此行后面添加后面四行
MASTER_HOST='10.0.0.185',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
:wq
[root@slave ~]#mysql < /backup/full-2022-10-25.sql #导入备份数据
[root@slave ~]#mysql
mysql> start slave; #开启线程

#此时主从复制已完成,下一步安装并启动mycat
[root@mycat-server ~]#mkdir /apps ; tar xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps #创建/apps目录,并将安装包解压至/apps目录
[root@mycat-server ~]#ls /apps/mycat/bin/ #可以看到mycat启动路径
dataMigrate.sh mycat startup_nowrap.sh wrapper-linux-x86-32
init_zk_data.sh rehash.sh wrapper-linux-ppc-64 wrapper-linux-x86-64
#为了不输入路径也能启动mycat,将mycat启动路径写入PATH
[root@mycat-server ~]#vi /etc/profile.d/mycat.sh
PATH=/apps/mycat/bin:$PATH
:wq
[root@mycat-server ~]#. /etc/profile.d/mycat.sh #运行脚本
#因为mycat需要用到java,所以需要安装Java(占空间大),将虚拟机内存调到3G
[root@mycat-server ~]#free -h #查看内存是否更改成功
total used free shared buff/cache available
Mem: 2.7Gi 275Mi 2.2Gi 9.0Mi 303Mi 2.3Gi
Swap: 2.0Gi 0B 2.0Gi
[root@mycat-server ~]#yum -y install java #安装java
#可以看到打开多个端口,其中8066端口用于连接MyCAT
[root@mycat-server ~]#ss -ntlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=956,fd=4))
LISTEN 0 1 127.0.0.1:32000 0.0.0.0:* users:(("java",pid=24596,fd=4))
LISTEN 0 50 *:38695 *:* users:(("java",pid=24596,fd=66))
LISTEN 0 100 *:9066 *:* users:(("java",pid=24596,fd=87))
LISTEN 0 50 *:35117 *:* users:(("java",pid=24596,fd=68))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=956,fd=6))
LISTEN 0 50 *:1984 *:* users:(("java",pid=24596,fd=67))
LISTEN 0 100 *:8066 *:* users:(("java",pid=24596,fd=91))
#查看日志,确认mycat是否启动成功
[root@mycat-server ~]#tail /apps/mycat/logs/wrapper.log
INFO | jvm 1 | 2022/10/25 09:42:33 | MyCAT Server startup successfully. see logs in logs/mycat.log #startup successfully:启动成功

#客户端配置
[root@Centos7 ~]#yum -y install mariadb #安装数据库
[root@Centos7 ~]#mysql -uroot -p123456 -h10.0.0.184 -P8066 #用户root,密码123456是mycat自己自动生成的账号密码(/apps/mycat/conf/server.xml可以在这修改账号密码)
MySQL [(none)]> show databases; #此时只有一个测试数据库(虚拟的)
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+

#正常情况下mysql端口号是3306,我们可以把mycat的端口号改为3306
[root@mycat-server ~]#mycat stop
[root@mycat-server ~]#vim /apps/mycat/conf/server.xml
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务,2为不过滤>分布式事务,但是记录分布式事务日志-->
<property name="serverPort">3306</property> <property name="managerPort">9066</property> #添加此行

#为了让客户端通过mycat可以连接到真正的数据库,需要将数据库映射到mycat的测试数据库。
#在mysql上创建mycat可以连接到mysql的账号密码
[root@master ~]#mysql
mysql> create user admin@'10.0.0.%' identified by '123456';
#创建账号密码,此账号主要是用于mycat,可以指定具体地址(不用网段)
mysql> grant all on hellodb.* to admin@'10.0.0.%';
#给账号授权,只想让mycat有访问hellodb的权限

#在mycat上添加mysql新建的账号
[root@mycat-server ~]#vim /apps/mycat/conf/schema.xml
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"
dataNode="dn1"> #将原单词改为false
<dataNode name="dn1" dataHost="localhost1" database="hellodb" /> #将原数据库改为hellodb
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" #将balance=0改为=1
 writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="host1" url="10.0.0.18:3306" user="root" password="123456">
<readHost host="host2" url="10.0.0.28:3306" user="root" password="123456" />
#添加主从服务器地址账号密码
:wq
#上面配置中,balance改为1,表示读写分离。以上配置达到的效果就是10.0.0.18为主库,10.0.0.28为从库

#修改完成后再重新启动mycat
[root@Rocky ~]#mycat start
[root@Rocky ~]#tail /apps/mycat/logs/wrapper.log
INFO | jvm 1 | 2022/10/25 11:22:40 | MyCAT Server startup successfully. see logs in logs/mycat.log

#此时客户端可以通过mycat访问数据库中的hellodb
[root@Centos7 ~]#mysql -uroot -p123456 -h10.0.0.184 #已经将端口号改为默认端口号3306了,不用在输入了
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
MySQL [(none)]> use TESTDB
MySQL [TESTDB]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| toc |
+-------------------+
#已经可以看到数据库里的内容了

六、实现openvpn部署,并且测试通过,输出博客或者自己的文档存档

image-20221027083130582

1、阿里云网络配置

①配置参数

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
1 阿里云创建专有网络
指定城市和可用区:华北3张家口可用区A区
网段名magedu-net1和地址段172.16.0.0/12,默认资源组
交换机名magedu-net1-n68 可用区A IPv4的地址段 172.30.0.0/24
安全组开放22端口
2 创建OpenVPN服务器有公网IP的实例1
指定城市和可用区:华北3张家口可用区A区
共享型s6 2vCPU 4G
网络:magedu-net1 交换机:magedu-net1-n68
公网IP 私网IP172.30.0.1/24 按量收费 100M
默认安全组 默认配置 22,3389,icmp
Rocky Linux 8.6
系统盘 SSD云盘40G
3 创建局域网的服务器无公网IP的实例2
按量付费
指定城市和可用区:华北3张家口可用区A区
共享型 1vCPU2G
Rocky Linux 8.6
系统盘 ESSD云盘40G
网络:magedu-net1 magedu-net1-n68
无公网IP 私网IP172.30.0.100/24 172.30.0.200/24
默认安全组
主网卡magedu-net1-n68
4 重设所有实例密码
5 修改安全组打开 1194/TCP/UDP

②验证主机配置

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
[root@Rocky ~]#ssh 47.92.232.42                   #公网地址
The authenticity of host '47.92.232.42 (47.92.232.42)' can't be established.
ECDSA key fingerprint is SHA256:Bzrhb3djhiGwPo8sjkwu7loauam5plaqO9YlG2eyjE4.
Welcome to Alibaba Cloud Elastic Compute Service !
Activate the web console with: systemctl enable --now cockpit.socket

[root@openvpn-server ~]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:16:3e:21:bc:7f brd ff:ff:ff:ff:ff:ff
inet 172.30.0.1/24 brd 172.30.0.255 scope global dynamic noprefixroute eth0

[root@openvpn-server ~]# ssh 172.30.0.100
root@172.30.0.100's password:
Welcome to Alibaba Cloud Elastic Compute Service !
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Thu Oct 27 09:33:58 2022 from 172.30.0.1
[root@web01 ~]# hostname -I
172.30.0.100

[root@web01 ~]# ssh 172.30.0.200
root@172.30.0.200's password:
Welcome to Alibaba Cloud Elastic Compute Service !
Activate the web console with: systemctl enable --now cockpit.socket
[root@web02 ~]# hostname -I
172.30.0.200

③安装httpd

1
2
3
[root@web02 ~]# yum -y install httpd;systemctl enable --now httpd;hostname > /var/www/html/index.html

#安装完后外部直接连接,查看网页打不开,需要openVPN的配置

2、安装openvpn

①查看及安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
需要用到两个软件  openVPN和easy-rsa(openVPN系统自带,easy-rsa不自带需要配置epel源)
[root@openvpn-server ~]# yum list openvpn
Last metadata expiration check: 0:01:14 ago on Thu 27 Oct 2022 10:06:06 AM CST.
Available Packages
openvpn.x86_64 2.4.12-1.el8 epel
[root@openvpn-server ~]# yum list easy-rsa
Last metadata expiration check: 0:06:25 ago on Thu 27 Oct 2022 09:52:01 AM CST.
Error: No matching Packages to list

#配置epel源
[root@openvpn-server ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@openvpn-server ~]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@openvpn-server ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

#安装两个软件
[root@openvpn-server ~]# yum -y install easy-rsa #证书管理软件
[root@openvpn-server ~]# yum -y install openvpn #openvpn服务器端

②准备相关配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#生成服务器配置文件
[root@openvpn-server easy-rsa]# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/
[root@openvpn-server easy-rsa]# cd /etc/openvpn
[root@openvpn-server openvpn]# ls
certs client server server.conf

#准备证书颁发相关文件
[root@openvpn-server ~]# mkdir -p /data/easy-rsa; cp -r /usr/share/easy-rsa/3/* /data/easy-rsa #将/usr/share/easy-rsa/3/里面的文件复制到/data/easy-rsa
[root@openvpn-server ~]# ls /data/easy-rsa #查看复制结果
easyrsa openssl-easyrsa.cnf x509-types
#准备颁发证书相关变量的配置文件
[root@openvpn-server ~]#cp /usr/share/doc/easy-rsa/vars.example /data/easy-rsa/vars
[root@openvpn-server ~]# cd /data/easy-rsa
[root@openvpn-server easy-rsa]# ls
easyrsa openssl-easyrsa.cnf vars x509-types

#修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长
[root@openvpn-server easy-rsa]# vim vars
set_var EASYRSA_CA_EXPIRE 36500 #CA的证书有效期
set_var EASYRSA_CA_EXPIRE 36500 #此次是指的openvpn的有效期,后面再配置客户端(用户)的有效期

3、准备证书相关文件

①初始化PKI生成PK相关目录和文件

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
[root@openvpn-server ~]# cd /data/easy-rsa
[root@openvpn-server easy-rsa]# ./easyrsa init-pki
Note: using Easy-RSA configuration from: /data/easy-rsa/vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /data/easy-rsa/pki
[root@openvpn-server easy-rsa]# tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│   ├── openssl-easyrsa.cnf
│   ├── private
│   ├── reqs
│   └── safessl-easyrsa.cnf
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── email
├── kdc
├── server
└── serverClient

②创建CA机构环境

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
#给CA颁发证书(自签名证书)
[root@openvpn-server ~]# cd /data/easy-rsa
[root@openvpn-server easy-rsa]# ./easyrsa build-ca nopass
#nopass表示生成的私钥没有设置密码,生产中要设置
[root@openvpn-server easy-rsa]# tree #生成了ca.crt文件和其他文件
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│   ├── ca.crt #CA的证书
│   ├── certs_by_serial
│   ├── index.txt #颁发证书生成的索引信息
│   ├── index.txt.attr
│   ├── issued
│   ├── openssl-easyrsa.cnf
│   ├── private
│   │   └── ca.key
│   ├── renewed
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── reqs
│   ├── revoked
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── safessl-easyrsa.cnf
│   └── serial
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── email
├── kdc
├── server
└── serverClient

③创建openVPN服务器证书申请

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
#创建服务器证书申请文件,其中server是文件前缀
[root@openvpn-server ~]# cd /data/easy-rsa
[root@openvpn-server easy-rsa]# ./easyrsa gen-req server nopass
Keypair and certificate request completed. Your files are:
req: /data/easy-rsa/pki/reqs/server.req #证书申请文件
key: /data/easy-rsa/pki/private/server.key #私钥文件
[root@openvpn-server easy-rsa]# tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│   ├── ca.crt
│   ├── certs_by_serial
│   ├── index.txt
│   ├── index.txt.attr
│   ├── issued
│   ├── openssl-easyrsa.cnf
│   ├── private
│   │   ├── ca.key
│   │   └── server.key #此时新增了私钥文件
│   ├── renewed
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── reqs
│   │   └── server.req #新增了证书申请文件
│   ├── revoked
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── safessl-easyrsa.cnf
│   └── serial
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── email
├── kdc
├── server
└── serverClient

④给openVPN服务器颁发证书

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
[root@openvpn-server ~]# cd /data/easy-rsa
#第一个server表示证书的类型,第二个server表示请求文件名的前缀
[root@openvpn-server easy-rsa]# ./easyrsa sign server server
Certificate created at: /data/easy-rsa/pki/issued/server.crt
[root@openvpn-server easy-rsa]# tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│   ├── ca.crt
│   ├── certs_by_serial
│   │   └── 746A3EC66A04B10F5BEAABC519143A3F.pem #颁发证书的备份文件
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── issued
│   │   └── server.crt #给服务器颁发的证书
│   ├── openssl-easyrsa.cnf
│   ├── private
│   │   ├── ca.key
│   │   └── server.key
│   ├── renewed
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── reqs
│   │   └── server.req
│   ├── revoked
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── safessl-easyrsa.cnf
│   ├── serial
│   └── serial.old
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── email
├── kdc
├── server
└── serverClient

⑤创建Diffie-Hellman密钥

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
[root@openvpn-server ~]# cd /data/easy-rsa
[root@openvpn-server easy-rsa]# ./easyrsa gen-dh
DH parameters of size 2048 created at /data/easy-rsa/pki/dh.pem
[root@openvpn-server easy-rsa]# tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│   ├── ca.crt
│   ├── certs_by_serial
│   │   └── 746A3EC66A04B10F5BEAABC519143A3F.pem
│   ├── dh.pem #生成的加密文件
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── issued
│   │   └── server.crt
│   ├── openssl-easyrsa.cnf
│   ├── private
│   │   ├── ca.key
│   │   └── server.key
│   ├── renewed
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── reqs
│   │   └── server.req
│   ├── revoked
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── safessl-easyrsa.cnf
│   ├── serial
│   └── serial.old
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── email
├── kdc
├── server
└── serverClient

⑥创建客户端证书申请

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
#为了快捷,目录仍使用服务器端目录(正常最好设置客户端目录,进行区分)
[root@openvpn-server ~]# cd /data/easy-rsa
[root@openvpn-server easy-rsa]# ./easyrsa gen-req magekecheng nopass
req: /data/easy-rsa/pki/reqs/magekecheng.req
key: /data/easy-rsa/pki/private/magekecheng.key
[root@openvpn-server easy-rsa]# tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│   ├── ca.crt
│   ├── certs_by_serial
│   │   └── 746A3EC66A04B10F5BEAABC519143A3F.pem
│   ├── dh.pem
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── issued
│   │   └── server.crt
│   ├── openssl-easyrsa.cnf
│   ├── private
│   │   ├── ca.key
│   │   ├── magekecheng.key
│   │   └── server.key
│   ├── renewed
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── reqs
│   │   ├── magekecheng.req
│   │   └── server.req
│   ├── revoked
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── safessl-easyrsa.cnf
│   ├── serial
│   └── serial.old
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── email
├── kdc
├── server
└── serverClient

⑦给客户端颁发证书

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
#一般用户的证书有效期为3-6个月,所以在颁发证书前,需要设置有效期
[root@openvpn-server ~]# cd /data/easy-rsa
[root@openvpn-server easy-rsa]# vim vars
set_var EASYRSA_CERT_EXPIRE 180 #时间有效期180天
[root@openvpn-server easy-rsa]# ./easyrsa sign client magekecheng
Certificate created at: /data/easy-rsa/pki/issued/magekecheng.crt #客户的证书
[root@openvpn-server easy-rsa]# tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│   ├── ca.crt
│   ├── certs_by_serial
│   │   ├── 746A3EC66A04B10F5BEAABC519143A3F.pem
│   │   └── 998A52A40FE7B270749799A0A0F968A2.pem
│   ├── dh.pem
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── issued
│   │   ├── magekecheng.crt #客户端的证书
│   │   └── server.crt
│   ├── openssl-easyrsa.cnf
│   ├── private
│   │   ├── ca.key
│   │   ├── magekecheng.key
│   │   └── server.key
│   ├── renewed
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── reqs
│   │   ├── magekecheng.req
│   │   └── server.req
│   ├── revoked
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── safessl-easyrsa.cnf
│   ├── serial
│   └── serial.old
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── email
├── kdc
├── server
└── serverClient

⑧将CA和服务器证书相关文件复制到服务器相应的目录

1
2
3
4
[root@openvpn-server easy-rsa]# mkdir /etc/openvpn/certs
[root@openvpn-server easy-rsa]# cp pki/ca.crt pki/dh.pem pki/issued/server.crt pki/private/server.key /etc/openvpn/certs #将四个文件拷贝到/etc/openvpn/certs
[root@openvpn-server easy-rsa]# ls /etc/openvpn/certs
ca.crt dh.pem server.crt server.key

⑨将客户端私钥与证书相关文件复制到服务器相关的目录

1
2
3
4
5
[root@openvpn-server easy-rsa]# mkdir /etc/openvpn/client/magekecheng/
[root@openvpn-server easy-rsa]# cp pki/ca.crt pki/issued/magekecheng.crt pki/private/magekecheng.key /etc/openvpn/client/magekecheng/
#将三个文件拷贝到/etc/openvpn/client/magekecheng/
[root@openvpn-server easy-rsa]# ls /etc/openvpn/client/magekecheng/
ca.crt magekecheng.crt magekecheng.key

4、修改OpenVPN服务器配置文件

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@openvpn-server openvpn]# vim /etc/openvpn/server.conf
port 1194 #注意阿里云openVPN设置有防火墙,需要在阿里云的安全组里添加允许1194端口访问,设置如下图
proto tcp #此处也可是是udp,但tcp协议更安全稳定
dev tun #openVPN会自动生成一个网卡,设备名叫tun
ca /etc/openvpn/certs/ca.crt #CA证书的存放路径
cert /etc/openvpn/certs/server.crt #服务器证书的存放路径
key /etc/openvpn/certs/server.key #私钥文件路径
dh /etc/openvpn/certs/dh.pem
server 10.8.0.0 255.255.255.0 #这个是客户连通openVPN后,openVPN分配给客户的地址段,到时候客户端会分配一个10.8.0.X/24的地址,openVPN会给自己tun 10.8.0.1/24这个地址
push "route 172.30.0.0 255.255.255.0" #推送路由到客户端,只要访问这个地址段,就需要走vpn
keepalive 10 120
cipher AES-256-CBC #加密算法
compress lz4-v2 #压缩
push "compress lz4-v2"
max-clients 2048 #设置最大允许连接数为2048
user openvpn #安装openVPN包时自动创建了openVPN用户和组
group openvpn
status /var/log/openvpn/openvpn-status.log #日志存放位置,需创建目录
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
:wq
[root@openvpn-server openvpn]# mkdir /var/log/openvpn
[root@openvpn-server ~]# chown openvpn.openvpn /var/log/openvpn
[root@openvpn-server ~]# ll -d /var/log/openvpn
drwxr-xr-x 2 openvpn openvpn 6 Oct 27 12:50 /var/log/openvpn

image-20221027123428505

5、启动openvpn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#centos7及以前版本包含openvpn的server文件,但新版本没有,需要自己添加此文件
[root@openvpn-server ~]# vim /usr/lib/systemd/system/openvpn@.service #新建并编辑
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target

[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf

[Install]
WantedBy=multi-user.target
:wq
[root@openvpn-server openvpn]# systemctl daemon-reload
[root@openvpn-server openvpn]# systemctl enable --now openvpn@server

6、准备OpenVPN客户端配置文件

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
[root@openvpn-server openvpn]# vim /etc/openvpn/client/magekecheng/client.ovpn
client
dev tun
proto tcp
remote 47.92.232.42  1194 #openvpn的公网地址或者FQDN
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert magekecheng.crt
key magekecheng.key
remote-cert-tls server
#tls-auth ta.key 1
cipher AES-256-CBC
verb 3 #此值不能随意指定,否则无法通信,需与服务器端相同
compress lz4-v2 #此项在OpenVPN2.4.X版本使用,需要和服务器端保持一致,如不指定,默认使用
comp-lz压缩
:wq
[root@openvpn-server openvpn]# cd /etc/openvpn/client/magekecheng
[root@openvpn-server magekecheng]# ls
ca.crt client.ovpn magekecheng.crt magekecheng.key
[root@openvpn-server magekecheng]# zip /root/magekecheng.zip * #将目录下的所有文件压缩到/root/magekecheng.zip
[root@openvpn-server magekecheng]# yum -y install lrzsz #安装软件包
[root@openvpn-server magekecheng]# sz /root/magekecheng.zip #将压缩包下载到电脑上

7、实现OpenVPN客户端

7.1、Windows配置部署OpenVPN客户端

官方客户端下载地址:

https://openvpn.net/community-downloads/

openvpn客户端安装过程:

image-20221027141414474

image-20221027141534917

image-20221027141816078

将下载的压缩包解压到此目录下

image-20221027142041109

image-20221027145850212

连接成功后,电脑自动获取地址(10.8.0.6)

image-20221027150107527

此时openvpn服务器也获取一个地址

1
2
3
4
5
6
7
8
9
10
11
[root@openvpn-server magekecheng]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:16:3e:21:bc:7f brd ff:ff:ff:ff:ff:ff
inet 172.30.0.1/24 brd 172.30.0.255 scope global dynamic noprefixroute eth0
valid_lft 315339583sec preferred_lft 315339583sec
inet6 fe80::216:3eff:fe21:bc7f/64 scope link
valid_lft forever preferred_lft forever
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft forever

此时电脑就可以直接连接openvpn了

image-20221027150556332

8、实现访问VPN服务器的内网主机

但需要注意的是此时仍无法连接到openvpn后面的机器

image-20221027152041768

因为openvpn接收到请求后发现地址不是自己,就把请求扔掉了,所以需要设置防火墙

1
2
3
4
#在服务器开启ip_forward转发功能
[root@openvpn-server magekecheng]#echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@openvpn-server magekecheng]#sysctl -p
net.ipv4.ip_forward = 1

此时仍是ping不同,但是后面的地址收到请求,也回应了

image-20221027152437962

此时ping不通,是因为双方的ip不在一个网段,回应时走的路由器(网关172.30.0.253),但路由器找不到地址

1
2
3
4
5
[root@web01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.30.0.253 0.0.0.0 UG 100 0 0 eth0
172.30.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

解决此问题的方法:①在web01机器上添加到10.8.0.0/24网段的路由

1
2
#在内网每个主机上添加路由(阿里云服务器不支持修改路由)
[root@web01 ~]#route add -net 10.8.0.0/24 gw 172.30.0.1

②在OpenVPN服务器配置iptables规则

1
2
3
4
5
6
7
8
9
10
11
[root@openvpn-server magekecheng]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source 172.30.0.1
[root@openvpn-server magekecheng]# iptables -t nat -vnL #查看添加的规则
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT all -- * * 10.8.0.0/24 !10.8.0.0/24 to:172.30.0.1
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

此时就可以ping通了,直接访问网页了

image-20221027154741748

image-20221027154850834


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!