# 统信UCP运维工程师
**Repository Path**: jason-hue/ucp
## Basic Information
- **Project Name**: 统信UCP运维工程师
- **Description**: 2023年睿抗信创大赛—国产操作系统赛道资料
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 6
- **Created**: 2024-05-11
- **Last Updated**: 2024-05-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 一、apache
## 1.5 虚拟web主机项目实战
### 配置基于端口的虚拟主机
```shell
sudo apt install apache2 -y
a2enmod ssl rewrite
systemctl start apache
systemctl enable apache2
sudo gedit /etc/apache2/apache2.conf
ServerName 192.168.43.46 # 添加此行
sudo systemctl restart apache2
# 浏览器访问 192.168.43.46 成功
sudo mkdir /var/www/8899 # 创建网页目录
echo 8899 | sudo tee /var/www/8899/index.html # 使用 sudo 权限将输出内容 8899 重定向到 index.html 文件中
sudo gedit /etc/apache2/sites-enabled/vhosts.conf # 修改配置文件, 192.168.43.46是本机ip
Listen 8899
ServerName 192.168.43.46
DocumentRoot /var/www/8899
systemctl restart apache2
systemctl status apache2.service
# 直接访问 http://192.168.43.46:8899/
```
### 配置基于域名的web虚拟主机
创建测试页面:
```shell
sudo mkdir /var/www/uos1
sudo mkdir /var/www/uos2
echo uos1 | sudo tee /var/www/uos1/index.html
echo uos2 | sudo tee /var/www/uos2/index.html
# 修改主配置文件 vhosts.conf
sudo gedit /etc/apache2/sites-enabled/vhosts.conf
ServerName www.uos1.com
DocumentRoot /var/www/uos1
ServerName www.uos2.com
DocumentRoot /var/www/uos2
# 重启apache服务
systemctl restart apache2
# 修改host映射文件,192.168.43.46为本机ip地址
sudo gedit /etc/hosts
# 配置基于域名的web虚拟主机
192.168.43.46 www.uos1.com www.uos2.com
curl http://www.uos1.com/
curl http://www.uos2.com/
```
### 配置基于IP的虚拟主机
添加一块网卡并设置其ip为192.168.200.202/24 (假设网卡设备名为ens36)
```shell
ip link show
# 创建虚拟网卡
sudo ip link add uos1 type veth
sudo ip link set uos1 up
sudo ip addr add 192.168.200.202/24 dev uos1
# 修改apache配置文件
sudo gedit /etc/apache2/sites-enabled/vhosts.conf
ServerName www.uos1.com
DocumentRoot /var/www/uos1
ServerName www.uos2.com
DocumentRoot /var/www/uos2
# 重启apache服务
systemctl restart apache2
# 修改host映射文件,192.168.43.46为本机虚拟网卡的地址
sudo gedit /etc/hosts
# 配置基于IP的虚拟主机
192.168.43.46 www.uos1.com
192.168.200.202 www.uos2.com
# 访问网址
curl http://192.168.43.46
curl http://192.168.200.202
```
### alias
web网站别名配置是被经常使用的一个特性。这个功能实际上是为站点URI定义一个路径映射关系
还原uos1到基于域名的web虚拟主机
```shell
sudo mkdir /alias
echo alias | sudo tee /alias/index.html
# 修改apache配置文件
sudo gedit /etc/apache2/sites-enabled/vhosts.conf
ServerName www.uos1.com
DocumentRoot /var/www/uos
Alias /net /alias
AllowOverride none
Require all granted
# 修改host映射文件,192.168.43.46为本机ip地址
sudo gedit /etc/hosts
# alias
192.168.43.46 www.uos1.com
# 重启apache服务
systemctl restart apache2
# 访问网址
curl http://www.uos1.com/net/index.html # 输出alias
```
## 1.6 动态网站
### 1.动态网站概述
最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html。事物总是不断发展,网站也越来越复杂,所以出现动态技术。但是服务器并不能直接运行php,asp这样的文件,自己不能做,外包给别人吧,但是要与第三方做个约定,我给你什么,然后你给我什么,就是握把请求参数发送给你,然后我接收你的处理结果给客户端。那这个约定就是common gateway interface,简称cgi
### 2.创建不同类型的脚本
在名为uos1的机器上面
```shell
sudo mkdir /var/www/cgi-bin # 创建脚本目录
# 编写shell脚本
sudo gedit /var/www/cgi-bin/shell.sh
#! /bin/zsh
echo -en "Content-Type: text/html; charset=UTF-8\n\n";
date +%c
sudo chmod +x /var/www/cgi-bin/shell.sh
# 编写perl脚本
sudo gedit /var/www/cgi-bin/perl.pl
#! /usr/bin/perl
print "Content-Type: text/html; charset=UTF-8\n\n";
$now=localtime();
print "$now\n";
sudo chmod +x /var/www/cgi-bin/perl.pl
sudo apt-get install libapache2-mod-wsgi -y
# 编写python脚本
sudo gedit /var/www/cgi-bin/python.py
import time
def application (environ, start_response):
response_body ='UNIX EPOCH time is now: %s\n'%time.time()
status ='200 OK'
response_headers = [('Content-Type','text/plain'), ('Content-Length','1'), ('Content-Length',str(len(response_body)))]
start_response(status,response_headers)
return [response_body]
```
### 3. 添加apache配置文件
```shell
sudo gedit /etc/apache2/sites-enabled/vhosts.conf
ServerName www.uos1.com
DocumentRoot /var/www/uos1
ScriptAlias /jiaoben /var/www/cgi-bin
WSGIScriptAlias /python /var/www/cgi-bin
sudo cp /etc/apache2/mods-available/cgi.* /etc/apache2/mods-enabled/
systemctl restart apache2
# 验证,输出为:Sat May 20 23:28:43 2023
curl http://www.uos1.com/jiaoben/shell.sh
curl http://www.uos1.com/jiaoben/perl.pl
curl http://www.uos1.com/python/python.py # UNIX EPOCH time is now: 1684596553.05
```
## 1.7 部署discuz!论坛
### LAMP
LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:
* Linux,操作系统
* Apache,网页服务器
* MariaDB或MySQL,数据库管理系统(或者数据库服务器)
* PHP、Perl或Python,脚本语言
### 安装测试LAMP环境
```shell
# 安装环境
apt install -y php-fpm php-mysql mariadb-server mariadb-client php-fpm libapache2-mod-php php-mysql
# 启动php
systemctl restart php7.3-fpm
systemctl enable php7.3-fpm
systemctl restart mariadb
systemctl enable mariadb
#创建php测试页
echo "" | sudo tee /var/www/html/index.php
# 客户端访问验证
curl http://192.168.43.46/index.php
```
### 部署discuz
```shell
sudo apt install php-xml -y #discuz函数需要PHP支持XML
cd /var/www/html
# 论坛下载地址(链接:https://pan.baidu.com/s/1S8Sv2JZRK1Yr0La4tEfoPA 热取码:ujdn)
sudo unzip Discuz_X3.4.zip
sudo cp -r upload/* .
sudo chown www-data:www-data -R /var/www/html/
sudo gedit /etc/apache2/sites-enabled/vhosts.conf
ServerName 192.168.43.46
DocumentRoot /var/www/html
# 为数据库设置密码
sudo mysqladmin -u root password '200128jk'
sudo gedit /etc/mysql/mariadb.conf.d/50-server.cnf
# bind-address=127.0.0.1 将此行注释
# 重启服务
systemctl restart mariadb.service
systemctl restart apache2
# 访问,将数据库和管理员密码都设置为 200128jk
http://192.168.43.46/index.php
```
# 二、nginx
## 2.6 nginx虚拟主机
### (1) 基于域名:
进入/etc/nginx,编辑主配置文件nginx.conf:
```shell
# 杀掉apache的服务,因为apache占用80端口
systemctl stop apache2
sudo apt install nginx -y
systemctl start nginx
systemctl enable nginx
sudo gedit /etc/nginx/nginx.conf
```
这一行屏蔽:
```shell
#include/etc/nginx/sites-enabled/*;#默认nginx读取此文件配置
```
在http{}下配置
```sh
# 基于域名
server{
listen 80;
server_name www.uos1.com; #设置域名为www.uos1.com
location / {
index index.html;
root /var/www/html/uos1/;
}
}
server {
listen 80;
server_name www.uos2.com; #设置域名为www.uos2.com
location / {
index index.html;
root /var/www/html/uos2/;
}
}
```
**说明:**
* listen 为监听的端口,本例中监听80端口
* server_name 即指定的虚拟主机名
* location / 表示匹配这个主机名下的所有请求
* index 指主页的文件名
* root 为网站根目录在系统中的实际位置
```shell
# 更改hosts文件
sudo gedit /etc/hosts
# 配置基于域名的web虚拟主机
192.168.43.46 www.uos1.com www.uos2.com
# 配置root目录和index文件
sudo mkdir /var/www/html/uos1 /var/www/html/uos2
cd /var/www/html/uos1 && echo "uos1" | sudo tee index.html
cd /var/www/html/uos2 && echo "uos2" | sudo tee index.html
#重启nginx服务
systemctl restart nginx
# 访问
curl www.uos1.com
curl www.uos2.com
```
### (2) 基于端口:
```shell
# 进入/etc/nginx,编辑主配置文件nginx.conf:
sudo gedit /etc/nginx/nginx.conf
# 这一行屏蔽:
#include/etc/nginx/sites-enabled,/*;#默认nginx读取此文件配置
#在http{}下配置
# 配置基于端口的虚拟主机
server{
listen 80;
server_name www.uos1.com; #设置域名为www.uos1.com
location / {
index index.html;
root /var/www/html/uos1/;
}
}
server{
listen 80;
server_name www.uos2.com; #设置域名为www.uos2.com
location / {
index index.html;
root /var/www/html/uos2/;
}
}
server{
listen 8080;
server_name www.uos2.com; #设置域名为www.uos2.com
location / {
index index.html;
root /var/www/html/uos3/;
}
}
# 更改hosts文件
sudo gedit /etc/hosts
# 配置基于端口的虚拟主机
www.uos1.com 192.168.43.46
www.uos2.com 192.168.43.46
# 配置root目录和index文件
sudo mkdir /var/www/html/uos1 /var/www/html/uos2 /var/www/html/uos3
cd /var/www/html/uos1 && echo "uos1" | sudo tee index.html
cd /var/www/html/uos2 && echo "uos2" | sudo tee index.html
cd /var/www/html/uos3 && echo "uos3" | sudo tee index.html
#重启nginx服务
systemctl restart nginx
# 访问
curl www.uos2.com:8080
```
### (3) 基于IP:
```shell
# 增加一个IP地址
sudo ip link add uos2 type veth
sudo ip link set uos2 up
sudo ip addr add 192.168.200.201/24 dev uos2
# 进入/etc/nginx,编辑主配置文件nginx.conf:
sudo gedit /etc/nginx/nginx.conf
# 这一行屏蔽:
#include/etc/nginx,/sites-enabled,/水;#默认nginx读取此文件配置
# 在http{}下配置
# 配置基于IP的虚拟主机
server{
listen 80;
server_name 192.168.200.201;
location / {
index index.html;
root /var/www/html/uos1/;
}
}
server{
listen 80;
server_name 192.168.200.202;
location / {
index index.html;
root /var/www/html/uos2/;
}
}
# 配置root目录和index文件
mkdir /var/www/html/uos1 /var/www/html/uos2
cd /var/www/html/uos1 && echo "uos1" > index.html
cd /var/www/html/uos2 && echo "uos2" > index.html
#重启nginx服务
systemctl restart nginx
# 访问
curl 192.168.200.201
curl 192.168.200.202
```
## **2.7 rewrite功能模块**
### **实例:访问uos.com网站自动跳转到www.uos.com**
```shell
# 安装nginx服务
sudo apt install nginx -y
# 进入/etc/nginx,编辑主配置文件nginx.conf:
sudo gedit /etc/nginx/nginx.conf
# 访问uos.com网站自动跳转到www.uos.com
server{
listen 80;
server_name uos.com;
rewrite ^/(.*) http://www.uos.com/$1 permanent;
}
server{
listen 80;
server_name www.uos.com;
location / {
root /var/www/html/uos;
index index.html;
}
}
# 目录与index
mkdir /var/www/html/uos
echo "uos" > /var/www/html/uos/index.html
# 配置域名解析
sudo gedit /etc/hosts #编辑hosts文件
192.168.43.46 www.uos.com
# 重启nginx
systemctl restart nginx
# 访问uos.com网站自动跳转到www.uos.com
curl www.uos.com
```
### **实例:将url请求的文件重定向到uos/目录中去寻找**
```shell
# 在uos(192.168.43.46)中:
sudo apt install nginx # 安装nginx服务
# 进入/etc/nginx,编辑主配置文件nginx.conf:
sudo gedit /etc/nginx/nginx.conf
# 将url请求的文件重定向到uos/目录中去
server{
listen 80;
server_name www.uos.com;
root /var/www/html;
index index.html;
if($request_uri !~'^/uos/')
{
rewrite /(.*) /uos/$1 redirect;
}
}
# 配置root月录与index
mkdir /var/www/html/uos
echo "uos" > /var/www/html/index.html
echo "uos1" > /var/www/html/uos/index.html
# 配置域名解析
sudo gedit /etc/hosts #编辑hosts文件
192.168.43.46 www.uos.com
# 重启nginx
systemctl restart nginx
# 访问www.uos.com自动跳转到www.uos.com/uos
curl www.uos.com
```
### 实例:配置防盗链避免别的网站引用ww.uos.com不想被引用的图片等文件
**盗链:**
referer是记录打开一个页面之前记录是从哪个页面跳转过来的,**如果别人只链接了自己网站图片或某个单独的资源,而不是网站的页面,这就是盗链**,referer就是之前的那个网站域名
```shell
# 在uos(192.168.43.46)中:
apt install nginx #安装nginx服务
# 进入/etc/nginx,编辑主配置文件nginx.conf:
# 配置防盗链
sudo gedit /etc/nginx/nginx.conf
server{
listen 80;
server_name www.uos.com;
root /var/www/html;
location ~*^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$ {
valid_referers none blocked server_names *.uos.com;
if ($invalid_referer)
{
return 403;
}
}
}
# valid_referers: 白名单
# invalid_referer: 无效的(未在白名单中定义的)
# none: 允许referer为空(也就是允许直接访问,未从其他站点跳转的请求)
# blocked: 允许来源地址不含http/https
mkdir /var/www/html/uos
# 下载一张图片abc.jpg,并放在/var/www/html/uos下
#编辑hosts文件
sudo gedit /etc/hosts
192.168.43.46 www.uos.com
systemctl restart nginx
# ------------------------------------------------
# 在server2(192.168.0.2)中:
apt install nginx -y
systemctl restart nginx
systemctl enable nginx
mv /var/www/html/index.nginx-debian.html /var/www/html/index.html
# 修改网页文件,加入server1中的图片
sudo gedit /var/www/html/index.html
hello,world
# 编辑hosts文件
sudo gedit /etc/hosts
192.168.43.46 www.uos.com
# 访问 /var/www/html/index.html 图片无法查看,防盗链生效。
```
# 三、DNS域名服务
## 3.3 项目实战
### 1.根据企业需求完成多个域名的解析服务
参考本章所有内容,完成uos.com域名的配置
* 配置A记录
www.uos.com 192.168.43.46
exam.uos.com 192.168.43.47
mail.uos.com 192.168.43.48
* 配置CNAME记录
www.uos.cn 指向 www.uos.com
* 配置客户端,能够正常解析到所配的域名
```sh
apt install bind9 -y
# 编辑 DNS 解析配置文件
gedit /etc/bind/named.conf.local
zone "uos.com" {
type master;
file "/etc/bind/db.uos.com";
};
zone "uos.cn" {
type master;
file "/etc/bind/db.uos.cn";
};
# 创建域名解析文件 /etc/bind/db.uos.com,并添加以下内容
cp /etc/bind/db.local /etc/bind/db.uos.com
gedit /etc/bind/db.uos.com
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA uos.com. root.uos.com (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS uos.
@ IN A 127.0.0.1
@ IN AAAA ::1
@ IN A 192.168.43.46
www IN A 192.168.43.46
exam IN A 192.168.200.201
mail IN A 192.168.200.202
# 创建域名解析文件 /etc/bind/db.uos.cn,并添加以下内容
cp /etc/bind/db.local /etc/bind/db.uos.cn
gedit /etc/bind/db.uos.cn
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA uos.cn. root.uos.cn (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS uos.
@ IN A 127.0.0.1
@ IN AAAA ::1
www IN CNAME www.uos.com.
systemctl restart bind9
# -------------------------------------
# 编辑客户端的网络配置文件
gedit /etc/resolv.conf
nameserver 192.168.43.46
nslookup www.uos.com
nslookup exam.uos.com
nslookup mail.uos.com
nslookup www.uos.cn
```
### 2.根据公司要求,配置主机DNS缓存功能
* 配置缓存功能,使forwards指向114.114.114.114
* 配置客户端,验证即可解析到www.uos.com,也能正常访问www.baidu.com
```sh
# 配置缓存功能,使forwards指向114.114.114.114
apt install bind9
gedit /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
forwarders{
114.114.114.114;
};
dnssec-validation auto;
listen-on-v6 {any;}
};
# 重启
systemctl restart bind9
# -------------------------
# 在客户端上指定配置的主机的 IP 地址作为 DNS 缓存服务器
gedit /etc/resolv.conf
nameserver 192.168.43.46
# 在客户端上进行域名解析测试,验证解析结果:
nslookup www.uos.com
nslookup www.baidu.com
```
# 四、DHCP服务
## 4.3 项目实战
### 1.基于同网段DHCP服务的配置
根据本章所学内容,搭建DHCP服务,自动为客户端主机分配指定网段的IP、掩码、网关、DNS四项网络基本参数:
### 2.根据企业需求完成分配的IP与MAC地址绑定的需求
要求:
* 收集客户瑞网卡的MAC地址:
* 为每一个mac地址的网卡固定分配IP地址:
```sh
# 1.收集客户端MAC地址:
arp -a
# 如果你只想查看特定接口(例如eth0)的MAC地址,可以使用以下命令:
# 在输出中,你将找到"link/ether"后面的MAC地址。
ip link show virbr0
# 2.为客户端每个MAC地址分配固定的IP地址:
# 将替换为客户端主机名,
# 替换为客户端以太网卡的MAC地址
# 替换为要分配给该MAC地址的固定IP地址。
apt install isc-dhcp-server -y
gedit /etc/hosts
192.168.122.209 uos1
192.168.122.173 uos2
gedit /etc/dhcp/dhcpd.conf
host uos1 {
hardware ethernet 52:54:00:ae:25:9d;
fixed-address 192.168.0.1;
}
host uos2 {
hardware ethernet 52:54:00:f4:6f:84;
fixed-address 192.168.0.2;
}
systemctl restart isc-dhcp-server
# 配置完成后,DHCP服务器将根据配置文件中的设置为每个MAC地址分配固定的IP地址。当客户端使用其以太网卡连接到网络时,它们将从DHCP服务器获取到分配的固定IP地址。
```
### 3.根据企业复杂的网络环境完成DHCP中继的搭建
要求:
设有两个内网段192.168.1.0/24、172.16.1.0/24,
* 在192.168.1.0/24网段搭建一台dhcp server 192.168.1.200, 配置为2个网段的客户机分配IP等网络参数;
* 搭建一台具有2块网卡的dhcp relay服务器,为172.16.1.0/24网段做dhcp中继;
```sh
# 1.查看192.168.1.200对应的网卡
ip addr
# 2.配置DHCP服务器的网络接口
apt install isc-dhcp-server -y
gedit /etc/default/isc-dhcp-server
INTERFACESv4="" #将监听端口修改为192.168.1.200对应网卡
# 3.配置DHCP服务器:
gedit /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.199;
option routers 192.168.1.200;
option domain-name-servers 192.168.1.200;
}
subnet 172.16.1.0 netmask 255.255.255.0 {
range 172.16.1.100 172.16.1.199;
option routers 192.168.1.200;
option domain-name-servers 192.168.1.200;
}
sudo systemctl start isc-dhcp-server
```
```sh
apt install isc-dhcp-relay -y
# 配置好dhcp server的IP和要监听的网卡设备名即可
gedit /etc/default/isc-dhcp-relay
INTERFACES="eth0 eth1" # 将eth0和eth1替换为你的两块网卡的接口名称
SERVERS="192.168.1.200" # DHCP服务器的IP地址
# 重启服务:
systemctl restart isc-dhcp-relay
# 检查服务状念和监听端口:
systemctl status isc-dhcp-relay
ss -nlup | grep :67
# 现在,你的DHCP Relay服务器已经配置完成,并将为连接到eth1网卡的172.16.1.0/24网段上的客户机提供DHCP中继功能。
```
### 4.定期对DHCP服务器缓存的数据进行清理
要求:
* 使用crontab,每天早上2:00清理一次dhcp缓存数据:
```sh
crontab -e
# 这行命令表示每天的第2个小时(凌晨2:00)执行"/usr/sbin/dhclient -r"命令,该命令用于释放DHCP租约并清理缓存数据。
0 2 * * * /usr/sbin/dhclient -r
```
# 五、高阶网络配置
## 5.1 实验-网卡链路聚合
```sh
# 在uos1添加2块新的网卡
nmcli device show | grep DEVICE #发现新增2块网卡ens33和ens37
# 将原有网卡规则删除掉,以防影响后续实验
nmcli connection delete ens33
# (2)新建bond
# 表示添加一个bond,名称为bond0,工作模式为主备,IP为"192.168.43.46”。
nmcli connection add type bond con-name bond0 mode active-backup ipv4.addresses 192.168.43.46/24
# 将ens33网卡连接添加到这个bond中。
nmcli connection add con-name ens33 ifname ens33 type bond-slave master bond0
# 将ens37网卡连接添加到这个bond中。
nmcli connection add con-name ens37 ifname ens37 type bond-slave master bond0
# 启动bond-slave ens33 ens37 bond0
nmcli connection up ens33
nmcli connection up ens37
nmcli connection up bond0
# 查看ens33和ens37网卡mac地址相同
ip a
cat /proc/net/bonding./nm-bond # 查看bond己生效
# (3)故障测试
nmcli device disconnect ens33 #禁掉当前网卡
cat /proc/net/bonding/nm-bond #查看当前的活动网卡为ens37
nmcli device connect ens33 #重新添加ens33网卡
cat /proc/net/bonding/nm-bond #ens33网卡己成为备用网卡
# (4)删除bond模式的链路聚合
nmcli connection delete bond0
nmcli connection delete ens33
nmcli connection delete ens37
systemctl restart NetworkManager
```
## 5.2 实验-桥接
```sh
# 还原虚拟机到ok状态
nmcli connection delete ens33
nmcli connection add type bridge con-name uosbr ifname uosbr
nmcli connection modify uosbr ipv4.method manual ipv4.addresses 192.168.43.46/24 ipv4.gateway 192.168.43.46 ipv4.dns 192.168.43.46
nmcli connection add type bridge-slave con-name uosbrslavel ifname ens33 master uosbr
nmcli connection up uosbr
systemctl restart NetworkManager
nmcli connection show
# 如果出现重名的uosbr配置文件,需要删除错误的uuid,然后执行以下命令
nmcli connection up uosbr
systemctl restart NetworkManager
# -I表示从哪块网卡发出ping包
ping -I uosbr 192.168.100.202
```
## 5.3 实验-删除虚拟桥接网卡virbr0
```sh
# 方法1
apt-get remove -y libvirt-*
reboot
nmcli connection show # 虚拟桥接网卡virbr0己删除
# 方法2
virsh net-list # 查看虚拟网络设备
virsh net-destroy default # 删除名为default的设备
virsh net-undefine default # 删除配置文件中的相关信总
systemctl restart libvirtd
nmcli connection show # 虚拟桥接网卡virbr0已删除
```
## 5.4 实验-添加ipv6地址
```sh
nmcli connection show # 查看配置ipv6的网卡名称,这里为ens33
nmcli connection modify ens33 ipv6.method manual ipv6.addresses 2001::1/64 ipv6.gateway 2001::1 ipv6.dns 2001:1
nmcli connection down ens33
nmcli connection up ens33
ping6 2001::1
```
# 六、时钟同步服务
## 6.3 项目实战
### 根据企业服务器的运行需求,实现服务器时间同步
```sh
# 解决linux系统时间与BI0S不一致的问题
timedatectl set-local-rtc 1 --adjust-system-clock
# 或者使用旧的命令ntpdate:
sudo apt-get install ntpdate
sudo ntpdate time1.cloud.tencent.com
sudo hwclock --systohc
```
# 七、防火墙
## 7.3 项目实战
### 1.根据企业网站需求完成特定端口/IP地址/协议的放行
要求:
* 允许来自公司办公网的ssh和VPN的正常连接:
* 允许来自外部的正常http和https的访问;
* 允许网站内部网的访问:
* 拒绝其它一切访问;
```sh
sudo apt-get install ufw
sudo ufw enable
# 允许来自公司办公网的SSH和VPN连接
sudo ufw allow from 公司办公网IP地址 to any port 22
sudo ufw allow from 公司办公网IP地址 to any port VPN端口
# 允许外部HTTP和HTTPS访问
sudo ufw allow 80
sudo ufw allow 443
# 允许网站内部网的访问(假设内部网段为192.168.0.0/24)
sudo ufw allow from 192.168.0.0/24
# 拒绝一切其他访问
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 确认配置
sudo ufw status verbose
sudo ufw reload
```
### 2.根据开启的防火墙日志进行分析和优化
根据上节日志字段的说明,我们就可以通过编写shell脚本命令来筛选、分析日志,从而找出可能的防火墙漏洞,优化防火墙的规则。
比如,我们想找出所有连接过ssh 22端口的所有IP,可以执行:
```sh
grep -ri ufw /var/log/messages | grep DPT=22 | grep -Po ".*SRC=\K\d+\.\d+.\d+.\d+"
```
# 八、NFS服务
## 8.2 项目实战
### 根据企业架构,优化NFS服务器,实现不同员工访问NFS服务器的权限不同
```sh
apt -y install rpcbind nfs-kernel-server
# 新建测试用的三个日录以及文件
mkdir /uos1 /uos2 /uos3
touch /uos1/file{1..9}
touch /uos2/file{10..19}
touch /uos3/file{100..109}
# 增加一个用户
useradd -u 1001 -m nfsuser # nfsuser对应uid为1001
chmod o+w /uos1
# 配置共享目录
# /usr1: 所有远程连接用户获得nfsuser身份,共享/uos1目录
# /usr2: 以只读方式挂载
# /usr3: 不压制root权限
gedit /etc/exports
/uos1 *(rw,anonuid=1001,anongid=1001,sync,no_wdelay)
/uos2 192.168.122.11/24(ro)
/uos3 192.168.122.11(rw,no_root_squash,sync,no_wdelay)
# 重启nfs相关服务
systemctl restart nfs-kernel-server.service
systemctl restart rpcbind
```
# 九、SAMBA服务
## 9.1 SAMBA配置实战
```sh
# 配置项详解
# Samba的配置文件 /etc/samba/smb.conf
hosts allow = 192.168.200. EXCEPT 192.168.200.202
hosts deny = 192.168.100.0/24 #主机黑名单
# 同时出现,allow生效
workgroup=MYGROUP 工作组名
server string = Samba Server Version %v
# 对方看到的共享信息,出于防止泄漏版本号的安全考虑,最好改掉
log file = /var/log/samba/log.%m # %m代表客户端ip,多个客户端连接生成多个以客户端p结尾的日志
max log size 50 #日志大小50K
security user #共享的模式
#share 不用输入用户名/密码,匿名可访问
#user 服务器用口令文件进行验证,客户端连接需要提供用户名和口令
#server 网络中配置专门的服务器认证
#domain 使用微软的DC认证
```
### 实验-匿名模式
```sh
# uos服务端安装samba
apt install -y samba
systemctl start smbd
systemctl status smbd
# 建立共享目录与权限
mkdir /uos1
mkdir /uos2
mkdir /uos3
touch /uos1/file{1..9}
touch /uos2/file{11..19}
touch /uos3/file{111..119}
#生产中尽量采用setfacl赋权更安全
chmod o+rwx /uos1
chmod o+rwx /uos2
chmod o+rwx /uos3
# 配置共享uos1目录
gedit /etc/samba/smb.conf
[uos1]
comment = uos
path = /uos1
browseable = yes
public = yes
#writable yes
# 重启smbd
systemctl restart smbd
# uos1客户端测试访问
# 如需写入需要在uos1的配置上打开 writable=yes ,并设置共享目录/uos1有o+w权限
apt install -y samba-common smbclient
smbclient -L 192.168.43.46
smbclient //192.168.43.46/uos1 #无需输入密码即可进入
smb:\> ls
smb:\> get file1 # put上传
# 批量下载
smb:\> prompt
smb:\> mget file*
# windows客户端
# 设置虚拟机通过虚拟网络与真机连接
\\192.168.43.46
net use * /del # 清除缓存
```
### 实验-用户模式
```sh
# 在uos上
useradd -s /sbin/nologin user1
useradd -s /sbin/nologin user2
useradd -s /sbin/nologin user3
smbpasswd -a user1
smbpasswd -a user2
smbpasswd -a user3
# -d 禁用samba用户disable
# -e 允许samba用户enable
# -X 删除samba用户delete
# 查看用户列表
pdbedit -L #提取/var/1ib/samba/private/passdb.tdb数据库信息,查看用户列表
# 配置
gedit /etc/samba/smb.conf
security user #更改
[uos1]
comment = uos1
path = /uos1
public = no
browseable = yes
writable = yes
[uos2]
comment = uos2
path = /uos2
public = no
browseable = yes
writable = no
write list = user1
[uos3]
comment = uos3
path = /uos3
public = no
browseable = yes
writable = no #默认不可写
write list = user1 #只有user1授权写入
valid users = user1 #只有userl授权登陆
# 重启SMBD
# 优先级valid users.>writable>write list
# writable=yes 表示所有用户都有写的权限
# write list生效时必须writable=no
# write list和valid users可采用user1 @shichangbu+shichangbu的格式,中间用空格分开
systemctl restart smbd
# 在uos2上面,测试共享连接
# 用user1登录share1-3均可写入
# 用user2登录uos1可写入,uos2可登陆不可写入,uos3不可登录
smbclient -L //192.168.43.46
smbclient -U user1 //192.168.43.46/uos1 #输入user1密码可进入
# 排错:如果搭建了samba服务,无法写入
# 检测配置文件writable writelist
# 检测文件系统是否有写的权限ugo setfacl
# 防火墙
```
### 实验-普通挂载
```sh
# 在uos1客户端上,手动挂载
apt -y install cifs-utils
mkdir /mnt/uos3/
mount -t cifs -o username=user1 //192.168.43.46/uos3/ /mnt/uos3/ //输入密码可挂载
ls -l /mnt/uos3/
# 取消挂载
umount /mnt/uos3/
# fstab挂载
gedit /etc/fstab
//192.168.43.46/uos3 /mnt/uos3 cifs credentials=/etc/file 0 0
# 配置验证
gedit /etc/file
user=user1
password=200128jk
# 或者可以不使用file文件做验证,直接把帐号密码写在fstab里
# 普通挂载su到其他用户可以直接使用挂载资源
gedit /etc/fstab
//192.168.43.46/uos3 /mnt/uos3 cifs username=user1,password=200128jk 0 0
# 自动挂载
mount -a
```
### 实验-multiuser方式挂载一个用户
```sh
# 在uos服务器上
pdbedit -L
# 查看哪些用户可以挂载
gedit /etc/samba/smb.conf
[uos1]
comment = uos1
path = /uos1
public = no
browseable = yes
writable = no
write list = user1
valid users = user1 user2
# 重启smbd
systemctl restart smbd
#----------------------------------------------------------------------------------
# 在uos1客户端上
# 本地必须有和服务器对应的用户
useradd user1
useradd user2
useradd user3
# 在root用户下执行挂载
# 注:输入密码可挂载,也加入password=user1直接挂载
mkdir /mnt/uos1
umount /mnt/uos1
mount -o multiuser,user=user1,sec=ntlmssp //192.168.43.46/uos1 /mnt/uos1
# 以user1身份
su - user1
ls /mnt/uos1 #无权限
cifscreds add 192.168.43.46 #输入uos1上user1的密码,从samba服务器获取认证
ls /mnt/uos1 #获得uos1上user1的权限,可登陆,可写入
# 以uer2身份
su - user2
ls /mnt/uos1 #无权限
cifscreds add 192.168.43.46 #输入uos1上user2的密码,从samba服务器获取认证
ls /mnt/uos1 #获得uos1上user2的权限,可登陆,不可写入
# 以user3身份
# 注:在root用户下cifscreds clearall可清除获得的认证,su到其他用户需重新获取认证
su - user3
ls /mnt/uos1 #无权限
cifscreds add 192.168.43.46 #输入uos1上user3的密码,从samba服务器获取认证
ls /mnt/uos1 #获得uos1上user3的权限,不可登陆
# 多用户各自有配置文件的情况,可以建立用户文件,一次挂载多个用户,
gedit /uos.txt
username=user1
password=200128jk
username=user2
password=200128jk
mount -o multiuser,credentials=/uos.txt,sec=ntlmssp //192.168.43.46/uos1 /mnt/uos1
# 白动挂载
gedit /etc/fstab
//192.168.43.46/uos1 /mnt/uos1 cifs defaults,multiuser,credentials=/uos.txt,sec=ntlmssp 0 0
mount -a
```
### 实验-单独用户配置文件
```sh
# 注:增加%U代表用户名,以后有对应配置文件的用户将直接跳转读取自己的配置文件
gedit /etc/samba/smb.conf
[Golble]
config file =/etc/samba/smb.conf.%U
# 删除前面配置的所有文件夹设置信息,否则所有用户都能读写这些文件夹,造成安全性降低
cp /etc/samba/smb.conf /etc/samba/smb.conf.user3
gedit /etc/samba/smb.conf.user3
# 删除config file=/etc/samba/smb.conf.%U
[uos3]
comment = uos3
path = /uos3
public = no
browseable = yes
writable = yes
# 重启SMBD
systemctl restart smbd
# uos2上
# 注:由于user3的配置文件中没有uos1和uos2目录,以user3不能登录uos1和uos2
smbclient -U user3 //192.168.43.46/uos3
```
# 十、FTP服务
## 10.3 项目实战
### 1.安装VSFTP
* 根据本节所学内容,安装并启动vsftp
* 使用浏览器连接vsftp
```sh
# 在uos server1上
apt -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd
# 验证客户端登陆:
ftp 192.168.43.46
```
### 2.基于网络存储上搭建FTP服务器
* 准备两台安装好UOS系统的虚拟机:
* 在server1上配置NFS服务,共享/share目录
* 在server2上挂载server1的/share目录到/mnt
* 在server2上配置vsftpd服务,将挂截的共享目录设置为ftp的根目录
* 在server2上建立用户uosftp.,密码uos@2020
* 在/mnt目录下建立sa、sb、sc、sd四个子目录,设置权限为:
sa\sb: root:root 750
sc\sd: uosftp:uosftp 750
* 在server1上使用匿名用户和 uosftp 分别登陆 ftp://server2 ,查验这四个目录的上传下载权限:
```sh
# 1.在server1上配置NFS服务,共享/share目录
sudo apt install nfs-kernel-server
gedit /etc/exports
/share *(rw,sync,no_root_squash)
sudo systemctl start nfs-kernel-server
# 2.在server2上挂载server1的/share目录到/mnt
sudo apt install nfs-common
sudo mount server1:/share /mnt
# 3.在server2上配置vsftpd服务,将挂截的共享目录设置为ftp的根目录
sudo apt install vsftpd
gedit /etc/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
chroot_local_user=YES
local_root=/mnt
sudo systemctl restart vsftpd
# 4.在server2上建立用户uosftp,密码uos@2020
sudo useradd uosftp -s /bin/false
sudo passwd uosftp
# 输入密码时,按照提示输入密码"uos@2020"。
# 5.在/mnt目录下建立sa、sb、sc、sd四个子目录
sudo mkdir /mnt/sa /mnt/sb /mnt/sc /mnt/sd
sudo chown root:root /mnt/sa /mnt/sb
sudo chown uosftp:uosftp /mnt/sc /mnt/sd
sudo chmod 750 /mnt/sa /mnt/sb
sudo chmod 750 /mnt/sc /mnt/sd
# 在server1上使用匿名用户和 uosftp 分别登陆 ftp://server2 ,查验这四个目录的上传下载权限
# 使用匿名用户登录:使用FTP客户端访问"ftp://server2",不输入用户名和密码,尝试上传和下载/mnt/sa和/mnt/sb目录下的文件,确认是否能够上传和下载成功。
# 使用uosftp用户登录:使用FTP客户端访问"ftp://server2",使用用户名"uosftp"和密码"uos@2020"登录,尝试上传和下载/mnt/sc和/mnt/sd目录下的文件,确认是否能够上传和下载成功。
```
### 3.根据企业需求限制不同的用户访问
* 在server2上建立四个系统用户:uosftp1、uosftp2、uosftp3、uosftp4
* 使用userlist白名单方式,限制uosftp1、uosftp2可以登陆,而uosftp3、uosftp4不能登陆
```sh
# 在server2上建立四个系统用户:uosftp1、uosftp2、uosftp3、uosftp4
sudo useradd uosftp1 -s /bin/false
sudo useradd uosftp2 -s /bin/false
sudo useradd uosftp3 -s /bin/false
sudo useradd uosftp4 -s /bin/false
# 使用userlist白名单方式,限制uosftp1、uosftp2可以登陆,而uosftp3、uosftp4不能登陆
sudo gedit /etc/vsftpd.conf
# 启用用户列表
userlist_enable=YES
# 指定用户列表文件的路径
userlist_file=/etc/vsftpd.userlist
# 允许所有用户登录
userlist_deny=NO
sudo gedit /etc/vsftpd.userlist
uosftp1
uosftp2
sudo systemctl restart vsftpd
```
### 4.根据企业需求创建不同的虚拟用户访问FTP服务器
* 在server2上配置4个虚拟用户,uos1、uos2、uos3、uos4
* 登陆后进入不同的虚拟目录
```sh
# 在server2上配置4个虚拟用户,uos1、uos2、uos3、uos4
sudo apt install vsftpd-db
sudo useradd -d /home/vsftpd/uos1 -s /bin/false -G ftp uos1
sudo useradd -d /home/vsftpd/uos2 -s /bin/false -G ftp uos2
sudo useradd -d /home/vsftpd/uos3 -s /bin/false -G ftp uos3
sudo useradd -d /home/vsftpd/uos4 -s /bin/false -G ftp uos4
# 登陆后进入不同的虚拟目录
sudo mkdir -p /home/vsftpd/uos1
sudo mkdir -p /home/vsftpd/uos2
sudo mkdir -p /home/vsftpd/uos3
sudo mkdir -p /home/vsftpd/uos4
sudo chown -R uos1:ftp /home/vsftpd/uos1
sudo chmod -R 750 /home/vsftpd/uos1
sudo chown -R uos2:ftp /home/vsftpd/uos2
sudo chmod -R 750 /home/vsftpd/uos2
sudo chown -R uos3:ftp /home/vsftpd/uos3
sudo chmod -R 750 /home/vsftpd/uos3
sudo chown -R uos4:ftp /home/vsftpd/uos4
sudo chmod -R 750 /home/vsftpd/uos4
# 配置vsftpd以使用虚拟用户并指定虚拟用户的目录:
sudo gedit /etc/vsftpd.conf
# 启用虚拟用户
guest_enable=YES
# 指定虚拟用户的身份认证文件
guest_username=ftp
# 指定虚拟用户的目录
virtual_use_local_privs=YES
sudo systemctl restart vsftpd
```
# 十一、ISCSI存储服务
## 11.4 项目实战
### 1.根据企业需求完成iSCSI存储的部署
* 在server1添加3块硬盘,分别为sdc/sdd/sde,容量5G
* 在server1安装targetcli服务端,配置三个lun,分别对应添加的三块硬盘
* 在server1为三个lun分别配置访问用户test1/test2/test3,密码pwd1/pwd2/pwd3
* 在server2安装initator客户端,配置挂载test1
* 在server3安装initator客户端,配置挂载test2
* 在server4安装initator客户端,配置挂载test3
```sh
# 在server1添加3块硬盘,分别为sdc/sdd/sde,容量5G
sudo fdisk -l
sudo fdisk /dev/sdc
n # 创建新分区
p # 选择主分区
1 # 分区编号为1
# 默认起始扇区
+5G # 分区大小为5G
w # 保存并退出
# 在server1安装targetcli服务端,配置三个lun,分别对应添加的三块硬盘
sudo apt install targetcli
sudo targetcli
cd /backstores/block
create lun1 /dev/sdc1
create lun2 /dev/sdd1
create lun3 /dev/sde1
# 在server1为三个lun分别配置访问用户test1/test2/test3,密码pwd1/pwd2/pwd3
cd /iscsi/iqn.20xx-xx.com.example:target1/tpg1/acls
create test1
set auth test1 userid=test1 password=pwd1
cd /iscsi/iqn.20xx-xx.com.example:target2/tpg1/acls
create test2
set auth test2 userid=test2 password=pwd2
cd /iscsi/iqn.20xx-xx.com.example:target3/tpg1/acls
create test3
set auth test3 userid=test3 password=pwd3
# 在server2安装initator客户端,配置挂载test1
sudo apt install open-iscsi
sudo gedit /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.20xx-xx.com.example:initiator2
sudo iscsiadm --mode discoverydb --type sendtargets --portal server1_ip --discover
sudo iscsiadm --mode node --targetname iqn.20xx-xx.com.example:target1 --portal server1_ip --login
# 在server3安装initator客户端,配置挂载test2
sudo apt install open-iscsi
sudo gedit /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.20xx-xx.com.example:initiator3
sudo iscsiadm --mode discoverydb --type sendtargets --portal server1_ip --discover
sudo iscsiadm --mode node --targetname iqn.20xx-xx.com.example:target2 --portal server1_ip --login
# 在server4安装initator客户端,配置挂载test3
sudo apt install open-iscsi
sudo gedit /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.20xx-xx.com.example:initiator4
sudo iscsiadm --mode discoverydb --type sendtargets --portal server1_ip --discover
sudo iscsiadm --mode node --targetname iqn.20xx-xx.com.example:target3 --portal server1_ip --login
```
### 2.根据需求完成iSCSI存储设备的扩容
Iscsi块存储的扩容,要求搭建基础的磁盘是支持在线扩容的,比如LM磁盘,步骤如下:
* 先对基础LM磁盘扩容
* 在target服务端重建lun
* 在initator客户端重新发现磁盘
```sh
# 先对基础LM磁盘扩容
sudo lvdisplay /dev/<基础LM磁盘名称>
sudo lvextend -L +5G /dev/<基础LM磁盘名称>
sudo resize2fs /dev/<基础LM磁盘名称>
# sudo xfs_growfs /dev/<基础LM磁盘名称> 如果基础LM磁盘上运行的是XFS文件系统
# 在target服务端重建lun
sudo targetcli
/backstores/block/ delete
/backstores/block create /dev/<扩容后的磁盘分区>
# 在initator客户端重新发现磁盘
sudo iscsiadm -m discovery -t st -p
sudo iscsiadm -m node -T -p -l
```
# 十二、数据库服务
## 12.3 项目实战
### 1.根据企业需求完成数据库多实例部署
* 在server1上配置mariadb,建立uosdb1,导入scott示例库的的三个表及数据
* 在server2上配置mariadb,建立uosdb2,导入scott示例库的的三个表及数据
* 编写crontab计划任务,每天早上2:00做一次数据库的全备份并压缩(xz),保留30天,将备份交差存放在异机上(server1的数据库备份存在server2上,server2同理)
```sh
# 在server1上配置mariadb,建立uosdb1,导入scott示例库的的三个表及数据
sudo apt install mariadb-server
sudo mkdir /var/lib/mysql/uosdb1
sudo chown -R mysql:mysql /var/lib/mysql/uosdb1
sudo mysql_install_db --user=mysql --datadir=/var/lib/mysql/uosdb1
sudo systemctl start mariadb@uosdb1
sudo systemctl enable mariadb@uosdb1
wget https://raw.githubusercontent.com/dg/dbscripts/master/mariadb/scott.sql
sudo mysql -u root -p -e "CREATE DATABASE uosdb1;"
sudo mysql -u root -p uosdb1 < scott.sql
# 在server2上配置mariadb,建立uosdb2,导入scott示例库的的三个表及数据
sudo apt install mariadb-server
sudo mkdir /var/lib/mysql/uosdb2
sudo chown -R mysql:mysql /var/lib/mysql/uosdb2
sudo mysql_install_db --user=mysql --datadir=/var/lib/mysql/uosdb1
sudo systemctl start mariadb@uosdb2
sudo systemctl enable mariadb@uosdb2
wget https://raw.githubusercontent.com/dg/dbscripts/master/mariadb/scott.sql
sudo mysql -u root -p -e "CREATE DATABASE uosdb2;"
sudo mysql -u root -p uosdb2 < scott.sql
# 编写crontab计划任务,每天早上2:00做一次数据库的全备份并压缩(xz),保留30天,将备份交差存放在异机上(server1的数据库备份存在server2上,server2同理)
# 在Server1上配置每日早上2:00的备份计划任务
crontab -e
0 2 * * * mysqldump -u root -p uosdb1 > /path/to/backup/uosdb1_$(date +\%Y\%m\%d).sql && xz /path/to/backup/uosdb1_$(date +\%Y\%m\%d).sql
# 在Server2上配置每日早上2:00的备份计划任务:
crontab -e
0 2 * * * mysqldump -u root -p uosdb2 > /path/to/backup/uosdb2_$(date +\%Y\%m\%d).sql && xz /path/to/backup/uosdb2_$(date +\%Y\%m\%d).sql
```
### 2.安全性考虑完成数据库的权限划分
* 在server1上,建立三个mariadb用户dbuser1/dbuser2/dbuser3
* 在server1上,建立三个数据库uosdb1/uosdb2/uosdb3
* 一一对应授权:dbuser1只可访问uosdb1, dbuser2只可访问uosdb2, dbuser3只可访问uosdb3
```sh
# 在server1上,建立三个mariadb用户dbuser1/dbuser2/dbuser3
sudo mysql -u root -p
CREATE USER 'dbuser1'@'localhost' IDENTIFIED BY 'password1';
CREATE USER 'dbuser2'@'localhost' IDENTIFIED BY 'password2';
CREATE USER 'dbuser3'@'localhost' IDENTIFIED BY 'password3';
# 在server1上,建立三个数据库uosdb1/uosdb2/uosdb3
# 一一对应授权:dbuser1只可访问uosdb1, dbuser2只可访问uosdb2, dbuser3只可访问uosdb3
CREATE DATABASE uosdb1;
GRANT ALL PRIVILEGES ON uosdb1.* TO 'dbuser1'@'localhost';
FLUSH PRIVILEGES;
CREATE DATABASE uosdb2;
GRANT ALL PRIVILEGES ON uosdb2.* TO 'dbuser2'@'localhost';
FLUSH PRIVILEGES;
CREATE DATABASE uosdb3;
GRANT ALL PRIVILEGES ON uosdb3.* TO 'dbuser3'@'localhost';
FLUSH PRIVILEGES;
```
### 3.根据企业需求完成数据库和表的管理
* 在server1上,配置mariadb,并配置root可以连接
* 下载安装dbeaver,图形客户端连接server1上的mariadb服
* 建立scott数据库,以及三个表、字段(参见<<4.1.2 Mariadb基础应用-数据库DDL,DML和DCL语言操作>>)
```sh
# 在server1上,配置mariadb,并配置root可以连接
sudo apt install mariadb-server
sudo systemctl start mariadb
sudo mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root_password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 下载安装dbeaver,图形客户端连接server1上的mariadb服务器
根据操作系统前往DBeaver官网(https://dbeaver.io)下载适合的安装包并进行安装。
# 建立scott数据库,以及三个表、字段(参见<<4.1.2 Mariadb基础应用-数据库DDL,DML和DCL语言操作>>)
CREATE DATABASE scott;
USE scott;
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100)
);
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
total_amount DECIMAL(10,2)
);
```
# 十三、KVM虚拟机管理
## 13.3 项目实战
### 1.使用命令行工具创建虚拟机
```sh
# 用法:virt-install-name NAME-memory MB STORAGE INSTALL[options]
# 用途:从指定安装源创建新虚拟机。
# 创建镜像文件
sudo apt install qemu qemu-system-x86 libvirt-daemon-system libvirt-clients bridge-utils virt-manager
sudo systemctl start libvirtd
sudo systemctl enable libvirtd
qemu-img create -f qcow2 -o size=20G /var/lib/libvirt/images/uos-server3.qcow2
# 通过cdrom镜相引导安装系统:
virt-install --name uos-server3 --vcpus 4 -r 4096 -c /media/xiaoxiong/数据盘/统信比赛/deepin-desktop-community-20.9-amd64.iso --disk /var/lib/libvirt/images/uos-server3.qcow2,bus=virtio,size=20 --graphics vnc,listen=0.0.0.0 --network bridge=virbr0,model=virtio
# 查看运行的虚拟机
virsh list --all
```
### 2.利用已有的虚拟机配置文件创建新的虚拟机
```sh
# 把uos2当做模板机,提取uos2的虚拟机磁盘、xm1配置文件
qemu-img info /var/lib/libvirt/images/uos2.qcow2
# 复用uos2模板机的磁盘数据
qemu-img create -f qcow2 -b /var/lib/libvirt/images/uos2.qcow2 /var/lib/libvirt/images/uos4.qcow2
# 复制配置
cd /etc/libvirt/qemu/
cp uos2.xml uos4.xml
# 修改配置文件
gedit uos4.xml
uos4 #新虚拟机名称
da2478f0-abfo-1lea-a912-6f46e76df6b1 #UUID
disk type='file' device='disk'> #文件类型
#磁盘类型
#新虚拟卷位置
#虚拟机的网络接口类型
#删除MAC地址
#虚拟机的网卡的源网络名称
model type='e1000'/>
# 根据配置文件定义虚拟机
virsh define /etc/libvirt/qemu/uos4.xml
# 查看所有虚拟主机
virsh list -all
# 开启uos虚拟机
virsh start uos4
```
### 3.使用命令行工具完成磁盘设备的热插拔
```sh
# virsh attach一disk(添加磁盘设备)
# 1、用qemu-img创建一块100G的qcow2硬盘
SOURCEFILE=/data/kvm/uos-server1-disk1.qcow2
qemu-img create -f qcow2 $SOURCEFILE 20G
# 2、附加磁盘到指定虚拟机
# $DOMAIN:想要挂载数据盘文件的虚拟机名
# $TARGET:一般为vdb,vdc..
# -subdriver:这一项是必须的,如果不加的话,虚拟机不知道镜像文件的格式,挂载就会失败。
DOMAIN=uos-server1
TARGET=sdb
virsh attach-disk --domain $DOMAIN --source SSOURCEFILE --target $TARGET --subdriver qcow2 --config --live
# Virsh detach-disk(删除磁盘设备)
virsh detach-disk UOSserver1 sdb
```
# 十四、Docker容器
## 14.3项目实战
### 1.部署web服务器并对外提供服务
* 在server1上布署apache2容器,端口设置为8080
* 将主页设置为UOS will be the best OS.
```sh
sudo apt install docker.io
sudo docker run -d -p 8080:80 --name apache2 httpd:latest
sudo docker exec -it apache2 /bin/bash
echo "UOS will be the best OS." > /usr/local/apache2/htdocs/index.html
exit
```
### 2.本地私有镜像仓库的部署
* 在server1上布置私有镜像仓库
* 配置docker,上传busybox镜相
```sh
sudo apt install docker.io
sudo docker run -d -p 5000:5000 --name registry registry:2
sudo gedit /etc/docker/daemon.json
{
"insecure-registries": ["server1:5000"]
}
sudo systemctl restart docker
sudo docker tag busybox server1:5000/busybox
sudo docker push server1:5000/busybox
```
### 3.编写Dockerfile完成LAMP架构的部署
* 在server2上布署mysql容器
* 在server2上布置wordpress容器
* 使用浏览器配置wordpress使其对外提供web服务
```sh
sudo apt update
sudo apt install docker.io
sudo docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:latest
sudo docker run -d -p 80:80 --name wordpress --link mysql:mysql -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password -e WORDPRESS_DB_NAME=wordpress wordpress:latest
# 在浏览器中输入Server2的IP地址,访问WordPress的安装页面。
http://server2
# 按照页面上的指示,选择语言并填写数据库连接信息:
# 数据库名:wordpress
# 用户名:root
# 密码:password
# 数据库主机:mysql
# 完成WordPress的安装过程,创建管理员账号和设置站点信息。
```
# 十五、Ansible管理
## 15.4项目实战
### 1.通过模块批量完成主机的功能实现
环境说明:
一台物理机:pserver 192.168.1.254
三台虚拟机:
server1 192.168.1.10
server2 192.168.1.20
server3 192.168.1.30
要求:
* 配置ssh:从物理机可以root免密登陆三台虚拟机:
* 配置ansible主机列表,server1在db组,server2和server3在web组;
* 配置四台服务器的hosts文件,加入四台主机名和IP;
* 使用ping模块测试四台主机的连通性;
* 使用apt模块在db组安装mariadb-server;
* 使用shell模块获得web组服务器的mac地址:
```sh
# 物理机, 配置ssh:从物理机可以root免密登陆三台虚拟机:
ssh-keygen
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.20
ssh-copy-id root@192.168.1.30
# 配置ansible主机列表,server1在db组,server2和server3在web组;
sudo vi /etc/ansible/hosts
[db]
server1 ansible_host=192.168.1.10
[web]
server2 ansible_host=192.168.1.20
server3 ansible_host=192.168.1.30
# 配置四台服务器的hosts文件,加入四台主机名和IP;
ssh root@192.168.1.10 "sudo vi /etc/hosts"
ssh root@192.168.1.20 "sudo vi /etc/hosts"
ssh root@192.168.1.30 "sudo vi /etc/hosts"
192.168.1.254 pserver
192.168.1.10 server1
192.168.1.20 server2
192.168.1.30 server3
# 使用ping模块测试四台主机的连通性;
ansible all -m ping
# 使用apt模块在db组安装mariadb-server;
ansible db -m apt -a "name=mariadb-server state=present"
# 使用shell模块获得web组服务器的mac地址
ansible web -m shell -a "ifconfig -a | grep ether"
```
### 2.编写剧本,根据企业环境部署web服务并进行优化
环境说明:
一台物理机:pserver 192.168.1.254
三台虚拟机:
server1 192.168.1.10
server2 192.168.1.20
server3 192.168.1.30
要求:
* 配置ssh:从物理机可以root免密登陆三台虚拟机:
* 配置ansible主机列表,server1在db组,server2和server3在web组;
* 配置四台服务器的hosts文件,加入四台主机名和IP:
* 编写web.yaml,在web组服务器中安装apache2;在db组中安装mariadb-server;
* 并启动安装的服务,检测服务的可用性:
```sh
# 物理机, 配置ssh:从物理机可以root免密登陆三台虚拟机:
ssh-keygen
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.20
ssh-copy-id root@192.168.1.30
# 配置ansible主机列表,server1在db组,server2和server3在web组;
sudo vi /etc/ansible/hosts
[db]
server1 ansible_host=192.168.1.10
[web]
server2 ansible_host=192.168.1.20
server3 ansible_host=192.168.1.30
# 配置四台服务器的hosts文件,加入四台主机名和IP;
ssh root@192.168.1.10 "sudo vi /etc/hosts"
ssh root@192.168.1.20 "sudo vi /etc/hosts"
ssh root@192.168.1.30 "sudo vi /etc/hosts"
192.168.1.254 pserver
192.168.1.10 server1
192.168.1.20 server2
192.168.1.30 server3
# 编写web.yaml,在web组服务器中安装apache2;在db组中安装mariadb-server;
sudo vi web.yaml
---
- hosts: web
tasks:
- name: Install Apache2
apt:
name: apache2
state: present
- hosts: db
tasks:
- name: Install MariaDB Server
apt:
name: mariadb-server
state: present
- hosts: web
tasks:
- name: Start Apache2 service
service:
name: apache2
state: started
enabled: yes
- hosts: db
tasks:
- name: Start MariaDB service
service:
name: mariadb
state: started
enabled: yes
- hosts: all
tasks:
- name: Check Apache2 service availability
uri:
url: http://localhost/
return_content: yes
register: apache2_status
failed_when: "'Apache2 Ubuntu Default Page' not in apache2_status.content"
- name: Check MariaDB service availability
command: mysql --user=root --password=password -e "SHOW DATABASES;"
# 执行web.yaml剧本部署和检测服务可用性
ansible-playbook web.yaml
```
### 3.编写剧本,完成嵌套循环,添加多用户
环境说明:
一台物理机:pserver 192.168.1.254
三台虚拟机:
server1 192.168.1.10
server2 192.168.1.20
server3 192.168.1.30
要求:
* 配置ssh:从物理机可以root免密登陆三台虚拟机:
* 配置ansible主机列表,server1在db组,server2和server3在web组;
* 配置四台服务器的hosts文件,加入四台主机名和IP:
* 编写useradd.yaml,使用循环,在所有虚拟机添加uos[1-3]三个用户
```sh
# 物理机, 配置ssh:从物理机可以root免密登陆三台虚拟机:
ssh-keygen
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.20
ssh-copy-id root@192.168.1.30
# 配置ansible主机列表,server1在db组,server2和server3在web组;
sudo vi /etc/ansible/hosts
[db]
server1 ansible_host=192.168.1.10
[web]
server2 ansible_host=192.168.1.20
server3 ansible_host=192.168.1.30
# 配置四台服务器的hosts文件,加入四台主机名和IP;
ssh root@192.168.1.10 "sudo vi /etc/hosts"
ssh root@192.168.1.20 "sudo vi /etc/hosts"
ssh root@192.168.1.30 "sudo vi /etc/hosts"
192.168.1.254 pserver
192.168.1.10 server1
192.168.1.20 server2
192.168.1.30 server3
# 编写useradd.yaml,使用循环,在所有虚拟机添加uos[1-3]三个用户:
sudo vi useradd.yaml
---
- hosts: all
tasks:
- name: Create users
become: yes
user:
name: "uos{{ item }}"
state: present
with_sequence: start=1 end=3
# 执行useradd.yaml剧本添加多用户
ansible-playbook useradd.yaml
```
### 4.编写剧本,完成debug检测
环境说明:
一台物理机:pserver 192.168.1.254
三台虚拟机:
server1 192.168.1.10
server2 192.168.1.20
server3 192.168.1.30
要求:
* 配置ssh:从物理机可以root免密登陆三台虚拟机:
* 配置ansible主机列表,server1在db组,server2和server:3在web组:
* 配置四台服务器的hosts文件,加入四台主机名和IP:
* 编写mac.yaml,取得所有虚拟机mac地址(192.168.1.XX所在网卡)
* 使用debug var获得命令输出
```sh
# 物理机, 配置ssh:从物理机可以root免密登陆三台虚拟机:
ssh-keygen
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.20
ssh-copy-id root@192.168.1.30
# 配置ansible主机列表,server1在db组,server2和server3在web组;
sudo vi /etc/ansible/hosts
[db]
server1 ansible_host=192.168.1.10
[web]
server2 ansible_host=192.168.1.20
server3 ansible_host=192.168.1.30
# 配置四台服务器的hosts文件,加入四台主机名和IP;
ssh root@192.168.1.10 "sudo vi /etc/hosts"
ssh root@192.168.1.20 "sudo vi /etc/hosts"
ssh root@192.168.1.30 "sudo vi /etc/hosts"
192.168.1.254 pserver
192.168.1.10 server1
192.168.1.20 server2
192.168.1.30 server3
# 编写mac.yaml,取得所有虚拟机mac地址(192.168.1.XX所在网卡)
sudo vi mac.yaml
---
- hosts: all
tasks:
- name: Get MAC addresses
become: yes
shell: "ip addr show dev eth0 | awk '/ether/{print $2}'"
register: mac_addresses
- name: Display MAC addresses
debug:
var: mac_addresses.stdout_lines
ansible-playbook mac.yaml
# 使用debug var获得命令输出
debug var
```
# 十六、Shell脚本
## 16.6综合项目
环境说明:
一台物理机:pserver 192.168.1.254
三台虚拟机:
server1 192.168.1.10
server2 192.168.1.20
server3 192.168.1.30
要求:
* 配置ssh:从物理机可以root免密登陆三台虚拟机:
* 配置ansible主机列表,serverl在db组,server2和server3在web组;
* 配置四台服务器的hosts文件,加入四台主机名和IP:
```sh
# 物理机, 配置ssh:从物理机可以root免密登陆三台虚拟机:
ssh-keygen
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.20
ssh-copy-id root@192.168.1.30
# 配置ansible主机列表,server1在db组,server2和server3在web组;
sudo vi /etc/ansible/hosts
[db]
server1 ansible_host=192.168.1.10
[web]
server2 ansible_host=192.168.1.20
server3 ansible_host=192.168.1.30
# 配置四台服务器的hosts文件,加入四台主机名和IP;
ssh root@192.168.1.10 "sudo vi /etc/hosts"
ssh root@192.168.1.20 "sudo vi /etc/hosts"
ssh root@192.168.1.30 "sudo vi /etc/hosts"
192.168.1.254 pserver
192.168.1.10 server1
192.168.1.20 server2
192.168.1.30 server3
```
### 1.快速自动化安装配置DHCP服务器脚本
要求:
* 编写shell脚本,自动安装dhcp服务器应用
* 自动配置监听网卡为系统第一块网卡,ip为192.168.1.254/24
* 配置分配网段为192.168.1.0/24
* 配置分配掩码为255.255.255.0
* 配置分配IP范围为192.168.1.100~192.168.1.200
* 配置分配网关为192.168.1.254
* 配置分配DNS为114.114.114.114
要求2:
* 编写ansible playbook,命名为dhcp.yaml,完成上述功能:
```sh
# 编写shell脚本,自动安装dhcp服务器应用
gedit dhcp_install.sh
#!/bin/bash
# 安装DHCP服务器应用
apt install -y isc-dhcp-server
# 配置监听网卡为系统第一块网卡,IP为192.168.1.254/24
sed -i 's/INTERFACESv4=""/INTERFACESv4="eth0"/' /etc/default/isc-dhcp-server
ip addr add 192.168.1.254/24 dev eth0
# 配置DHCP服务器
cat < /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.254;
option domain-name-servers 114.114.114.114;
}
EOF
# 重启DHCP服务
chmod +x dhcp_install.sh
./dhcp_install.sh
systemctl restart isc-dhcp-server
#-------------------------------------------------------
# 编写ansible playbook,命名为dhcp.yaml,完成上述功能
gedit dhcp.yaml
---
- hosts: dhcp_server
become: yes
tasks:
- name: Install DHCP server application
apt:
name: isc-dhcp-server
state: present
- name: Configure DHCP server
lineinfile:
path: /etc/dhcp/dhcpd.conf
line: "{{ item }}"
with_items:
- "subnet 192.168.1.0 netmask 255.255.255.0 {"
- " range 192.168.1.100 192.168.1.200;"
- " option routers 192.168.1.254;"
- " option domain-name-servers 114.114.114.114;"
- "}"
- name: Configure DHCP server interface
lineinfile:
path: /etc/default/isc-dhcp-server
line: "INTERFACESv4=\"eth0\""
state: present
- name: Configure IP address on eth0
ip:
addr: 192.168.1.254/24
dev: eth0
- name: Restart DHCP service
service:
name: isc-dhcp-server
state: restarted
# 执行以下命令运行dhcp.yaml剧本:
ansible-playbook dhcp.yaml
```
### 2.检查密码,如果用户三次输入密码均错误,则退出脚本
要求:
* 编写shell脚本,分别从键盘读入用户输入的用户名和密码;
* 判断用户名为uos,密码为uos_123,不正确则重新输入;
* 直到3次机会都用完,仍不正确则执行退出exit 11:
* 正确则显示welcome
要求2:
* 使用shell模块,使此脚本在server1上运行;
```sh
# 编写检查密码并退出脚本的Shell脚本
gedit /home/scripts/check_password.sh
#!/bin/bash
# 初始化计数器
count=0
# 循环读取用户名和密码,最多3次机会
while [ $count -lt 3 ]; do
# 读取用户名和密码
read -p "请输入用户名: " username
read -s -p "请输入密码: " password
echo
# 判断用户名和密码是否正确
if [ "$username" = "uos" ] && [ "$password" = "uos_123" ]; then
echo "Welcome!"
exit 0
else
echo "用户名或密码错误,请重新输入。"
count=$((count+1))
fi
done
# 3次机会都用完,退出脚本
echo "密码输入错误次数已达上限,退出脚本。"
exit 11
# -------------------------------------------------------------
# 使用shell模块,使此脚本在server1上运行
gedit check_password.yaml
---
- hosts: server1
become: yes
tasks:
- name: Run password check script
shell: /home/scripts/check_password.sh
ansible-playbook check_password.yaml
```
### 3.备份MariaDB数据库
要求:
* 在server1安装mariadb,建立uosdb,用户名:uos,密码:uos
* 将mysql库user表内容及表结构复制到uosd的uostable表中;
* 编写脚本,每天晚上12点0分执行备份:
* 使用mysqldump备份uosdb,设:mysql server:server1, 用户名:uos, 密码:uos
* 备份文件压缩为gz格式,加rsyncable参数
* 备份文件存放于/backup目录下,文件名为uosdb+年月日.gz格式:
* 在本机保留30天以内的备份文件:
要求2:
* 编写ansible playbook,命名为mariadb.yaml,完成上述功能;
```sh
# 在server1安装mariadb,建立uosdb,用户名:uos,密码:uos
gedit /home/scripts/backup_mariadb.sh
#!/bin/bash
# 备份目录
backup_dir="/backup"
# 当前日期
current_date=$(date +%Y%m%d)
# 备份文件名
backup_file="uosdb$current_date.gz"
# MySQL连接信息
mysql_host="server1"
mysql_user="uos"
mysql_password="uos"
mysql_database="uosdb"
# 备份命令
mysqldump --host=$mysql_host --user=$mysql_user --password=$mysql_password $mysql_database | gzip --rsyncable > $backup_dir/$backup_file
# 清理过期备份
find $backup_dir -type f -name "uosdb*.gz" -mtime +30 -delete
# -------------------------------------------------------
# 编写ansible playbook,命名为mariadb.yaml,在server1上安装MariaDB并创建数据库和用户
gedit mariadb.yaml
---
- hosts: server1
become: yes
tasks:
- name: Install MariaDB
apt:
name: mariadb-server
state: present
- name: Create uosdb database
mysql_db:
name: uosdb
state: present
- name: Create uos user
mysql_user:
name: uos
password: uos
priv: 'uosdb.*:ALL'
state: present
host: localhost
# 运行Ansible Playbook
ansible-playbook mariadb.yaml
# 创建备份脚本backup_mariadb.yaml
gedit backup_mariadb.yaml
---
- hosts: server1
become: yes
tasks:
- name: Copy backup script
copy:
src: /home/scripts/backup_mariadb.sh
dest: /usr/local/bin/backup_mariadb.sh
mode: '0755'
- name: Execute backup script
command: /usr/local/bin/backup_mariadb.sh
# 执行备份脚本
ansible-playbook backup_mariadb.yaml
```
# 十七、wine应用迁移
## 17.3项目实战
为更好满足工作对软件的需求,使用Wine技术安装软件程序
### 示例一:安装酷狗音乐
下载:http:/download.kugou.com,在下载目录,右键打开终端,执行:
```sh
deepwin-wine5 ./kugous9144.exe //文件版本号请根据实际情况修改
```
安装完毕双击桌面图标,启动酷狗
注:第一次启动会发现因缺少字体而显示有问题,按照《4.2.2节中如何安裴字体》配置simsun字体后,重启即可
```sh
```
### 示例二:Wine安装tp-link安防:
下载:https://service.tp-link.com.cn/detail_download_6764.html
安装
```sh
deepin-wine ./TP-LINK安防系统2.10.8.145.exe
```
注意:安装过程中报建立桌面图标出错,不必理会,点击右键关闭安装程序或ctrl+C停止deepin-wine的安装过程即可。
双击桌面图标启动
### 示例三:安装腾迅会议
下载:https://meeting.tencent.com/download-center.html?from=1001
安装(请根据实际修改下载的文件名)
```
deepin-wine5 TencentMeeting_0300000000_2.0.0.447.publish.exe
```
运行
登陆后,开个会议试试吧~
编辑桌面启动文件:
```sh
deepin-editor ~/.local/share/applications/wine/Programs/腾讯软件/腾讯会议/腾讯会议.desktop
[Desktop Entry]
Name=腾讯会议
Exec=env WINEPREFIX="/data/home/yanght/.wine "deepin-wine5 C:\\\\Program\\\Files\\\\Tencent\\\\WeMeet\\\\wemeetapp.exe
Type=Application
StartupNotify=true
Path=/data/home/yanght/.wine/dosdevices/c:/Program Files/Tencent/WeMeet
Icon=6389_wemeetapp.0
StartupWMClass=wemeetapp.exe
```
PS.
可以从日志查询启动故障
```sh
tail -f /var/log/syslog
```