linux运维篇15
- 一、实现基于MYSQL验证的vsftpd虚拟用户访问
- 二、配置samba共享,实现/www目录共享
- 三、使用rsync+inotify实现/www目录实时同步
- 四、LVS调度算法总结
- 五、LVS的跨网络DR实现
一、实现基于MYSQL验证的vsftpd虚拟用户访问
FTP服务器搭建:
数据库配置
yum install -y mariadb-server
systemctl enable --now mariadb.servicemysql 创建虚拟账户aa,bb和数据库vsftpd
CREATE DATABASE vsftpd;
USE vsftpd;
CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL
);
INSERT INTO users(name,password) values('aa',password('aa123456'));
INSERT INTO users(name,password) values('bb',password('bb123456'));
GRANT SELECT ON vsftpd.* TO vsftpd@'%' IDENTIFIED BY 'vsftpd';
FLUSH PRIVILEGES;安装认证模块
yum install -y gcc pam-devel mariadb-devel
wget https://jaist.dl.sourceforge.net/project/pam-mysql/pam-mysql/0.7RC1/pam_mysql-0.7RC1.tar.gz --no-check-certificate
tar xf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-pam-mods-dir=/lib64/security
make installll /lib64/security/pam_mysql.* 确认模块安装成功配置PAM模块和数据库绑定认证
vi /etc/pam.d/vsftpd.mysqlauth required pam_mysql.so user=vsftpd passwd=vsftpd host=192.168.116.130 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2account required pam_mysql.so user=vsftpd passwd=vsftpd host=192.168.116.130 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2安装FTP服务
yum install -y vsftpd
useradd -s /sbin/nologin -d /data/ftproot -r vuser 创建系统账户vuser
mkdir -p /data/ftproot/upload
setfacl -m u:vuser:rwx /data/ftproot/upload
创建2个文件,验证登录
touch /data/ftproot/aa.txt
touch /data/ftproot/bb.txtvi /etc/vsftpd/vsftpd.conf 修改配置文件pam_service_name=/etc/pam.d/vsftpd.mysql #原本的这个要修改为模块路径
#文件底部添加
anonymous_enable=YES
guest_enable=YES
guest_username=vusersystemctl enable --now vsftpd
客户端访问
yum install -y ftp
ftp 192.168.116.130 输入虚拟账户aa和密码,查看文件
二、配置samba共享,实现/www目录共享
服务器安装:
yum install -y samba
mkdir /www -p 创建共享目录
touch /www/smb1.txtuseradd -s /sbin/nologin -r smb1 创建系统账户
smbpasswd -a smb1 将系统账户映射为smb账户
pdbedit -L 查看账户生成
vi /etc/samba/smb.conf 修改配置
[share1]path=/wwwwritable=no #只允许smb1进行写操作write list=smb1 #设置允许账户setfacl -m u:smb1:rwx /www
systemctl start smb
客户端访问
yum install -y samba-client
smbclient //192.168.116.130/share1 -U smb1 访问共享目录
put anaconda-ks.cfg 上传测试
三、使用rsync+inotify实现/www目录实时同步
备份服务器配置:
yum install -y rsyncvi /etc/rsyncd.conf 删除文件内容改为下面
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pasmkdir /data/backup -p 创建备份目录
echo "rsyncuser:rsyncuser" > /etc/rsync.pas 创建账户认证文件
chmod 600 /etc/rsync.pas
systemctl start rsyncd
ss -tnl 确认873端口打开
主服务器配置(需要备份的服务器)
初始化环境
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/repo/Centos-7.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config
setenforce 0配置阿里源才能下载这个
yum install -y inotify-tools rsync vi /etc/sysctl.conf 修改内核参数fs.inotify.max_queued_events=100000
fs.inotify.max_user_watches=100000sysctl -pecho "rsyncuser" > /etc/rsync.pas 创建密码文件,只要密码,不要写账户
chmod 600 /etc/rsync.pas
mkdir /www -p 创建数据目录
touch /www/rsync.txt
在主服务器上手动测试上传
rsync -az --delete --password-file=/etc/rsync.pas /www/ rsyncuser@192.168.116.130::backup
备份服务器查看
ls /data/backup/
在主服务器创建脚本后台运行,这样只要主服务器的/www下的文件发生变化就会自动更新到备份服务器
vi rsync_backup.sh
#!/bin/bash
SRC='/www/'
DEST='rsyncuser@192.168.116.130::backup'
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;doFILEPATH=${DIR}${FILE}rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >>/var/log/file_backup.log
done前台运行脚本
bash rsync_backup.sh
备份服务器开启实时监控目录
watch -n0.5 ls -l /data/backup/
测试图
最后在主服务器上,设置脚本开机运行
vi /etc/rc.d/rc.local
/usr/bin/bash /root/rsync_backup.sh &chmod u+x /etc/rc.d/rc.local
四、LVS调度算法总结
调度工具:ipvsadm
安装方式:yum install -y ipvsadm
一 静态算法
-
rr:轮询,轮流调度后台数据,假如有2台web,那就是一台一次,轮流进行
-
wrr:权重轮询,根据设置的权重值进行访问,权重大的访问较多次
-
dh:请求绑定轮询:判断发起的协议类型或其他标准是不是同一种类型的请求,是的话全部调度到同台web服务器
-
sh:客户端绑定轮询,根据客户端的cookie确认以前连接后台web服务器是哪台,有的话根据cookie绑定上次连接的web服务器。没有就随机连接。
二 动态算法:
-
lc:最少连接轮询:通过查看哪个web服务器的连接量少,就提升web服务器的访问量
-
wlc:加权最少连接轮询:通过访问量和权重进行计算,优先把访问量给到少量访问的服务器上。默认算法
-
sed:最短期望延迟轮询,通过(活动数+1)*256/权重进行计算,将连接数发到计算值为最小的服务器上
-
nq:最短期望延迟不排队轮询,通过(活动数+1)*256/权重进行计算,将连接数发到计算值为最小的服务器上,但是如果此时有设备是空闲状态,会直接把请求发到这台服务器上,而不会再把请求发到计算值为最小的服务器上。
-
lblc:dh和lc加强版,根据客户端请求的是不是同一类型和连接数量进行判断。
-
lblcr:dh和lc加强版,根据客户端请求的是不是同一类型和连接数量进行判断,多了一个复制缓存功能,如果请求的设备没有数据,那么可以从其他服务器缓存过来。
术语:
VS:调度服务器,一般指部署ipvsadm软件所在的服务器
RS:代理服务器,一般指部署nginx,haproxy软件所在的服务器
CIP:客户端IP,一般指普通用户访问网站或APP所使用的IP
VIP:调度服务器使用的对外IP,就是客户端访问网站时访问的IP
DIP:调度服务器使用对内的IP,也就是调度器跟代理服务器通信所使用的IP
RIP:真实IP,也就是实际网站或APP后台服务器的真实IP地址
五、LVS的跨网络DR实现
LVS-DR:修改MAC地址进行通信
原理:
官网介绍:LVS-DR
LVS-DR实现过程:
请求过程:CIP-路由网卡1-路由网卡2-调度器VIP-RIP
接收过程:RIP-VIP-路由网卡2-路由网卡1-CIP
1. 客户端(CIP)向路由服务器发起到VIP的请求
2. 路由器第一个网卡接收客户端请求,内核映射请求给路由器的第二个网卡
3. 路由器第二个网卡转发数据给调度器的虚拟(VIP)网卡
4. 调度器请求的数据包中的MAC地址,把数据转发给web1虚拟(VIP)网卡
5. web1虚拟(VIP)网卡收到后,把数据直接返回给路由器的第二个网卡,不再经过调度器
6. 路由器的第二个网卡收到数据后,内核映射回给路由器第一个网卡
7. 路由器第一个网卡回复数据给客户端
LVS-DR特性:
- ipvsadm调度器和其他web服务器都要添加同一个对外(VIP)地址
- web服务器都要修改arp_ignore和arp_announce参数
- ipvsadm调度服务器DIP和web服务器RIP必须是要在同一个直连网络,web服务器的网关不能是调度器的IP,需要指定为路由服务服务器的网关
- 路由器服务器可以是最少是双网络,可以是多网络,只要和ipvsadm调度器服务器和web服务器有路由即可。
- 不支持端口映射,端口不能修改
- 调度器只需要修改请求报文,性能相对较好
arp_ignore和arp_announce解析:
因为配置同一个VIP,就会有IP冲突问题,所以web服务器就要修改内核参数。
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
修改方式:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
修改方式:
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
抓包分析:
根据下面的LVS-DR模型部署后
客户端 | IP:192.168.116.148,MAC:00:0c:29:df:55:8c |
---|---|
路由服务器的网卡1-ens33 | IP:192.168.116.145,MAC:00:0c:29:16:a1:b9 |
路由服务器的网卡2-ens34 | IP:10.0.0.1,MAC:00:0c:29:16:a1:c3 |
调度服务器的网卡 | IP:10.0.0.254,MAC:00:0c:29:2e:4a:3b |
web1服务器的网卡 | IP:10.0.0.2,MAC:00:0c:29:ef:c9:b1 |
客户端分析:
curl 10.0.0.100 发起请求
00:0c:29:df:55:8c 为请求的MAC地址
路由器测试
ens33网卡抓包分析
在路由器上抓取ens33的网卡,查看来自客户端(192.168.116.148 )的请求
ip a
网卡ens33的MAC:00:0c:29:16:a1:b9 和客户端同网段,可以接收客户端请求
网卡ens34的MAC:00:0c:29:16:a1:c3 和web同网段,可以接收web返回的数据
tcpdump -i ens33 -nn -e host 10.0.0.100 抓取客户端到10.0.0.100的请求
通过第一个数据包这个可看到实际是客户端的MAC访问到路由器的ens33的MAC,端口和IP不变
00:0c:29:df:55:8c > 00:0c:29:16:a1:b9, ethertype IPv4 (0x0800), length 74: 192.168.116.148.53164 > 10.0.0.100.80
通过第二个数据包这个可看到路由器的ens33网卡的MAC回复客户端的MAC,端口和IP不变
00:0c:29:16:a1:b9 > 00:0c:29:df:55:8c, ethertype IPv4 (0x0800), length 74: 10.0.0.100.80 > 192.168.116.148.53164
所以可以得到客户端一直都是和路由器的ens33网卡进行通信
调度器查看
ip a
调度器的ens33的MAC地址:00:0c:29:2e:4a:3b
抓取源为路由器ens34网卡到调度器的数据
tcpdump -i ens33 ether src 00:0c:29:16:a1:c3 -nn -e 通过第一个数据包可看到IP和端口不变,还是客户端请求10.0.0.100
可以看到调度器接收到了路由器转发过来的请求,然后调度器修改了目标MAC地址,把MAC地址改为了WEB1的MAC
00:0c:29:16:a1:c3 路由器的ens34的MAC地址
00:0c:29:ef:c9:b1 web1的真实MAC地址00:0c:29:16:a1:c3 > 00:0c:29:ef:c9:b1, ethertype IPv4 (0x0800), length 74: 192.168.116.148.53164 > 10.0.0.100.80
时间点为17:04:58.727162
路由器ens34网卡抓包分析
原本路由器2个网卡IP
ip a
网卡ens33的MAC:00:0c:29:16:a1:b9 和客户端同网段,可以接收客户端请求
网卡ens34的MAC:00:0c:29:16:a1:c3 和web同网段,可以接收web返回的数据
抓取来自源web1网卡和路由器的ens34的数据
tcpdump -i ens34 -nn -e ether src 00:0c:29:ef:c9:b1 通过第一个数据包可以看到web1返回数据给路由器的ens34网卡
00:0c:29:ef:c9:b1 web1的MAC地址
00:0c:29:16:a1:c3 路由器的ens34的MAC地址00:0c:29:ef:c9:b1 > 00:0c:29:16:a1:c3, ethertype IPv4 (0x0800), length 74: 10.0.0.100.80 > 192.168.116.148.53164