1、实现基于MYSQL验证的vsftpd虚拟用户访问
#利用 pam_mysql 模块可以实现基于MySQL的FTP虚拟用户功能
#项目网站:http://pam-mysql.sourceforge.net/
#说明:因为此项目年代久远不再更新,当前只支持CentOS 6,7,不支持CentOS 8
环境准备:
本实验在两台主机上实现
一台作为FTP服务器centos7
一台作为mariadb数据库服务器centos8
#在数据库服务器安装mariadb数据库
[root@mariadb ~]#yum install -y mariadb-server;systemctl enable --now mariadb
#在数据库服务器上配置数据库支持vsftpd服务
[root@mariadb ~]#mysql
MariaDB [(none)]> create database vsftpd;
Query OK, 1 row affected (0.000 sec)
MariaDB [(none)]> use vsftpd;
Database changed
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);
Query OK, 0 rows affected (0.003 sec)
MariaDB [vsftpd]> insert into users(name,password) values('ftp_tan',password('123456'));
Query OK, 1 row affected (0.001 sec)
MariaDB [vsftpd]> insert into users(name,password) values('ftp_liang',password('123456'));
Query OK, 1 row affected (0.001 sec)
MariaDB [vsftpd]> select * from users;
+----+-----------+-------------------------------------------+
| id | name | password |
+----+-----------+-------------------------------------------+
| 1 | ftp_tan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | ftp_liang | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+-----------+-------------------------------------------+
2 rows in set (0.000 sec)
#创建连接数据库的用户
MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.000 sec)
MariaDB [vsftpd]> flush privileges;
Query OK, 0 rows affected (0.000 sec)
#在ftp服务器上安装vsftpd和pam_mysql的包
[root@ftp ~]# yum install -y vsftpd
#对于centos6,pam_mysql的包由epel源提供,对于centos7无对应的rpm包,需要手动编译安装
#当前版本的源码不支持centos8,使用中会提示如下错误
[root@centos8 ~]#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
#centos7编译安装pam_mysql
[root@ftp ~]# yum install -y gcc gcc-c++ make mariadb-devel pam-devel
[root@ftp ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@ftp ~]# tar xf pam_mysql-0.7RC1.tar.gz
[root@ftp ~]# cd pam_mysql-0.7RC1
[root@ftp pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security
[root@ftp pam_mysql-0.7RC1]# make install
[root@ftp pam_mysql-0.7RC1]# ll /lib64/security/pam_mysql.*
-rwxr-xr-x 1 root root 882 Nov 18 17:02 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141712 Nov 18 17:02 /lib64/security/pam_mysql.so
#在ftp服务器上建立pam认证所需要的文件
[root@ftp ~]# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.150 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.150 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
#说明:配置参数参考pam_mysql-0.7RC1目录下的README文档
配置字段说明
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()函数加密
crypt 加密方式:
0表示不加密
1表示crypt(3)加密
2表示使用mysql password()函数加密
3表示md5加密
4表示sha1加密
#建立相应用户和修改vsftpd配置文件
[root@ftp ~]# useradd -s /sbin/nologin -d /data/ftproot -r vuser
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql
#启动vsftpd服务
[root@ftp ~]# systemctl enable --now vsftpd
#在ftp服务器上配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
[root@ftp ~]#vim /etc/vsftpd/vsftpd.conf
#添加如下选项
user_config_dir=/etc/vsftpd/conf.d/
#创建所需要目录,并为虚拟用户提供配置文件
[root@ftp ~]#mkdir /etc/vsftpd/conf.d/
#配置虚拟用户的访问权限
#虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户tan具有上传文件的权限,可修改/etc/vsftpd/conf.d/ftp_tan文件,在里面添加如下选项并设置为YES即可,只读则设为NO
#注意:需确保对应的映射用户对于文件系统有写权限
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
#登录目录改变至指定的目录
local_root=/data/ftproot2
[root@ftp ~]# cat /etc/vsftpd/conf.d/ftp_tan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@ftp ~]# cat /etc/vsftpd/conf.d/ftp_liang
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
local_root=/data/ftproot2
#ftp_tan用户还是访问根目录/data/ftproot,ftp服务放开了上传权限,再在文件系统放开vuser写权限
[root@ftp ~]#chmod 555 /data/ftproot
[root@ftp ~]# mkdir -pv /data/ftproot/upload
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/ftproot’
mkdir: created directory ‘/data/ftproot/upload’
[root@ftp ~]#setfacl -m u:vuser:rwx /data/ftproot/upload
[root@ftp ~]#touch /data/ftproot/f1
#ftp_liang用户访问的ftp根目录该为了/data/ftproot2,需要去掉写权限,否则此用户登录失败
[root@ftp ~]# chmod 555 /data/ftproot2
[root@ftp ~]#touch /data/ftproot2/f2
#测试:使用ftp_tan用户上传文件成功,ftp_liang用户登录看到/data/ftproot2目录下的文件成功
[root@mariadb ~]#ftp 10.0.0.152
Connected to 10.0.0.152 (10.0.0.152).
220 (vsFTPd 3.0.2)
Name (10.0.0.152:root): ftp_tan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,152,184,151).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 18 09:45 f1
drwxrwxr-x 2 0 0 6 Nov 18 09:12 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> send anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (10,0,0,152,41,212).
150 Ok to send data.
226 Transfer complete.
1314 bytes sent in 0.000241 secs (5452.28 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (10,0,0,152,239,137).
150 Here comes the directory listing.
-rw------- 1 998 996 1314 Nov 18 09:54 anaconda-ks.cfg
226 Directory send OK.
[root@mariadb ~]#ftp 10.0.0.152
Connected to 10.0.0.152 (10.0.0.152).
220 (vsFTPd 3.0.2)
Name (10.0.0.152:root): ftp_liang
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,152,142,203).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 18 10:16 f2
226 Directory send OK.
ftp>
2、配置samba共享,实现/www目录共享
#服务器端配置:
[root@samba ~]#yum install -y samba
[root@samba ~]#groupadd -r www
[root@samba ~]#useradd -s /sbin/nologin -G www test1
[root@samba ~]#smbpasswd -a test1
New SMB password:
Retype new SMB password:
Added user test1.
[root@samba ~]#useradd -s /sbin/nologin test2
[root@samba ~]#smbpasswd -a test2
New SMB password:
Retype new SMB password:
Added user test2.
[root@samba ~]#mkdir /www
[root@samba ~]#chgrp www /www
[root@samba ~]#chmod 2775 /www
[root@samba ~]#vim /etc/samba/smb.conf
#加上一下这段配置。设置共享目录为/www,设置www组中用户有写权限
[share]
path = /www
write list = @www
#启动服务
[root@samba ~]#systemctl enable --now smb nmb
#客户端配置
[root@client ~]# yum install -y cifs-utils
#分别用test1,test2用户进行挂载共享目录
[root@client ~]# mkdir /mnt/test1
[root@client ~]# mkdir /mnt/test2
[root@client ~]# mount -o username=test1 //10.0.0.150/share /mnt/test1
Password for test1@//10.0.0.150/share: ******
[root@client ~]# mount -o username=test2 //10.0.0.150/share /mnt/test2
Password for test2@//10.0.0.150/share: ******
[root@client ~]# echo "test1" >> /mnt/test1/test.txt
[root@client ~]# cat /mnt/test1/test.txt
test1
[root@client ~]# touch /mnt/test2/test.txt
touch: cannot touch ‘/mnt/test2/test.txt’: Permission denied
#说明:test1用户在www组,samba服务给了www组写的权限,test2用户不在www组,因此创建文件失败。
#配置自动挂载
[root@client ~]# cat /etc/smb.txt
username=test1
password=123456
[root@client ~]# chmod 600 /etc/smb.txt
[root@client ~]# echo "//10.0.0.150/share /mnt/test1 cifs credentials=/etc/smb.txt 0 0" >> /etc/fstab
#自动挂载测试ok
[root@client ~]# mount -a
[root@client ~]# ll /mnt/test1
total 4
-rwxr-xr-x 1 root root 6 Nov 18 18:40 test.txt
[root@client ~]# yum install -y samba-client
[root@client ~]# smbclient //10.0.0.150/share -U test1%123456
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Thu Nov 18 18:40:54 2021
.. D 0 Thu Nov 18 18:29:35 2021
test.txt A 6 Thu Nov 18 18:40:54 2021
104806400 blocks of size 1024. 98400288 blocks available
smb: \>
3、使用rsync+inotify实现/www目录实时同步
#rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时数据同步
官方网站: http://rsync.samba.org/
软件包:rsync,rsync-daemon(CentOS 8)
服务文件:/usr/lib/systemd/system/rsyncd.service
配置文件:/etc/rsyncd.conf
端口:873/tcp
backup服务器 10.0.0.8
client服务器 10.0.0.18
[root@backup ~]#dnf -y install rsync-daemon
[root@backup ~]#vim /etc/rsyncd.conf
uid = root
gid = root
#port = 874
#use chroot = no
max connections = 0
ignore errors
exclude = lost+found/
pid file = /var/run/rsyncd.pid
log file = /var/run/rsyncd.log
lock file = /var/run/rsyncd.lock
reverse lookup = no
#hosts allow = 10.0.0.0/24
[bkup] #每个模块名对应一个不同的path目录,如果同名后面模块生效
path = /data/bkup/
comment = backup dir
read only = no #默认为yes,即只读
auth users = rsyncuser #默认anonymous可以访问rsync服务器
secrets file = /etc/rsync.pas
[root@backup ~]#mkdir /data/bkup -p
[root@backup ~]#echo "rsyncuser:123456" > /etc/rsync.pas
[root@backup ~]#chmod 600 /etc/rsync.pas
[root@backup ~]#systemctl start rsyncd
#客户端配置
[root@client ~]# yum install -y inotify-tools
[root@client ~]# yum install rsync -y
[root@client ~]# echo "123456" >/etc/rsync.pas
[root@client ~]# chmod 600 /etc/rsync.pas
[root@client ~]# rsync --password-file=/etc/rsync.pas rsyncuser@10.0.0.150::
bkup backup dir
[root@client ~]# rsync --password-file=/etc/rsync.pas rsyncuser@10.0.0.150::bkup
drwxr-xr-x 6 2021/11/18 21:13:32 .
#同步测试
#推数据
[root@client ~]# mkdir /data/www
[root@client ~]# echo test2 >/data/www/dd.txt
[root@client ~]# rsync --password-file=/etc/rsync.pas rsyncuser@10.0.0.8::bkup
drwxr-xr-x 23 2021/12/18 21:46:28 .
-rw-r--r-- 5 2021/12/18 21:46:28 index.txt
[root@client ~]# rsync -avz --delete --password-file=/etc/rsync.pas /data/www/ rsyncuser@10.0.0.8::bkup
sending incremental file list
deleting index.txt
./
dd.txt
sent 118 bytes received 51 bytes 338.00 bytes/sec
total size is 6 speedup is 0.04
#拉数据
[root@backup ~]#echo test > /data/bkup/index.txt
[root@backup ~]#cat /data/bkup/index.txt
test
[root@client ~]# rsync -avz --delete --password-file=/etc/rsync.pas rsyncuser@10.0.0.150::bkup /data/www/
receiving incremental file list
./
index.txt
sent 46 bytes received 141 bytes 374.00 bytes/sec
total size is 11 speedup is 0.06
[root@client ~]# ll /data/www
total 8
-rw-r--r-- 1 root root 6 Dec 18 21:47 dd.txt
-rw-r--r-- 1 root root 5 Dec 18 21:50 index.txt
#在数据服务器上创建inotify_rsync.sh脚本
说明:此脚本执行前先确保两主机初始数据处于同步状态,此脚本实现后续的数据同步
[root@client ~]# vim inotify_rsync.sh
f#!/bin/bash
SRC='/data/www/'
DEST='rsyncuser@10.0.0.8::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 DATETIME 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@client ~]# bash inotify_rsync.sh
[root@client www]# touch 11
[root@backup bkup]#ll
total 8
-rw-r--r-- 1 root root 0 Dec 18 22:06 11
-rw-r--r-- 1 root root 6 Dec 18 21:47 dd.txt
-rw-r--r-- 1 root root 5 Dec 18 21:50 index.txt
[root@client ~]# tail -f /var/log/changelist.log
At on , file 22:06:32/data/www/ 11 was backuped up via rsync
At on , file 22:06:32/data/www/ 11 was backuped up via rsync
At on , file 22:06:32/data/www/ 11 was backuped up via rsync
#在客户端/data/www目录下创建文件11,在backup服务器上查看同步成功
4、LVS调度算法总结
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态,分为两种:静态方法和动态方法
静态方法:
仅根据算法本身进行调度
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将被调度
活动连接:连接上并在传输数据,活动链接压力等于非活动链接的256倍
非活动链接:连接上但没有传输数据
1、LC:least connections最少连接。将新的连接请求,分配给连接数最少的服务器,适用于长连接应用
Overhead=activeconns*256+inactiveconns
如:服务器 RS1 RS2
活动/非活动连接数
RS1:10/100
RS2: 20/0
压力值 :
RS1: 10x256+100 = 2660
RS2: 20*256+ 0 = 5120
RS1服务器压力值更小,更应该被分配新的访问请求。
2、WLC:Weighted LC,加权最少连接。默认调度方法,较常用
Overhead=(activeconns*256+inactiveconns)/weight
特殊的最少连接算法,权重越大承担的请求数越多
3、SED:Shortest Expection Delay,最短期望延迟。初始连接高权重优先,只检查活动连接,而不考虑非活动连接
Overhead=(activeconns+1)*256/weight
特殊的WLC算法,为了解决连接数(访问)是0的情况,来确定分给哪台服务器
4、NQ:Never Queue,永不排队。特殊的SED算法,无需等待,如果有真实服务器的连接数等于0那就直接分配不需要运算,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法。使用场景:根据负载状态实现正向代理,实现Web Cache等
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,实现Web Cache等
内核版本 4.15 版本后新增调度算法:FO和OVF
1、FO(Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度,属于静态算法
2、OVF(Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器,属于动态算法
一个可用的真实服务器需要同时满足以下条件:
未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
真实服务器当前的活动连接数量小于其权重值
其权重值不为零
5、LVS的跨网络DR实现
#环境准备:
5台主机
客户端client vmnet1仅主机网络 eth0:192.169.33.160/24 GW:192.168.33.200
路由器router vmnet1仅主机网络 eth1:192.169.33.200/24
vmnet8 NAT网络 eth0: 10.0.0.200/24 eth0:1: 192.168.0.200/24
负载调度器LVS vip:lo 192.168.0.100/32
DIP:eth0 NAT 10.0.0.150/24 GW:10.0.0.200
后端web服务器RS1 vip:lo 192.168.0.100/32
DIP:eth0 NAT 10.0.0.160/24 GW:10.0.0.200
后端web服务器RS2 vip:lo 192.168.0.100/32
DIP:eth0 NAT 10.0.0.170/24 GW:10.0.0.200
#client:
[root@client ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.33.160
PREFIX=24
GATEWAY=192.168.33.200
[root@client ~]# systemctl restart network
#router:
[root@router ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.200
PREFIX=24
[root@router ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.33.200
PREFIX=24
[root@router ~]# systemctl restart network
#添加临时eth0网卡子接口eth0:1配置ip地址。
[root@router ~]# ip a add 192.168.0.200/24 dev eth0
#测试仅主机网络,和客户端正常通信
[root@router ~]# ping 192.168.33.160
PING 192.168.33.160 (192.168.33.160) 56(84) bytes of data.
64 bytes from 192.168.33.160: icmp_seq=1 ttl=64 time=0.490 ms
64 bytes from 192.168.33.160: icmp_seq=2 ttl=64 time=0.859 ms
#配置开启路由转发功能
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@router ~]# cat /proc/sys/net/ipv4/ip_forward
1
#LVS:
#网络配置
[root@lvs ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
IPADDR=10.0.0.150
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@lvs ~]#nmcli c reload
[root@lvs ~]#nmcli c up eth0
[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
[root@lvs ~]#ping 192.168.33.160
PING 192.168.33.160 (192.168.33.160) 56(84) bytes of data.
64 bytes from 192.168.33.160: icmp_seq=1 ttl=63 time=0.919 ms
64 bytes from 192.168.33.160: icmp_seq=2 ttl=63 time=4.51 ms
#配置vip
[root@lvs ~]#ifconfig lo:1 192.168.0.100 netmask 255.255.255.255
#RS1:
#网络配置
[root@RS1 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
IPADDR=10.0.0.160
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@RS1 ~]#nmcli c reload
[root@RS1 ~]#nmcli c up eth0
[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
#web服务配置
[root@RS1 ~]#yum install -y httpd
[root@RS1 ~]#echo 10.0.0.160 >> /var/www/html/index.html
[root@RS1 ~]#systemctl restart httpd
[root@RS1 ~]#curl localhost
10.0.0.160
#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
#配置vip
[root@RS1 ~]#ifconfig lo:1 192.168.0.100 netmask 255.255.255.255
#RS2:
#网络配置
[root@RS2 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
IPADDR=10.0.0.170
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@RS2 ~]#nmcli c reload
[root@RS2 ~]#nmcli c up eth0
#web服务配置
[root@RS2 ~]#yum install -y httpd
[root@RS2 ~]#echo 10.0.0.170 >> /var/www/html/index.html
[root@RS2 ~]#systemctl restart httpd
[root@RS2 ~]#curl localhost
10.0.0.170
#IPVS配置
[root@RS2 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS2 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#配置vip
[root@RS2 ~]#ifconfig lo:1 192.168.0.100 netmask 255.255.255.255
#LVS集群配置:
[root@lvs ~]#yum install -y ipvsadm-1.31-1.el8.x86_64.rpm
[root@lvs ~]#ipvsadm -A -t 192.168.0.100:80 -s wrr
[root@lvs ~]#ipvsadm -a -t 192.168.0.100:80 -r 10.0.0.160 -g -w 1
[root@lvs ~]#ipvsadm -a -t 192.168.0.100:80 -r 10.0.0.170 -g -w 1
#测试client:
[root@client ~]# curl 192.168.0.100
10.0.0.170
[root@client ~]# curl 192.168.0.100
10.0.0.160
[root@client ~]# curl 192.168.0.100
10.0.0.170
[root@client ~]# curl 192.168.0.100
10.0.0.160