第十五周作
1、实现基于MYSQL验证的vsftpd虚拟用户访问
实现基于MYSQL验证的vsftpd虚拟用户
利用 pam_mysql 模块可以实现基于MySQL的FTP虚拟用户功能
项目网站:
PAM-MySQL
pam-mysql download | SourceForge.net
pam-mysql download | SourceForge.net
注意:因为此项目年代久远不再更新,当前只支持CentOS 6,7,不支持CentOS 8
环境准备
本实验在两台主机上实现
一台做为FTP服务器CentOS 7
一台做 Mariadb 数据库服务器
在数据库服务器上安装mysql数据库
#注意:MySQL8.0由于取消了PASSWORD()函数不支持,因此选择Mariadb
yum -y install mariadb-server
systemctl enable --now mariadb.service
在数据库服务上配置数据库支持vsftpd服务
#建立存储虚拟用户数据库和表
mysql
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_wang',password('magedu'));
mysql> INSERT INTO users(name,password) values('ftp_mage',password('magedu'));
#创建连接的数据库用户
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'10.0.0.%' IDENTIFIED BY 'magedu';
mysql> FLUSH PRIVILEGES;
在FTP服务器上安装vsftpd 和 pam_mysql包
yum -y install vsftpd
在FTP服务器上安装 pam_mysql
#对于 centos 6:pam_mysql由EPEL的源中提供
yum install pam_mysql
#对于 centos7 和 8:无对应rpm包,需手动编译安装
#注意: 当前版本的源码不支持 CentOS 8,使用中会提示下面错误
tail -f /var/log/secure
Jan 2 10:20:31 centos8 vsftpd[15519]: PAM unable to
dlopen(/usr/lib64/security/pam_mysql.so): /usr/lib64/security/pam_mysql.so:
undefined symbol: make_scrambled_password
pam-mysql 源码进行编译
#安装相关包
yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel
#下载pam-mysql源码进行编译
wget Download pam-mysql from SourceForge.net
#https://github.com/NigelCunningham/pam-MySQL/archive/v0.8.1.tar.gz
tar xvf pam_mysql-0.7RC1.tar.gz
cd 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
make install
在FTP服务器上建立pam认证所需文件
vi /etc/pam.d/vsftpd.mysql
#添加如下两行
auth required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd
table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver
db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
注意:以上参考 README文档
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()函数加密
建立相应用户和修改vsftpd配置文件
#建立虚拟用户映射的系统用户及对应的目录
useradd -s /sbin/nologin -d /data/ftproot -r vuser
#centos7 需除去ftp根目录的写权限
mkdir -pv /data/ftproot/upload
setfacl -m u:vuser:rwx /data/ftproot/upload
#确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
vim /etc/vsftpd/vsftpd.conf
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql
启动vsftpd服务
systemctl enable --now vsftpd
在FTP服务器上配置虚拟用户具有不同的访问权限
#vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
#配置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
#注意:需确保对应的映射用户对于文件系统有写权限
vim /etc/vsftpd/conf.d/ftp_wang
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
#登录目录改变至指定的目录
local_root=/data/ftproot2
2、配置samba共享,实现/www目录共享
#在samba服务器上安装samba包
yum -y install samba
#创建samba用户和组
groupadd -r admins
useradd -s /sbin/nologin -G admins ccg
smbpasswd -a ccg
useradd -s /sbin/nologin ccg1
smbpasswd -a ccg1
#创建samba共享目录,并设置SElinux
mkdir /www
chgrp admins /www
chmod 2775 /www
#samba服务器配置
vim /etc/samba/smb.conf
...省略...#在最下面添加
[share]
path = /www
write list = @admins
systemctl enable --now smb nmb
#samba客户端访问
yum -y install cifs-utils
#用ccg用户挂载smb共享并访问
mkdir /mnt/wang
mount -o username=wang //10.0.0.7/share /mnt/ccg
#用ccg1用户挂载smb共享并访问
mkdir /mnt/mage
mount -o username=mage //10.0.0.7/share /mnt/ccg1
测试
[root@client ~] touch /mnt/ccg1/test1
[root@client ~] touch /mnt/ccg/test0
[root@client ~] ll /mnt/ccg
-rwxr-xr-x 1 root root 0 Apr 18 20:13 test0
-rwxr-xr-x 1 root root 0 Apr 18 20:12 test1
[root@client ~] ll /mnt/ccg1
-rwxr-xr-x 1 root root 0 Apr 18 20:13 test0
-rwxr-xr-x 1 root root 0 Apr 18 20:12 test1
3、使用rsync+inotify实现/www目录实时同步
一、实现bak-server
1.1安装rsync
yum -y install rsync
1.2修改配置文件
uid = root
gid = root
#port = 874
#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 = /data/backup
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas
1.3 创建同步目录,生成密码文件
mkdir /www
echo "rsyncuser:magedu" > /etc/rsync.pas
chmod 600 /etc/rsync.pas
1.4 启动服务
systemctl enable --now rsyncd
#查看873端口是否正常运行
ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 5 *:873 *:*
LISTEN 0 128 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 5 [::]:873 [::]:*
二、实现data-server
2.1安装相关包
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install inotify-tools rsync -y
2.2创建密码文件
mkdir /www
echo "magedu" > /etc/rsync.pas
chmod 600 /etc/rsync.pas
三、使用脚本实现实时同步
#!/bin/bash
SRC='/www/'
DEST='rsyncuser@10.0.0.17::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
四、测试
#在bak-server查看/data/backup目录的变化
watch -n0.5 ls -l /data/backup/
#运行脚本后,创建文件进行测试;
4、LVS调度算法总结
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将被调度
1、LC:least connections 适用于长连接应用
2、WLC:Weighted LC,默认调度方法,较常用
3、SED:Shortest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接
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 版本后新增调度算法:FO和OVF
FO(Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未
过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度,属于静态算法
OVF(Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度
到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服
务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。,属
于动态算法
一个可用的真实服务器需要同时满足以下条件:
未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
真实服务器当前的活动连接数量小于其权重值
其权重值不为零
5、LVS的跨网络DR实现
一、网络配置
1.1 客户端
#客户端配置
[root@client ~]cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.10.6
GATEWAY=192.168.10.200
PREFIX=24
ONBOOT=yes
1.2 路由器配置
#启用ip_forward
[root@router ~]ip addr add 172.16.0.200/24 dev eth0
[root@router ~]echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
[root@router ~]sysctl -p
[root@router ~]cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.200
PREFIX=24
ONBOOT=yes
[root@router ~]cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=static
IPADDR=192.168.10.200
PREFIX=24
ONBOOT=yes
1.3LVS
[root@lvs ~]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
ONBOOT=yes
[root@lvs ~]route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
1.4后端服务器RS
#RS1
[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
ONBOOT=yes
[root@rs1 ~]route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@rs1 ~]yum -y install httpd;systemctl enable --now httpd;hostname -I > /var/www/html/index.html
[root@rs1 ~]curl 10.0.0.7
10.0.0.7
#RS2
[root@rs2 ~]cat /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@rs2 ~]route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@rs2 ~]yum -y install httpd;systemctl enable --now httpd;hostname -I > /var/www/html/index.html
[root@rs2 ~]curl 10.0.0.17
10.0.0.17
二、配置LVS
2.1 后端RS的IPVS配置
# LVS的IPVS配置
[root@lvs ~]ifconfig lo:1 172.16.0.100/32
#RS1的IPVS配置
[root@rs1 ~]echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]ifconfig lo:1 172.16.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/lo/arp_announce
[root@rs2 ~]ifconfig lo:1 172.16.0.100/32
2.2 实现LVS 规则
[root@lvs ~]yum -y install ipvsadm
[root@lvs ~]ipvsadm -A -t 172.16.0.100:80 -s rr
[root@lvs ~]ipvsadm -a -t 172.16.0.100:80 -r 10.0.0.7:80 -g
[root@lvs ~]ipvsadm -a -t 172.16.0.100:80 -r 10.0.0.17:80 -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 172.16.0.100:80 rr
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.17:80 Route 1 0 0
2.3 测试访问
[root@client ~]while :;do curl 10.0.0.100;sleep 1;done
10.0.0.7
10.0.0.17
10.0.0.7
10.0.0.17
10.0.0.7
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通