1、实现基于MYSQL验证的vsftpd虚拟用户访问
本实验在两台主机上实现
一台做为FTP服务器CentOS 7
一台做 MySQL(不要使用8.0) 或 Mariadb 数据库服务器
- 在数据库服务器上安装mysql数据库
#注意:MySQL8.0由于取消了PASSWORD( )函数不支持,因此选择Mariadb
[root@centos8 ~]#yum -y install mariadb-server
[root@centos8 ~]#systemctl enable --now mariadb
- 在数据库服务器上配置数据库支持vsftpd服务
#建立存储虚拟用户数据库和表
[root@centos8 ~]#mysql
MariaDB [(none)]> CREATE DATABASE vsftpd;
MariaDB [(none)]> USE vsftpd;
MariaDB [vsftpd]> CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL
);
#添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储
MariaDB [vsftpd]> insert users (name,password) values('alice',password('123456'));
MariaDB [vsftpd]> insert users (name,password) values('bob',password('654321'));
#创建连接的数据库用户
MariaDB [vsftpd]> grant select on vsftpd.* to [vsftpd@'10.0.0.%](mailto:vsftpd@'10.0.0.%25)' identified by '123456';
- 在FTP服务器上安装vsftpd
[root@centos7 ~]#yum -y install vsftpd
- 在FTP服务器上安装pam_mysql
对于centos6:pam_mysql由EPEL的源中提供
[root@centos6 ~]#yum install pam_mysql
对于centos7:无对应rpm包,需手动编译安装
注意:当前版本的源码不支持CentOS8
pam-mysql源码进行编译
#安装相关包
[root@centos7 ~]#yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel
#下载pam-mysql源码进行编译
[root@centos7 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
#https://github.com/NigelCunningham/pam-MySQL/archive/v0.8.1.tar.gz
[root@centos7 ~]#tar xvf pam_mysql-0.7RC1.tar.gz
[root@centos7 ~]#cd pam_mysql-0.7RC1/
[root@centos7 pam_mysql-0.7RC1]#./configure --with-pam-mods-dir=/lib64/security
#如果上面命令不指定 --with-pam-mods-dir=/lib64/security 会报以下错误
#checking if the second argument of pam_conv.conv() takes const pointer… no
configure:error:Your system doesn’t appear to be configured to use PAM. Perhaps you need to specify the correct location where the PAM modules reside.
[root@centos7 pam_mysql-0.7RC1]#make install
[root@centos7 pam_mysql-0.7RC1]#ll /lib64/security/pam_mysql*
-rwxr-xr-x 1 root root 882 Dec 17 14:34 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141712 Dec 17 14:34 /lib64/security/pam_mysql.so
- 在FTP服务器上建立pam认证所需文件
[root@centos7 ~]#vi /etc/pam.d/vsftpd.mysql
#添加如下两行
auth required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.8 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.8 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
注意:以上参考README文档
- 建立相应用户和修改vsftpd配置文件
#建立虚拟用户映射的系统用户及对应的目录
[root@centos7 ~]#useradd -s /sbin/nologin -d /data/ftproot -r vuser
#centos7 需除去ftp根目录的写权限
[root@centos7 ~]#mkdir -pv /data/ftproot/upload
[root@centos7 ~]#setfacl -m u:vuser:rwx /data/ftproot/upload
#确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql
启动vsftpd服务
[root@centos7 ~]#systemctl enable --now vsftpd
- 在FTP服务器上配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
#配置vsftpd为虚拟用户使用配置文件目录
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
#添加如下选项
user_config_dir=/etc/vsftpd/conf.d/
#创建所需要目录,并为虚拟用户提供配置文件
[root@centos7 ~]#mkdir /etc/vsftpd/conf.d/
#配置虚拟用户的访问权限
#虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户alice具有上传文件的权限,可修改/etc/vdftpd/conf.d/alice文件,在里面添加如下选项并设置为YES即可,只读则设为NO
#注意:需确保对应的映射用户对于文件系统有写权限
[root@centos7 ~]#vim /etc/vsftpd/conf.d/alice
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#登录目录改变至指定的目录
local_root=/data/ftproot1
2、配置samba共享,实现/www目录共享
一、samba服务器
1、安装samba包
# yum -y install samba
2、创建用户组
# groupadd -r admins
# useradd -s /sbin/nologin -G admins smb1
# useradd -s /sbin/nologin -G admins smb2
# id smb1 && id smb2
uid=1005(smb1) gid=1005(smb1) groups=1005(smb1),994(admins)
uid=1003(smb2) gid=1003(smb2) groups=1003(smb2),994(admins)
3、创建samba用户
# smbpasswd -a smb1
New SMB password: #123456
Retype new SMB password:
Added user smb1.
# smbpasswd -a smb2
New SMB password: #654321
Retype new SMB password:
Added user smb2.
# pdbedit -L # 查看用户列表
smb1:1005:
smb2:1003:
4、创建samba共享目录
# mkdir /www
# chgrp admins /www
# chmod 2775 /www
5、添加配置文件
# vi /etc/samba/smb.conf
#在最下面添加即可
[share]
#配置默认所有用户只可读
path = /www
write list = @admins #组admins列表用户不但可读,还可写
6、启动samba服务
# systemctl enable --now smb nmb
二、客户端
1、安装客户端连接工具
#yum -y install cifs-utils
2、客户端挂载CIFS文件系统
# mkdir /mnt/smb{1,2} -pv
mkdir: created directory '/mnt/smb1'
mkdir: created directory '/mnt/smb2'
# mount -o username=smb1 //10.0.0.7/share /mnt/smb1
Password for smb1@//10.0.0.7/share: ******
# mount -o username=smb2 //10.0.0.7/share /mnt/smb2
Password for smb2@//10.0.0.7/share: ******
# df -h
tmpfs 376M 0 376M 0% /run/user/0
//10.0.0.7/share 50G 1.7G 49G 4% /mnt/smb1
//10.0.0.7/share 50G 1.7G 49G 4% /mnt/smb2
三、测试
#可写测试
# touch /mnt/smb1/smb1file.txt
# touch /mnt/smb2/smb2file.txt
# echo "hello smb1" > /mnt/smb1/smb1file.txt
# echo "hello smb2" > /mnt/smb2/smb2file.txt
# 可读测试
# cat /mnt/smb1/smb1file.txt
hello smb1
# cat /mnt/smb2/smb2file.txt
hello smb2
3、使用rsync+inotify实现/www目录实时同步
- 在10.0.0.18上搭建备份服务器
[root@centos8 ~]#hostnamectl set-hostname backup.magedu.org
[root@backup ~]#dnf -y install rsync-daemon
#创建rsync服务器的配置文件
[root@backup ~]#vim /etc/rsyncd.conf
uid = root #指定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认为nobody
gid = root #默认为nobody
#port = 874 可指定非标准端口,默认873/tcp
#use chroot = no
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
#hosts allow = 10.0.0.0/24
[backup] #每个模块名对应一个不同的path目录,如果同名后面模块生效
path = /data/backup/
comment = backup dir
read only = no #默认是yes,即只读
auth users = rsyncuser #默认anonymous可以访问rsync服务器
secrets file = /etc/rsync.pas
#服务器端准备目录
[root@backup ~]#mkdir -pv /data/backup
#服务器端生成验证文件
[root@backup ~]#echo "rsyncuser:magedu" > /etc/rsync.pas
[root@backup ~]#chmod 600 /etc/rsync.pas
#服务器端启动rsync服务
[root@backup ~]#systemctl enable --now rsyncd
- 在数据服务器(10.0.0.8)上,创建inotify_rsync.sh脚本
注意:此脚本执行前先确保两主机初始数据处于同步状态,此脚本实现后续的数据同步
#客户端配置密码文件
[root@data ~]#echo "magedu" > /etc/rsync.pas
[root@data ~]#chmod 600 /etc/rsync.pas
#创建inotify_rsync.sh脚本
[root@data ~]#vim inotify_rsync.sh
#!/bin/bash
SRC='/data/www/' #注意最后的/
DEST='rsyncuser@10.0.0.18::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
#查看文件传输日志
[root@data ~]#tail -f /var/log/changelist.log
4、LVS调度算法总结
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态
分为两种:静态方法和动态方法
1 静态方法
仅根据算法本身进行调度
- RR:roundrobin,轮询,较常用
- WRR:Weighted RR,加权轮询,较常用
- SH:Source Hashing,实现session sticky,源IP地址hash,将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
- DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:Web缓存
2 动态方法
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
- LC:least connections适用于长连接应用
Overhead=activeconns*256+inactiveconns - WLC:Weight LC,默认调度方法,较常用
Overhead=(activeconns*256+inactiveconns)/weight - SED:Shortest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接
Overhead=(activeconns+1)*256/weight - NQ:Never Queue,第一轮均匀分配,后续SED
- LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理,实现Web Cache等
- LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,实现Web Cache等
3 内核版本4.15版本后新增调度算法:FO和OVF
FO(Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度,属于静态算法
OVF(Overflow-connection)调度算法,基于真实服务器的活动连接数和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。属于动态算法
一个可用的真实服务器需要同时满足以下条件:
未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
真实服务器当前的活动连接数量小于其权重值
其权重值不为零
5、LVS的跨网络DR实现
环境:
五台主机
一台:客户端 eth0:仅主机 192.168.10.6/24 GW:192.168.10.200
一台:ROUTER
eth0:NAT 10.0.0.200/24
eth1:仅主机 192.168.10.200/24
启用 IP_FORWARD
一台:LVS
eth0:NAT:10.0.0.8/24 GW:10.0.0.200
两台RS:
RS1:eth0:NAT:10.0.0.7/24 GW:10.0.0.200
RS1:eth0:NAT:10.0.0.17/24 GW:10.0.0.200
1. LVS的网络配置
#所有主机禁用iptables和SELinux
#internet主机环境
[root@ubuntu1804 ~]#vi /etc/netplan/01-netcfg.yaml
address:
- 192.168.10.6/24
gateway4:192.168.10.200
[root@ubuntu1804 ~]#netplan apply #生效
##路由器的网络配置
[root@router ~]#vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.200
PREFIX=24
ONBOOT=yes
#添加网卡eth1(虚拟机右击设置 --- 添加 --- 网络适配器 --- 仅主机 )
[root@router ~]#vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=static
IPADDR=192.168.10.200
PREFIX=24
ONBOOT=yes
#打开路由器的转发功能
[root@router ~]#vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@router ~]#sysctl -p #生效
#RS1的网络配置
[root@rs1 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@rs1 ~]#yum -y install httpd
[root@rs1 ~]#systemctl enable --now httpd
[root@rs1 ~]#hostname -I > /var/www/html/index.html
[root@rs1 ~]#vim /var/www/html/index.html
rs1 10.0.0.7
#RS2的网络配置
[root@rs2 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@rs2 ~]#yum -y install httpd
[root@rs2 ~]#systemctl enable --now httpd
[root@rs2 ~]#hostname -I > /var/www/html/index.html
[root@rs2 ~]#vim /var/www/html/index.html
rs2 10.0.0.17
#LVS的网络配置
[root@lvs ~]#vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.8
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
2. 后端RS的IPVS配置
#RS1的IPVS配置
[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/all/arp_announce
[root@rs1 ~]#ifconfig lo:1 10.0.0.100/32
#RS2的IPVS配置
[root@rs2 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]#ifconfig lo:1 10.0.0.100/32
3. LVS主机的配置
#在LVS上添加VIP
[root@lvs ~]#ifconfig lo:1 10.0.0.100/32
#实现LVS规则
[root@lvs ~]#dnf -y install ipvsadm
[root@lvs ~]#ipvsadm -A -t 10.0.0.100:80 -s rr
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7 -g
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17 -g
4. 测试访问
[root@ubuntu1804 ~]#while :;do curl 10.0.0.100;sleep 1;done
rs1 10.0.0.7
rs2 10.0.0.17
rs1 10.0.0.7
rs2 10.0.0.17
rs1 10.0.0.7
rs2 10.0.0.17