1、实现基于MYSQL验证的vsftpd虚拟用户访问
环境:
mysql5.7:192.168.184.147
FTP服务器:192.168.184.129
安装配置mysql5.7:
#配置mysql yum源
[root@centos01 ~]# cat /etc/yum.repos.d/mysql.repo
[mysql]
name=mysql5.7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
gpgcheck=0
#安装mysql
[root@centos01 ~]#yum -y install mysql-community-server
[root@centos01 ~]# systemctl enable --now mysqld
[root@centos01 ~]# grep password /var/log/mysqld.log
2022-03-15T05:30:33.949578Z 1 [Note] A temporary password is generated for root@localhost: h<MqzK,ss8hp
[root@centos01 ~]#mysql -uroot -p'h<MqzK,ss8hp'
mysql> alter user root@'localhost' identified by 'Zhrmghg@2022';
#创建FTP虚拟用户数据库和表
mysql> create database vsftpd;
mysql> use vsftpd;
mysql> create table users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL
);
#添加虚拟用户
mysql> insert into users(name,password) values('user1',password('Zhrmghg@2022'));
mysql> insert into users(name,password) values('user2',password('Zhrmghg@2022'));
#创建数据库连接用户
mysql> grant select on vsftpd.* to vsftpd@'192.168.184.%' identified by 'Zhrmghg@2022';
mysql> flush privileges;
FTP服务器安装vsftpd和pam_mysql:
#配置mysql yum源
[root@centos02 ~]# cat /etc/yum.repos.d/mysql.repo
[mysql]
name=mysql5.7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
gpgcheck=0
#安装vsftpd和相关包
[root@centos02 ~]# yum -y install vsftpd gcc gcc-c++ make mysql-community-devel pam-devel
#下载pam_mysql源码进行编译
[root@centos02 ~]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@centos02 ~]# tar xvf pam_mysql-0.7RC1.tar.gz
[root@centos02 ~]# cd pam_mysql-0.7RC1
[root@centos02 pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security
[root@centos02 pam_mysql-0.7RC1]# make install
#使用以上官网包报错:
[root@centos02 ~]# tail -f /var/log/secure
Mar 15 17:01:57 centos02 vsftpd[14674]: PAM unable to dlopen(/usr/lib64/security/pam_mysql.so): /usr/lib64/security/pam_mysql.so: undefined symbol: make_scrambled_password
Mar 15 17:01:57 centos02 vsftpd[14674]: PAM adding faulty module: /usr/lib64/security/pam_mysql.so
#重新改用rpm包安装
[root@centos02 ~]# wget http://repo.iotti.biz/CentOS/7/x86_64/pam_mysql-0.8.1-0.22.el7.lux.x86_64.rpm
[root@centos02 ~]# yum install pam_mysql-0.8.1-0.22.el7.lux.x86_64.rpm
[root@centos02 upload]# ll /lib64/security/pam_mysql*
-rwxr-xr-x 1 root root 868 Mar 15 17:17 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 50784 Sep 21 2017 /lib64/security/pam_mysql.so
#建立pam认证所需文件
[root@centos02 pam_mysql-0.7RC1]# cat /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=Zhrmghg@2022 host=192.168.184.147 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=Zhrmghg@2022 host=192.168.184.147 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
#建立虚拟用户映射的系统用户及对应的目录
[root@centos02 ~]# useradd -s /sbin/nologin -d /data/ftproot -r vuser
[root@centos02 ~]# mkdir -pv /data/ftproot/upload
[root@centos02 ~]# setfacl -m u:vuser:rwx /data/ftproot/upload
[root@centos02 ~]# vim /etc/vsftpd/vsftpd.conf
#添加:
guest_enable=YES
guest_username=vuser
#修改:
pam_service_name=vsftpd.mysql
#启动vsftpd服务
[root@centos02 ~]# systemctl enable --now vsftpd
#配置虚拟用户使用各自的配置文件
[root@centos02 ~]# vim /etc/vsftpd/vsftpd.conf
添加:
user_config_dir=/etc/vsftpd/conf.d/
[root@centos02 ~]# mkdir /etc/vsftpd/conf.d/
[root@centos7 ~]# systemctl restart vsftpd
#创建用户配置文件
[root@centos7 ~]# vim /etc/vsftpd/conf.d/user1
#若设置为只读,则将下面YES改为NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/user1
#创建相应文件夹
[root@centos02 ~]# mkdir -pv /data/user1/upload
[root@centos02 ~]# chown vuser.vuser /data/user1/upload/
测试登录:
[root@centos03 ~]# ftp 192.168.184.129
Connected to 192.168.184.129 (192.168.184.129).
220 (vsFTPd 3.0.2)
Name (192.168.184.129:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,184,129,62,71).
150 Here comes the directory listing.
drwxr-xr-x 2 997 993 6 Mar 15 09:55 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,184,129,73,132).
150 Ok to send data.
226 Transfer complete.
1501 bytes sent in 5e-05 secs (30020.00 Kbytes/sec)
2、配置samba共享,实现/www目录共享
#安装samba
[root@centos01 ~]# yum -y install samba
#创建系统账号
[root@centos01 ~]# useradd smbuser1
#将系统账号转换为samba账号
[root@centos01 ~]# smbpasswd -a smbuser1
New SMB password:
Retype new SMB password:
Added user smbuser1.
#查看已有的samba账号
[root@centos01 ~]# pdbedit -L
smbuser1:2006:
#创建共享目录
[root@centos01 ~]# mkdir /www
#配置共享目录允许smbuser1读写
[root@centos01 ~]# vi /etc/samba/smb.conf
#添加以下内容:
[www]
path=/www
writable=no
write list=smbuser1
#修改文件系统权限
[root@centos01 ~]# chmod o+w /www/
#启动samba服务
[root@centos01 ~]# systemctl enable --now smb
客户端验证:
#安装客户端
[root@centos03 ~]# yum -y install samba-client
#上传文件
[root@centos03 ~]# smbclient //192.168.184.147/www/ -U smbuser1%123456
Try "help" to get a list of possible commands.
smb: \> put anaconda-ks.cfg
putting file anaconda-ks.cfg as \anaconda-ks.cfg (21.6 kb/s) (average 21.6 kb/s)
smb: \> ls
. D 0 Thu Mar 17 17:43:51 2022
.. D 0 Thu Mar 17 16:38:45 2022
anaconda-ks.cfg A 1501 Thu Mar 17 17:43:51 2022
103754244 blocks of size 1024. 95902648 blocks available
3、使用rsync+inotify实现/www目录实时同步
环境:
备份服务器:192.168.184.129
数据服务器:192.168.184.147
安装配置rsync
[root@centos02 ~]# yum -y install rsync
[root@centos02 ~]# vi /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.pas
#创建备份目录
[root@centos02 ~]# mkdir /data/backup
#生成验证文件
[root@centos02 ~]# echo "rsyncuser:123456" > /etc/rsync.pas
[root@centos02 ~]# chmod 600 /etc/rsync.pas
#启动rsyncd服务
[root@centos02 ~]# systemctl enable --now rsyncd
数据服务器:
#安装rsync
[root@centos01 /]# yum -y install rsync
#查看备份服务器上的共享目录
[root@centos02 backup]# rsync rsync://192.168.184.129
backup backup dir
#创建认证文件
[root@centos01 /]# echo "123456" > /etc/rsync.pas
#手动同步目录
[root@centos01 /]# rsync -az --delete --password-file=/etc/rsync.pas /www/ rsyncuser@192.168.184.129::backup
#安装inotify工具
[root@centos01 ~]# yum -y install inotify-tools
#创建inotify脚本
[root@centos01 ~]# vi inotify_rsync.sh
#!/bin/bash
SRC='/www/'
DEST='rsyncuser@192.168.184.129::backup'
rpm -q rsync &> /dev/null || yum -y install rsync
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;do
FILEPATH=${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/changelist.log
done
#后台运行脚本
[root@centos01 ~]# bash inotify_rsync.sh &
测试:
#对数据服务器/www目录下文件进行修改
[root@centos01 ~]# cp /etc/passwd /www/
[root@centos01 ~]# echo "test line" > /www/index.html
#查看备份服务器/data/backup目录下文件
[root@centos02 backup]# ls /data/backup/
index.html passwd
[root@centos02 backup]# cat /data/backup/index.html
test line
4、LVS调度算法总结
主要有静态调度算法和动态调度算法:
静态调度算法:不考虑后端服务器当前的负载情况,仅根据算法本身进行调度
动态调度算法:考虑后端服务器当前的负载情况
静态算法:
1、RR:roundrobin,轮询,较常用
2、WRR:Weighted RR,加权轮询,较常用
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing,目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存
动态算法:
- 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
- 其中Overhead的值越小,说明服务器负载越小,可以优先被调度。
1、LC:least connections 适用于长连接应用
Overhead=activeconns256+inactiveconns
activeconns:正处于连接的、活跃状态的连接、有数据在传输才表示活动状态的连接
inactiveconns:连接但是并未进行数据连接
2、WLC:Weighted LC,默认调度方法,较常用
Overhead=(activeconns256+inactiveconns)/weight
3、SED:Shortest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接
Overhead=(activeconns+1)*256/weight
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理,实现Web Cache等
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,,实现Web Cache等
内核版本 4.15 版本后新增调度算法:
1、FO(Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度,属于静态算法
2、OVF(Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。,属于动态算法
5、LVS的跨网络DR实现
服务器网络配置:
名称 | 接口 | IP | 网关 |
---|---|---|---|
client | eth0 | 192.168.189.10/24 | 192.168.189.11 |
route | eth1 | 192.168.189.11/24 | - |
route | eth0 | 192.168.184.102/24 | - |
lvs | eth0 | 192.168.184.103 | 192.168.184.102 |
rs1 | eth0 | 192.168.184.104 | 192.168.184.102 |
rs2 | eth0 | 192.168.184.105 | 192.168.184.102 |
route配置:
#开启ip_forward转发
[root@route ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@route ~]# vi /etc/sysctl.conf
lvs配置:
#安装lvs管理工具
[root@lvs ~]# yum -y install ipvsadm
#配置VIP
[root@lvs ~]# ifconfig lo:1 192.168.184.100/32
#配置调度算法及DR模式
[root@lvs ~]# ipvsadm -A -t 192.168.184.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.184.100:80 -r 192.168.184.104 -g
[root@lvs ~]# ipvsadm -a -t 192.168.184.100:80 -r 192.168.184.105 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.184.100:80 rr
-> 192.168.184.104:80 Route 1 0 0
-> 192.168.184.105:80 Route 1 0 0
rs1和rs2配置:
#两台rs上都安装配置httpd
[root@rs1 ~]# yum -y install httpd;hostname -I > /var/www/html/index.html;systemctl enable --now httpd
#修改内存参数,关闭arp广播
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#添加VIP
[root@rs1 ~]# ifconfig lo:1 192.168.184.100/32
#以上命令在rs2上也同样执行
client上进行验证:
[root@client ~]# curl 192.168.184.100
192.168.184.105
[root@client ~]# curl 192.168.184.100
192.168.184.104
[root@client ~]# curl 192.168.184.100
192.168.184.105
[root@client ~]# curl 192.168.184.100
192.168.184.104