1、实现基于MYSQL验证的vsftpd虚拟用户访问

利用 pam_mysql 模块可以实现基于MySQL的FTP虚拟用户功能

项目网站: http://pam-mysql.sourceforge.net/ 注意:因为此项目年代久远不再更新,当前只支持CentOS 6,7,不支持CentOS 8

本实验在两台主机上实现

一台做为FTP服务器CentOS 7 一台做 Mariadb 数据库服务器CenotOS7

在数据库服务上配置数据库支持vsftpd服务

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
    -> );

MariaDB [vsftpd]> insert into users(name,password) values('ftp1',password('magedu'));
MariaDB [vsftpd]> insert into users(name,password) values('ftp2',password('magedu'));
MariaDB [vsftpd]> insert into users(name,password) values('ftp3',password('123456'));
MariaDB [vsftpd]> select * from users;
+----+---------+-------------------------------------------+
| id | name    | password                                  |
+----+---------+-------------------------------------------+
|  1 | ftp1    | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 |
|  3 | ftp2    | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 |
|  5 | ftp3    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+---------+-------------------------------------------+
MariaDB [vsftpd]> GRANT SELECT ON vsftpd.* TO vsftpd@'10.4.80.%' IDENTIFIED BY 'magedu';
MariaDB [vsftpd]> flush privileges;

在FTP服务器上安装vsftpd 和 pam_mysql包

[root@CN02-ASB05 ~]# yum install -y vsftpd

pam-mysql 源码进行编译

#安装相关包
[root@CN02-ASB05 ~]# yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel
[root@CN02-ASB05 ~]# tar xvf pam_mysql-0.7RC1.tar.gz
[root@CN02-ASB05 ~]# cd pam_mysql-0.7RC1/
[root@CN02-ASB05 pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security
[root@CN02-ASB05 pam_mysql-0.7RC1]# make install
[root@CN02-ASB05 pam_mysql-0.7RC1]# ll /lib64/security/pam_mysql*
-rwxr-xr-x. 1 root root    882 Jun 26 14:58 /lib64/security/pam_mysql.la
-rwxr-xr-x. 1 root root 141712 Jun 26 14:58 /lib64/security/pam_mysql.so

在FTP服务器上建立pam认证所需文件

[root@CN02-ASB05 ~]# vim /etc/pam.d/vsftpd.mysql
#添加如下两行
auth required pam_mysql.so user=vsftpd passwd=magedu host=10.4.80.11 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=magedu host=10.4.80.11 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

建立相应用户和修改vsftpd配置文件

#建立虚拟用户映射的系统用户及对应的目录
[root@CN02-ASB05 ~]# useradd -s /sbin/nologin -d /data/ftproot -r vuser
#centos7 需除去ftp根目录的写权限
[root@CN02-ASB05 ~]# mkdir -pv /data/ftproot/upload
[root@CN02-ASB05 ~]# setfacl -m u:vuser:rwx /data/ftproot/upload
#确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
[root@CN02-ASB05 ~]# vim /etc/vsftpd/vsftpd.conf
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql
#启动vsftpd服务
[root@CN02-ASB05 ~]# systemctl enable --now vsftpd

在FTP服务器上配置虚拟用户具有不同的访问权限

[root@CN02-ASB05 ~]# mkdir /etc/vsftpd/conf.d
[root@CN02-ASB05 ~]# vim /etc/vsftpd/conf.d/ftp1
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
local_root=/data/ftp1
[root@CN02-ASB05 ftp1]# mkdir upload
[root@CN02-ASB05 data]# chown vuser.vuser /data/ftp1/upload
[root@CN02-ASB05 data]# systemctl restart vsftpd
#测试
[root@CN02-ASB06 ~]# ftp 10.4.80.12
Connected to 10.4.80.12 (10.4.80.12).
220 (vsFTPd 3.0.2)
Name (10.4.80.12:root): ftp1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> pwd
257 "/upload"
ftp> put hosts
local: hosts remote: hosts
227 Entering Passive Mode (10,4,80,12,179,54).
150 Ok to send data.
226 Transfer complete.
209 bytes sent in 4.3e-05 secs (4860.47 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (10,4,80,12,183,155).
150 Here comes the directory listing.
-rw-------    1 985      979           209 Jun 26 08:18 hosts
226 Directory send OK.

2、配置samba共享,实现/www目录共享

SMB(Server Messages Block,信息服务块)是一种在局域网中实现共享文件和打印机的通信协议,能为局域网内的不同计算机之间提供文件及打印机等资源的共享服务,但SMB协议是Windows的私有协议,无法直接在Linux中使用。利用SAMBA,可在Linux系统中模拟Windows的共享服务,提供SMB协议。

1、SAMBA服务器端

1.1 安装samba [root@CN02-ASB04 /]# yum install samba 1.2 创建登录账号 [root@CN02-ASB04 /]# groupadd -r admins [root@CN02-ASB04 /]# useradd -s /sbin/nologin -G admins jin [root@CN02-ASB04 /]# smbpasswd -a jin New SMB password: Retype new SMB password: Added user jin. [root@CN02-ASB04 /]# mkdir www [root@CN02-ASB04 /]# chgrp admins www [root@CN02-ASB04 /]# chmod 2775 www 1.3 修改SAMBA共享配置文件 [root@CN02-ASB04 /]# vim /etc/samba/smb.conf

[share]
        path = /www
        write list = @admins

[root@CN02-ASB04 www]# cd /www/ [root@CN02-ASB04 www]# vim test.txt

[root@CN02-ASB04 /]# systemctl enable --now smb.service nmb.service Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service. Created symlink from /etc/systemd/system/multi-user.target.wants/nmb.service to /usr/lib/systemd/system/nmb.service.

2、SAMBA客户端

[root@CN02-ASB05 ~]# yum install cifs-utils [root@CN02-ASB05 ~]# vim /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 24 15:56:28 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=6287f9ba-f3b1-4046-b3ed-7189054be980 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
//10.4.80.11/share      /mnt/share              cifs    credentials=/etc/user.txt 0 0

[root@CN02-ASB05 ~]# cd /mnt/ [root@CN02-ASB05 mnt]# mkdir share [root@CN02-ASB05 mnt]# vim /etc/user.txt

username=jin
password=

[root@CN02-ASB05 mnt]# chmod 6000 /etc/user.txt [root@CN02-ASB05 mnt]# mount -a [root@CN02-ASB05 mnt]# df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 923636 0 923636 0% /dev tmpfs 940532 0 940532 0% /dev/shm tmpfs 940532 99916 840616 11% /run tmpfs 940532 0 940532 0% /sys/fs/cgroup /dev/mapper/centos-root 52403200 13398300 39004900 26% / /dev/sda1 1038336 299320 739016 29% /boot /dev/mapper/centos-home 49250820 33100 49217720 1% /home tmpfs 188108 12 188096 1% /run/user/42 tmpfs 188108 0 188108 0% /run/user/0 //10.4.80.11/share 52403200 18120572 34282628 35% /mnt/share

[root@CN02-ASB05 mnt]# ls /mnt/share/ test.txt

3、使用rsync+inotify实现/www目录实时同步

环境准备:

IP 操作系统及版本 作用 10.4.80.11 CETOS7 data-server,inotify 10.4.80.12 CETOS7 backup-server,rsync

安装inotify-tools:基于epel源

[root@CN02-ASB04 ~]# yum -y install inotify-tools

图片.png

创建rsync服务器的配置文件

启动rsync服务,端口873

[root@CN02-ASB05 ~]# rsync --daemon
[root@CN02-ASB05 ~]# ss -ntl

图片.png

配置rsyncd.conf

[root@CN02-ASB05 /]# vim /etc/rsyncd.conf 
You have mail in /var/spool/mail/root
[root@CN02-ASB05 /]# cat /etc/rsyncd.conf 
uid = root
gid = root
max connection = 0
ignore errors
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
exclude = lost+found/
lock file = /var/run/rsyncd.lock
reverse lookup = no

[www]
path = /www
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas

准备备份目录

[root@CN02-ASB05 /]# mkdir /www
[root@CN02-ASB05 /]# echo "rsyncuser:123456" > /etc/rsync.pas
[root@CN02-ASB05 /]# chmod 600 /etc/rsync.pas

启动rsyncd服务

[root@CN02-ASB05 /]# systemctl enable --now rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.

数据服务器配置密码文件

[root@CN02-ASB04 ~]# echo "123456" > /etc/rsync.pas
[root@CN02-ASB04 ~]# chmod 600 /etc/rsync.pas

非交互式查看共享目录

[root@CN02-ASB04 ~]# rsync --password-file=/etc/rsync.pas rsync://rsyncuser@10.4.80.12/backup
drwxr-xr-x              6 2023/10/17 13:52:33 .

shell 脚本实现实时数据同步

[root@data ~]# vim inotify_rsync.sh
#!/bin/bash
SRC='/data/www/'
DEST='rsyncuser@10.0.0.151::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@data ~]# bash inotify_rsync.sh
#在备份服务器中运行
#每0.5秒执行一次ls,查看是否可以做到实时备份 
[root@backup backup]# watch -n0.5 ls -l /data/backup/

测试

[root@CN02-ASB04 ~]# vim inotify_rsync.sh [root@CN02-ASB04 ~]# bash inotify_rsync.sh

图片.png

图片.png

4、LVS调度算法总结

LVS(Linux Virtual Server,Linux虚拟服务器)是全球最流行的四层负载均衡开源软件,属于内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”。LVS服务器负责接收用户的各类请求,并转发给提供对应服务的服务器,由提供具体服务的服务器将结果返回给用户,因此LVS提供的是代理服务功能。用户发送请求时访问的是LVS服务器,而不是提供具体服务的服务器,从而隐藏了内部服务器的ip等信息,在一定程度上也加强了安全性。

用户向LVS服务器发送请求时,如果有多台提供具体服务的服务器,LVS服务器需要考虑将用户请求转发给哪一台真实服务器或者如何分配给不同的真实服务器,此时就要使用调度算法。LVS调度算法可分为静态算法和动态算法两大类。

1.静态算法

静态算法是仅根据算法自身来进行调度,不考虑真实服务器的负载,主要有四种具体的调度算法:

1.1 RR调度算法

RR(roundrobin,轮询调度算法)调度算法指的是LVS服务器在某一个时间段内接收到一定数量的同类型用户请求后,会将所有的同类型用户请求按序转发给提供该服务的真实服务器,在一定程度上可以视为公平调度。

1.2 WRR调度算法

由于轮询调度算法并未考虑不同真实服务器的负载能力,可能会给负载能力较弱的真实服务器造成压力,在此基础上产生了WRR(Weighted RR,加权轮询调度算法)调度算法。

加权轮询调度算法会根据不同真实服务器的具体性能来设置不同的权重,负载性能越好,被分配到的权重也就越高,在LVS服务器转发用户请求时会更早、更多地接收并处理用户请求。

1.3 SH调度算法

SH(Source Hashing,源地址哈希调度算法)调度算法的功能是实现会话绑定,将来自同一个ip的用户请求始终转发给第一次处理来自该ip请求的真实服务器。不过此种调度算法弊端也比较明显,例如处理来自该ip用户请求的真实服务器出现故障后无法进行请求转发,此外来自同一个ip之下的用户量可能会非常大,全部转发给某一台真实服务器会对该服务器负载造成巨大压力。

1.4 DH(Destination Hashing)调度算法

DH(Destination Hashing,目标地址哈希调度算法)调度算法是指LVS服务器第一次接收到某一类的用户请求时,会转发至后端处理该类请求的服务器,后续如果再有同类的用户请求将始终转发至第一次挑中的真实服务器,典型使用场景是正向代理缓存场景中的负载均衡,如 web缓存。

2.动态算法

使用动态算法时会考虑到真实服务器的负载能力,并生成一个Overhead值,真实服务器的Overhead值越小,说明服务器越空闲、负载越轻,接收到LVS服务器转发用户请求的优先度越高。动态算法主要有6中具体的调度算法:

2.1 LC调度算法

LC(least connections,最少连接调度算法)调度算法适用于长连接应用,LVS服务器通过真实服务器当前活跃的连接数来估计负载状态,把最新的连接请求分配给当前连接数最少的真实服务器。LVS服务器会记录每个真实服务器已建立连接的数量,当一个用户请求被转发至某一台真实服务器时,其连接数加1,当连接中断或超时时,其连接数会减1。

2.2 WLC调度算法

WLC(Weighted LC,加权最少连接调度算法)调度算法是默认调度算法,在最少连接调度算法的基础上加入了权重。使用此种调度算法时,不同负载性能的真实服务器会被赋予不同的权重,性能越好,被赋予的权重也就越大,所得到的Overhead值也就越小,在LVS服务器转发请求时将被优先分配。

2.3 SED调度算法

SED(Shortest Expection Delay,最短延迟调度算法)调度算法是对加权最少连接调度算法的改进,该算法只检查活动连接,而不考虑非活动连接,初始连接高权重优先。但此种算法的一个弊端是,如果某一台真实服务器的初始连接权重很高,可能会被分配大量的用户请求,而其他真实服务器一直处于空闲状态。

2.4 NQ调度算法

NQ(Never Queue,无需队列调度算法)调度算法会在第一轮采用轮询调度算法,LVS服务器给所有符合条件的真实服务器都分配一个用户请求,从第二轮开始将采用最短延迟调度算法。

2.5 LBLC调度算法

LBLC(Locality-Based LC,基于局部的最少连接调度算法)调度算法属于动态的目标地址哈希调度算法,根据负载状态实现正向代理。LVS服务器会根据用户的ip和请求内容找到最近访问过的真实服务器,如果该真实服务器处于可用状态且无超载现象,则将用户请求再次转发到该真实服务器;如果该真实服务器暂时无法处理用户请求,则使用最少连接调度算法转发给一个能满足用户请求的真实服务器。

2.6 LBLCR调度算法

LBLCR(LBLC with Replication,带复制的基于局部最少连接调度算法)调度算法是在LBLC调度算法的基础上加入了复制功能,从而解决LBLC负载不均衡问题,将web缓存等从负载重的真实服务器复制到负载轻的真实服务器上。

3.FO调度算法和OVF调度算法

FO调度算法和OVF调度算法是内核版本4.15后新增调度算法。

3.1 FO调度算法

FO(Weighted Fail Over)调度算法属于静态算法,在FO调度算法中,LVS服务器会遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器服务器来进行调度。

3.2 OVF调度算法

OVF(Overflow-connection)调度算法属于动态算法,基于真实服务器的活动连接数量和权重值实现,LVS服务器将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。

5、LVS的跨网络DR实现

https://blog.51cto.com/u_13954570/8735121