一、实现基于MYSQL验证的vsftpd虚拟用户访问
环境准备:
客户端:欧拉 10.0.0.13
FTP 共享服务器:centos7 10.0.0.7
数据库服务器:centos8 10.0.0.8
1.数据库服务器配置
MySQL8.0由于取消了PASSWORD()函数不支持,因此选择Mariadb
yum -y install mariadb-server
systemctl enable --now mariadb.service
#在数据库服务上配置数据库支持vsftpd服务
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);
#添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储
mysql> INSERT INTO users(name,password) values('ftp_long',password('123456'));
mysql> INSERT INTO users(name,password) values('ftp_aron',password('123456'));
#创建连接的数据库用户
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'10.0.0.%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;
2.FTP服务器配置
#在FTP服务器上安装vsftpd 和 pam_mysql包
yum -y install vsftpd
2.1 在FTP服务器上安装 pam_mysql,对于 centos7 和 8:无对应rpm包,需手动编译安装。
centos7的pam-mysql 源码进行编译
yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel
wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
tar xvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
./configure --with-pam-mods-dir=/lib64/security #pam模块路径必须指定
make && make install
2.2在FTP服务器上建立pam认证所需文件
#新建将vsftpdyuMySQL互联的pam模块配置文件
vim /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
crypt 加密方式:
0表示不加密
1表示crypt(3)加密
2表示使用mysql password()函数加密
3表示md5加密
4表示sha1加密
配置字段说明
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后
面为给此模块传递的参数
user=vsftpd为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密
2.3建立相应用户和修改vsftpd配置文件
#建立虚拟用户映射的系统用户及对应的目录
useradd -s /sbin/nologin -d /data/ftproot -r vuser
mkdir -pv /data/ftproot/upload
setfacl -m u:vuser:rwx /data/ftproot/upload
vim /etc/vsftpd/vsftpd.conf
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql
启动vsftpd服务
systemctl enable --now vsftpd
2.4 在FTP服务器上配置虚拟用户具有不同的访问权限
配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf
#添加如下选项
user_config_dir=/etc/vsftpd/conf.d/
创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/conf.d/
#配置虚拟用户的访问权限
#虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户wang具有上传文件的权
限,可修改/etc/vsftpd/vusers.d/wang文件,在里面添加如下选项并设置为YES即可,只读则设为NO
#注意:需确保对应的映射用户对于文件系统有写权限
[root@centos7 ~]#vim /etc/vsftpd/conf.d/ftp_long
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#登录目录改变至指定的目录
local_root=/data/ftproot2
3.客户端测试
二、配置samba共享,实现/www目录共享
2.1 环境准备
#Samba服务器,centos7
[root@samba-server ~]# hostname -I
10.0.0.7
[root@samba-server ~]# yum install -y samba
#Samba客户端,centos7
[root@samba-client ~]# hostname -I
10.0.0.17
[root@samba-client ~]# yum install -y samba-client
2.2 服务器配置
#配置smb用户
[root@samba-server ~]# groupadd -r smbadmins
[root@samba-server ~]# useradd -s /sbin/nologin -G smbadmins long
[root@samba-server ~]# smbpasswd -a long
\New SMB password:
Retype new SMB password:
Added user long.
[root@samba-server ~]# pdbedit -L
long:1001:
#创建共享文件目录
[root@samba-server ~]# mkdir /www
[root@samba-server ~]# chgrp smbadmins /www
[root@samba-server ~]# chmod 2775 /www #设置sgid,对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
#smb配置文件增加share
vim /etc/samba/smb.conf
[share]
path=/www
write list=long,@smbadmins
valid users=long,@ombadmins
browsbale = no
2.3 Samba客户端测试
#上传功能
[root@samba-client ~]# smbclient //10.0.0.7/share -U long%123456
smb: \> !ls
anaconda-ks.cfg
smb: \> put anaconda-ks.cfg
putting file anaconda-ks.cfg as \anaconda-ks.cfg (789.0 kb/s) (average 789.1 kb/s)
[root@samba-server ~]# ll /www/
total 4
-rwxr--r-- 1 long smbadmins 1616 Dec 25 12:35 anaconda-ks.cfg
#下载功能
[root@samba-server www]# touch f1.txt
[root@samba-client ~]# smbclient //10.0.0.7/share -U long%123456
smb: \> get f1.txt
getting file \f1.txt of size 0 as f1.txt (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)
smb: \> !ls
anaconda-ks.cfg f1.txt
#实现开机自动挂载吗,此方法需安装 smb客户端工具,cifs-utils。
[root@samba-client ~]# yum install -y cifs-utils
[root@samba-client long]# cat /etc/fstab
//10.0.0.7/share /mnt/long cifs cred=/etc/smb.txt 0 0
[root@samba-client long]# cat /etc/smb.txt
username=long
password=123456
[root@samba-client ~]# chmod 600 /etc/smb.txt
#查看验证挂载信息
[root@samba-client ~]# mount -a
[root@samba-client ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 920532 0 920532 0% /dev
tmpfs 931512 0 931512 0% /dev/shm
tmpfs 931512 9764 921748 2% /run
tmpfs 931512 0 931512 0% /sys/fs/cgroup
/dev/sda2 104806400 1516952 103289448 2% /
/dev/sda5 52403200 32992 52370208 1% /data
/dev/sda1 999320 115084 815424 13% /boot
tmpfs 186304 0 186304 0% /run/user/0
//10.0.0.7/share 104806400 1523544 103282856 2% /mnt/long
[root@samba-client ~]# cd /mnt/long/
[root@samba-client long]# ls
anaconda-ks.cfg f1.txt
三、使用rsync+inotify实现/www目录实时同步
3.1工作原理
inotify:监控同步数据服务器目录信息的变化。
rsync:完成对数据的同步。
3.2 环境搭建
#准备两台数据服务器,centos8系统,一台当主用,一台当备份数据服务器。
[root@master ~]# hostname -I
10.0.0.8
[root@backup ~]# hostname -I
10.0.0.18
#查看服务器内核是否支持inotify
[root@master ~]# ls -l /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Dec 25 13:46 max_queued_events #事件队列最大长度
-rw-r--r-- 1 root root 0 Dec 25 13:46 max_user_instances #每个用户创建inotify实例最大值
-rw-r--r-- 1 root root 0 Dec 25 13:46 max_user_watch #可以监视的文件的总数量(inotifywait 单进程)
上述值可在etc/sysctl.conf 配置文件中永久修改值,sysctl -p生效。
fs.inotify.max_queued_events=xxx
fs.inotify.max_user_watches=xxx
3.3 主用数据服务器配置
#安装inotify-tools:基于epel源
[root@master ~]# yum --enablerepo=* install inotify-tools
[root@master ~]# rpm -ql inotify-tools
/usr/bin/inotifywait #监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生
/usr/bin/inotifywatch #收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
/usr/lib/.build-id
/usr/lib/.build-id/4c
/usr/lib/.build-id/4c/50cc665007b18f08fb28fd1664b4363e77c6bf
/usr/lib/.build-id/76
/usr/lib/.build-id/76/f0034d7ea71f1d0011c7f0a9ba5c45c11f592b
/usr/lib/.build-id/cf
/usr/lib/.build-id/cf/b094946e4a3255959143feecd88504a6687c24
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools
/usr/share/doc/inotify-tools/AUTHORS
/usr/share/doc/inotify-tools/COPYING
/usr/share/doc/inotify-tools/ChangeLog
/usr/share/doc/inotify-tools/NEWS
/usr/share/doc/inotify-tools/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz
3.3 备份服务器配置
#创建备份目录文件夹
[root@backup ~]# mkdir /data/backup
#设置独立的实时同步进程
[root@backup ~]# yum install -y rsync-daemon
[root@backup ~]# rpm -ql rsync-daemon
/etc/rsyncd.conf
/etc/sysconfig/rsyncd
/usr/lib/systemd/system/rsyncd.service
/usr/lib/systemd/system/rsyncd.socket
/usr/lib/systemd/system/rsyncd@.service
/usr/share/man/man5/rsyncd.conf.5.gz
#rsync配置文件设置
root@backup ~]# cat /etc/rsyncd.conf
uid=root #提定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认为nobody
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
hosts allow = 10.0.0.0/24
[backup]
path = /data/backup/ #每个模块名对应一个不同的path目录,如果同名后面模块生效
comment = backup dir
read only = no #默认是yes,即只读
auth users = rsyncuser
secrets file = /etc/rsync.pas
#服务器端生成验证文件
[root@backup ~]# ll /etc/rsync.pas
-rw------- 1 root root 17 Dec 25 14:32 /etc/rsync.pas #为了安全,密码文件设置为600
[root@backup ~]# cat /etc/rsync.pas
rsyncuser:magedu
#启动服务
[root@backup ~]# systemctl enable --now rsyncd
[root@backup ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 5 0.0.0.0:873 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 5 [::]:873 [::]:*
LISTEN 0 128 [::]:22 [::]:*
3.4 数据服务器配置
#查看远程rsync服务器的模块信息
[root@master www]# rsync rsync://10.0.0.18
backup backup dir
[root@master www]# ll /etc/rsync.pas
-rw------- 1 root root 7 Dec 25 14:34 /etc/rsync.pas
[root@master www]# cat /etc/rsync.pas
magedu
#非交互式查看共享目录
[root@data-server ~]#rsync --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.18/backup
[root@master www]# rsync --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.18/backup
drwxr-xr-x 59 2021/12/25 15:19:02 .
-rw-r--r-- 0 2021/12/25 15:16:37 a.txt
-rw-r--r-- 0 2021/12/25 15:17:35 b.txt
-rw-r--r-- 0 2021/12/25 15:19:02 c.txt
-rw-r--r-- 0 2021/12/25 15:12:38 f1.txt
#编写数据实时同步的脚本,后台执行。
[root@master ~]# cat inotify_rsync.sh
#!/bin/bash
SRC='/www/'
DEST='rsyncuser@10.0.0.18::backup'
rpm -q rsync &> /dev/null || yum install -y 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@master ~]# bash inotify_rsync.sh &
[1] 3629
3.5 验证
#数据服务器上查看日志信息
[root@master ~]# tail /var/log/changelist.log
At 15:43:30 on 2021-12-25, file /www/d.txt was backuped up via rsync
At 15:43:30 on 2021-12-25, file /www/d.txt was backuped up via rsync
At 15:43:41 on 2021-12-25, file /www/f1.txt was backuped up via rsync
At 15:43:59 on 2021-12-25, file /www/a.txt was backuped up via rsync
四、LVS调度算法总结
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态
4.1 静态算法
仅根据算法本身进行调度
1、RR:roundrobin,轮询,较常用
2、WRR:Weighted RR,加权轮询,较常用
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的
请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存
4.2 动态算法
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
1、LC:least connections 适用于长连接应用
Overhead=activeconns*256+inactiveconns
2、WLC:Weighted LC,默认调度方法,较常用
Overhead=(activeconns*256+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等
五、LVS的跨网络DR实现
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
DR模式的特点:
- Director和各RS都配置有VIP
- 确保前端路由器将目标IP为VIP的请求报文发往Director,在前端网关做静态绑定VIP和Director的MAC地址, 在RS上使用arptables工具
- RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向
DIP,以确保响应报文不会经由Director - RS和Director要在同一个物理网络
- 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
- 不支持端口映射(端口不能修改)
- 无需开启 ip_forward
- RS可使用大多数OS系统
5.1 环境搭建
#客户端:
[lw@internet ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.10.6
PREFIX=24
GATEWAY=192.168.10.200
DNS2=180.76.76.76
ONBOOT=yes
#路由器
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@router ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.200
PREFIX=24
DNS2=180.76.76.76
ONBOOT=yes
[root@router ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=static
IPADDR=192.168.10.200
PREFIX=24
DNS2=180.76.76.76
ONBOOT=yes
#LVS调度服务器
[root@lvs-server ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.8
PREFIX=24
GATEWAY=10.0.0.200
DNS2=180.76.76.76
ONBOOT=yes
#RS1配置
[root@rs1 ~]# yum install -y httpd
[root@rs1 ~]# echo `hostname -I` >> /var/www/html/index.html;systemctl enable --now httpd.service;curl 127.0.0.1
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
10.0.0.7
[root@rs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.200
DNS2=180.76.76.76
ONBOOT=yes
#RS1配置
[root@rs2 ~]# yum install -y httpd
[root@rs2 ~]# echo `hostname -I` >> /var/www/html/index.html;systemctl enable --now httpd.service;curl 127.0.0.1
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
10.0.0.17
[root@rs2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.200
DNS2=180.76.76.76
ONBOOT=yes
#目前前环境下用户端目标地址为RIP,可正常访问,网络初始配置完成
[lw@internet ~]$ curl 10.0.0.7
10.0.0.7
[lw@internet ~]$ curl 10.0.0.17
10.0.0.17
5.2 VIP配置
准备好配置RS服务器VIP配置脚本
[root@rs1 ~]# cat lvs_dr_rs.sh
#!/bin/bash
vip=172.16.0.100
mask='255.255.255.255'
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
#加上执行权限,在RS1和RS2上分别执行
[root@rs1 ~]# chmod +x lvs_dr_rs.sh
[root@rs1 ~]# bash lvs_dr_rs.sh start
#LVS服务器VIP配置及集群服务配置脚本
[root@lvs-server ~]# cat lvs_dr_vs.sh
#!/bin/bash
#
#*************************************************************
#Author: longwei
#QQ: 1285324398
#Date: 2021-12-25
#FileName: lvs_dr_vs.sh
#URL: www.neteagles.cn
#Description: The test script
#Copyright (C): 2021 All rights reserved
#***********************************************************
vip='172.16.0.100'
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='10.0.0.7'
rs2='10.0.0.17'
scheduler='wrr' #调度算法
type='-g' #-g: gateway, dr类型,默认
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null
case $1 in
start)
ifconfig $iface $vip netmask $mask #broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler #-s,指定调度算法
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1 #-t: TCP协议的端口,VIP:TCP_PORT
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1 #-w weight:权重
echo "The VS Server is Ready!"
;;
stop)
ipvsadm -C #清空
ifconfig $iface down
echo "The VS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
#执行脚本
[root@lvs-server ~]# bash lvs_dr_vs.sh start
The VS Server is Ready!
[root@lvs-server ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP lvs-server:http wrr
-> 10.0.0.7:http Route 1 0 0
-> 10.0.0.17:http Route 1 0 0
路由器新增一个172网段
[root@router ~]# ip addr add 172.16.0.200/24 dev eth0
5.3 测试访问
使用的是静态wrr算法,根据RS1和RS2权重进行分配。
修改RS1权重为3,并测试
[root@lvs-server ~]# ipvsadm -e -t 172.16.0.100:80 -r 10.0.0.7 -g -w 3
[root@lvs-server ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP lvs-server:http wrr
-> 10.0.0.7:http Route 3 0 0
-> 10.0.0.17:http Route 1 0 0
5.4 抓包分析
1.客户端→路由器
2.路由器→lvs服务器
3.lvs服务器→RS1
4.RS1→route
5.route→客户端
可得出结论,LVS中DR模型,修改的是目标MAC地址,源地址和目标地址不作修改,且RS服务器直接将响应报文发送给路由器,不需要经过LVS服务器。