日志服务管理、网络文件共享、数据同步、LVS
一、通过loganalyzer展示数据库中的日志
loganalyzer是用 php 语言实现的日志管理系统,可将MySQL数据库的日志用丰富的WEB方式进行展示,官网:https://loganalyzer.adiscon.com
架构
步骤:
rsyslog安装连接mysql模块相关程序包
[root@rsyslog ~]# yum install rsyslog-mysql -y [root@rsyslog ~]# rpm -ql rsyslog-mysql /usr/lib64/rsyslog/ommysql.so /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql # 查看sql脚本内容 [root@rsyslog ~]# cat /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql CREATE DATABASE Syslog; USE Syslog; CREATE TABLE SystemEvents ( ID int unsigned not null auto_increment primary key, CustomerID bigint, ReceivedAt datetime NULL, DeviceReportedTime datetime NULL, Facility smallint NULL, Priority smallint NULL, FromHost varchar(60) NULL, Message text, NTSeverity int NULL, Importance int NULL, EventSource varchar(60), EventUser varchar(60) NULL, EventCategory int NULL, EventID int NULL, EventBinaryData text NULL, MaxAvailable int NULL, CurrUsage int NULL, MinUsage int NULL, MaxUsage int NULL, InfoUnitID int NULL , SysLogTag varchar(60), EventLogType varchar(60), GenericFileName VarChar(60), SystemID int NULL ); CREATE TABLE SystemEventsProperties ( ID int unsigned not null auto_increment primary key, SystemEventID int NULL , ParamName varchar(255) NULL , ParamValue text NULL ); #将sql脚本复制到10.0.0.18数据库服务器上 scp /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql 10.0.0.18:/opt
配置mysql数据库
#安装mariadb数据库 [root@mysql ~]# yum install mariadb-server -y #启动数据库 [root@mysql ~]# systemctl start mariadb #使用root用户登录数据库,执行mysql-createDB.sql脚本创建相关数据库和表,并授权rsyslog能连接至当前服务器 [root@mysql ~]# mysql -uroot MariaDB [(none)]> source /opt/mysql-createDB.sql MariaDB [Syslog]> grant all on Syslog.* to 'rsyslog'@'10.0.0.%' identified by '123456';
配置rsyslog服务器将日志发送至mysql数据库
#配置rsyslog将日志保存到mysql中 [root@rsyslog ~]# vim /etc/rsyslog.conf # ####MODULES#### #在 MODULES 语言下面,如果是 CentOS 8 加下面行 module(load="ommysql") #在 MODULES 语言下面,如果是 CentOS 7,6 加下面行 $ModLoad ommysql #在RULES语句块加下面行的格式 #facility.priority :ommysql:DBHOST,DBNAME,DBUSER, PASSWORD *.info :ommysql:10.0.0.18,Syslog,rsyslog,123456 #重启rsyslog服务 [root@rsyslog ~]# systemctl restart rsyslog
配置httpd+php服务器
注意:httpd+php服务器为CentOS8
安装httpd,php和相关软件包
yum -y install httpd php-fpm php-mysqlnd php-gd systemctl enable --now httpd php-fpm
安装LogAnalyzer
可从官网https://download.adiscon.com/loganalyzer/loganalyzer-4.1.12.tar.gz下载
tar xvf loganalyzer-4.1.12.tar.gz mv loganalyzer-4.1.12/src/ /var/www/html/log touch /var/www/html/log/config.php chmod 666 /var/www/html/log/config.php
基于Web页面初始化
访问http://10.0.0.28/log/进行初始化
注意:若httpd+php服务器为CentOS7,访问http://10.0.0.28/log/将不会进入web界面,而是http下载,原因是站点无法正常解析php,还需进行如下配置:
下载安装相关依赖包
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install mod_php
配置/etc/httpd/conf/httpd.conf文件,参照下图添加解析php相关配置
配置完后需要重启httpd:systemctl restart httpd
参考:https://www.cnblogs.com/peng-lan/p/11361758.html
二、实现基于MYSQL验证的vsftpd虚拟用户访问
利用pam_mysql模块可实现基于MySQL的FTP虚拟用户功能,FTP服务器只支持CentOS6、7
架构
数据库服务器配置
安装数据库
#注意:MySQL8.0由于取消了PASSWORD()函数,因此选择Mariadb或选择MySQL8.0以下的 yum install mariadb-server -y systemctl enable --now mariadb
配置数据库
[root@mysql ~]# 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 into users(name,password) values('shichu',password('123456')); MariaDB [vsftpd]> insert into users(name,password) values('chushi',password('654321')); MariaDB [vsftpd]> select * from users; +----+------------+-------------------------------------------+ | id | name | password | +----+------------+-------------------------------------------+ | 1 | shichu | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | 2 | chushi | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 | +----+------------+-------------------------------------------+ 2 rows in set (0.00 sec) #创建连接的数据库用户 MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'10.0.0.%' identified by '123456';
FTP服务器配置
安装vsftpd和pam_mysql包,对于 centos7:无对应rpm包,需手动编译安装
#安装相关依赖包 yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel #下载pam-mysql源码进行编译 wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz tar xvf pam_mysql-0.7RC1.tar.gz -C /usr/local/src cd /usr/local/src/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. #make可省略,直接make install make && make install #查看 [root@ftp upload]# ll /lib64/security/pam_mysql* -rwxr-xr-x 1 root root 882 Jun 6 23:52 /lib64/security/pam_mysql.la -rwxr-xr-x 1 root root 141720 Jun 6 23:52 /lib64/security/pam_mysql.so
新建pam认证配置文件
[root@ftp upload]# cat /etc/pam.d/vsftpd.mysql auth required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.28 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.28 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
配置字段说明
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 密码的加密方式: 0表示不加密 1表示crypt(3)加密 2表示使用mysql password()函数加密 3表示md5加密 4表示sha1加密
建立相应用户和修改vsftpd配置文件
#建立虚拟用户映射的系统用户及对应的目录 useradd -s /sbin/nologin -d /data/ftproot -r vuser mkdir /data/ftproot/upload -pv setfacl -m u:vuser:rwx /data/ftproot/upload #或者更改属组 # 修改vsftpd.conf配置文件 vim /etc/vsftpd/vsftpd.conf # 添加下面两项 guest_enable=YES guest_username=vuser #修改下面一项,原系统用户无法登录 pam_service_name=vsftpd.mysql
配置虚拟用户具有不同的访问权限
#配置vsftpd为虚拟用户使用配置文件目录 vim /etc/vsftpd/vsftpd.conf # 添加如下项 user_config_dir=/etc/vsftpd/conf.d/ #创建所需目录,并为虚拟用户提供配置文件 mkdir /etc/vsftpd/conf.d/ -pv #配置虚拟用户的访问权限 #虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户shichu具有上传文件的权限, #可修改/etc/vsftpd/conf.d/shichu文件,在里面添加如下选项并设置为YES即可,只读则设为NO #注意:需确保对应的映射用户对于文件系统有写权限 [root@ftp ~]# cat /etc/vsftpd/conf.d/shichu anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES #登录目录改变至指定的目录 local_root=/data/ftproot1 #更改目录属组 [root@ftp ~]# chown vuser:vuser /data/ftproot1/upload/ [root@ftp ftproot1]# ll /data/ftproot1/ total 0 drwxr-xr-x 2 vuser vuser 39 Jun 7 00:49 upload [root@ftp ftproot1]#
验证
ftp服务器10.0.0.18准备目录结构如下:
client用虚拟用户shichu登录进入/data/ftproot1目录下,同时具备上传、下载权限
数据库新增alice用户
MariaDB [vsftpd]> insert into users(name,password) values('alice',password('123456')); MariaDB [vsftpd]> select * from users; +----+--------+-------------------------------------------+ | id | name | password | +----+--------+-------------------------------------------+ | 1 | shichu | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | 2 | chushi | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 | | 3 | alice | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +----+--------+-------------------------------------------+
alice默认进入/data/ftproot目录,具有下载权限,无上传权限
三、配置samba共享,实现/www目录共享
samba服务器
#在samba服务器上安装samba包 yum install samba -y #创建samba用户和组 groupadd -r admins useradd -s /sbin/nologin -G admins shi smbpasswd -a shi #密码123456 useradd -s /sbin/nologin -G admins chu smbpasswd -a chu #密码654321 #创建/www共享目录,并设置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 install cifs-utils -y #用shi用户挂载smb共享并访问 mkdir /mnt/shi mount -o username=shi //10.0.0.18/share /mnt/shi #密码:123456 echo 'Hello shi' > /mnt/shi/hello.txt #用chu用户挂载smb共享并访问 mkdir /mnt/chu mount -o username=chu //10.0.0.18/share /mnt/chu #密码:654321 touch /mnt/chu/chu.txt
目录共享验证
[root@client mnt]# tree . ├── chu │ ├── chu.txt │ ├── hello.txt │ ├── samba-server.log │ └── windows.txt └── shi ├── chu.txt ├── hello.txt ├── samba-server.log └── windows.txt 2 directories, 8 files
Windows访问查看
(用户名密码分别为shi,123456)
#samba服务器新建samba-server.log文件,Windows客户端新建windows.txt文件 [root@samba-server www]# touch /www/samba-server.log
四、使用rsync+inotify实现/www目录实时同步
架构
backup服务器
说明:系统为CentOS 7
#安装rsync yum -y install rsync #修改rsync配置文件 vi /etc/rsyncd.conf uid = root gid = root # use chroot = yes max connections = 0 ignore errors pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log lock file = /var/run/rsyncd.lock exclude = lost+found/ 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 #准备备份目录 mkdir -pv /data/backup #生成验证文件,用户名+密码,修改文件权限 echo "rsyncuser:shichu" > /etc/rsync.pas chmod 600 /etc/rsync.pas #启动rsync服务 rsync --daemon #可加入/etc/rc.d/rc.local实现开机自启动
data服务器
#安装inotify-tools:基于epel源 yum install inotify-tools -y #安装rsync同步工具 yum install rsync -y #将密码写入文件,还必须修改文件权限 echo "shichu" > /etc/rsync.pas chmod 600 /etc/rsync.pas
inotify+rsync+shell 脚本实现实时数据同步
vim inotify_rsync.sh #!/bin/bash SRC='/www/' DEST='rsync://rsyncuser@10.0.0.18/backup' # 'root@10.0.0.18::backup' rpm -q rsync &> /dev/null || yum install rsync -y inotifywait -mrq --exclude=".*\.swap" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,modify,attrib,\ close_write,move ${SRC} | while read DATE TIME DIR FILE;do FILEPATH=${DIR}${FILE} rsync -arz --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
启动数据同步脚本
bash inotify_rsync.sh
测试
在data服务器/www目录下新建、修改、删除文件,将自动同步到backup服务器/data/backup目录下
[root@data www]# touch 1.log [root@data www]# mkdir 2 [root@data www]# touch 3.txt [root@data www]# echo '1111' >> 1.log [root@data www]# rm -f 3.txt
查看data服务器变更记录
[root@data ~]# tail -f /var/log/changelist.log
backup服务器自动同步data服务器/www目录文件变动情况
说明
- inotify-tools
参考文档:https://github.com/rvoicilas/inotify-tools/wiki
inotify-tools包主要工具:
-
inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控
-
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
inotifywait 命令
格式:
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
常用选项
-m, --monitor 始终保持事件监听 -d, --daemon 以守护进程方式执行,和-m相似,配合-o使用 -r, --recursive 递归监控目录数据信息变化 -q, --quiet 输出少量事件信息 --exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现 --excludei <pattern> 和exclude相似,不区分大小写 -o, --outfile <file> 打印事件到文件中,相当于标准正确输出,注意:使用绝对路径 -s, --syslogOutput 发送错误到syslog相当于标准错误输出 --timefmt <fmt> 指定时间输出格式 --format <fmt> 指定的输出格式;即实际监控输出内容 -e 指定监听指定的事件,如果省略,表示所有事件都进行监听
inotifywait 的--timefmt 时间格式
参考 man 3 strftime
%Y #年份信息,包含世纪信息 %y #年份信息,不包括世纪信息 %m #显示月份,范围 01-12 %d #每月的第几天,范围是 01-31 %H #小时信息,使用 24小时制,范围 00-23 %M #分钟,范围 00-59 %S #秒,范例 0-60
范例:
--timefmt "%Y-%m-%d %H:%M:%S"
inotifywait 的 --format 格式定义
%T #输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息 %w #事件出现时,监控文件或目录的名称信息,相当于dirname %f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename %e #显示发生的事件信息,不同的事件默认用逗号分隔 %Xe #显示发生的事件信息,不同的事件指定用X进行分隔
范例:
--format "%T %w%f event: %;e" --format '%T %w %f'
inotifywait -e 选项指定的事件类型
create #文件或目录创建 delete #文件或目录被删除 modify #文件或目录内容被写入 attrib #文件或目录属性改变 close_write #文件或目录关闭,在写入模式打开之后关闭的 close_nowrite #文件或目录关闭,在只读模式打开之后关闭的 close #文件或目录关闭,不管读或是写模式 open #文件或目录被打开 lsdir #浏览目录内容 moved_to #文件或目录被移动到监控的目录中 moved_from #文件或目录从监控的目录中被移动 move #文件或目录不管移动到或是移出监控目录都触发事件 access #文件或目录内容被读取 delete_self #文件或目录被删除,目录本身被删除 unmount #取消挂载
范例:
-e create,delete,moved_to,close_write,attrib
范例:使用inotifywait
#监控一次性事件 inotifywait /data/www Setting up watches. Watches established. /data/www/ CREATE f1.txt #持续前台监控 inotifywait -mrq /data/www --exclude=".*\.swx|\.swp" /data/www/ OPEN f1.txt /data/www/ ACCESS f1.txt /data/www/ CLOSE_NOWRITE,CLOSE f1.txt #持续后台监控,并记录日志 inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" -- format "%T %w%f event: %e" #持续前台监控特定事件 inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib
- rsync命令常见选项
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。 -P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。 -n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。 -a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。 -r --recursive:递归到目录中去。 -t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新检查出mtime不同从而导致增量传输无效。 -o --owner:保持owner属性(属主)。 -g --group:保持group属性(属组)。 -p --perms:保持perms属性(权限,不包括特殊权限)。 -D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。 -l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象 -z :传输时进行压缩提高效率 -R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。 --size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。 -u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。 -d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。 --max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m") --min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。 --exclude :指定排除规则来排除不需要传输的文件。 --delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在exclude/include规则生效之后才执行的。 -b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。 --backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。 -e :指定所要使用的远程shell程序,默认为ssh。 --port :连接daemon时使用的端口号,默认为873端口。 --password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。 -W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。 --existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。 --ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能。 --remove-source-files:要求删除源端已经成功传输的文件
五、LVS调度算法总结
主要分为静态、动态以及内核4.15版本后新增共三类十二种调度算法
静态方法
仅根据算法本身进行调度
- RR:roundrobin,轮询,较常用
- WRR:Weighted RR,加权轮询,较常用
- SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中RS(RealServer),从而实现会话绑定
- DH:Destination Hashing;目标地址hash,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如Web缓存
动态方法
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
-
LC:least connections适用于长链接应用
Overhead=activeconns*256+inactiveconns
-
WLC:Weighted LC,默认调度方法,较常用
Overhead=(activeconns*256+inactiveconns)/weight
-
SED:Shorest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接
Overhead=(activeconns+1)*256/weight
-
NQ:Nerver Queue,第一轮均匀分配,后续SED
-
LBLC:Locality-Based LC,动态的DH算法,适用场景:根据负载状态实现正向代理,实现Web Cache等
-
LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,实现Web Cache等
内核4.15版本后新增调度算法
- FO:Weighted Fail Over,在FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度;属于静态算法
- OVF:Overflow-connection,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器;属于动态算法
一个可用的真实服务器需要同时满足以下条件:
- 未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
- 真实服务器当前的活动连接数量小于其权重值
- 其权重值不为零
六、LVS的跨网络DR实现
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
架构
术语
VS:Virtual Server,Director Server(DS),Dispatcher(调度器),Load Balancer RS:Real Server(lvs), upstream server(nginx), backend server(haproxy) CIP:Client IP VIP:Virtual IP,VS外网的IP DIP:Director IP,VS内网的IP RIP:Real Server IP 访问流程:CIP<-->VIP==DIP<-->RIP
注意:所有主机禁用iptables和SELinux
Client
配置网络
[root@client ~]# 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 ONBOOT=yes
查看网络状态
[root@client ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:c0:57:53 brd ff:ff:ff:ff:ff:ff inet 192.168.10.6/24 brd 192.168.10.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fec0:5753/64 scope link valid_lft forever preferred_lft forever [root@client ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.200 0.0.0.0 UG 100 0 0 eth0 192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 [root@client ~]# hostname -I 192.168.10.6
Router
启动内核中路由转发功能
[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-eth0:0 DEVICE=eth0:0 NAME=eth0 BOOTPROTO=static IPADDR=172.16.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
查看网络状态
[root@router ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:a8:95:8e brd ff:ff:ff:ff:ff:ff inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 172.16.0.200/24 brd 172.16.0.255 scope global noprefixroute eth0:0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fea8:958e/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:a8:95:98 brd ff:ff:ff:ff:ff:ff inet 192.168.10.200/24 brd 192.168.10.255 scope global noprefixroute eth1 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fea8:9598/64 scope link valid_lft forever preferred_lft forever [root@router ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.10.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1 [root@router ~]# hostname -I 10.0.0.200 172.16.0.200 192.168.10.200
LVS
配置网络
[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 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1 DEVICE=lo IPADDR=172.16.0.100 NETMASK=255.255.255.255 NETWORK=172.16.0.100 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback
查看网络状态
[root@lvs ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 172.16.0.100/32 brd 172.16.0.100 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:b0:55:72 brd ff:ff:ff:ff:ff:ff inet 10.0.0.8/24 brd 10.0.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:feb0:5572/64 scope link valid_lft forever preferred_lft forever [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 ~]# hostname -I 10.0.0.8
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
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 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1 DEVICE=lo IPADDR=172.16.0.100 NETMASK=255.255.255.255 NETWORK=172.16.0.100 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback
查看网络状态
[root@rs1 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 172.16.0.100/32 brd 172.16.0.100 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:81:15:3e brd ff:ff:ff:ff:ff:ff inet 10.0.0.7/24 brd 10.0.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe81:153e/64 scope link valid_lft forever preferred_lft forever [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 ~]# hostname -I 10.0.0.7
安装httpd
yum -y install httpd echo `hostname -I` > /var/www/html/index.html systemctl enable --now httpd
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
RS2
配置网络
[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 ONBOOT=yes [root@rs2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1 DEVICE=lo IPADDR=172.16.0.100 NETMASK=255.255.255.255 NETWORK=172.16.0.100 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback
查看网络状态
[root@rs2 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 172.16.0.100/32 brd 172.16.0.100 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:e9:a2:65 brd ff:ff:ff:ff:ff:ff inet 10.0.0.17/24 brd 10.0.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fee9:a265/64 scope link valid_lft forever preferred_lft forever [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 ~]# hostname -I 10.0.0.17
安装httpd
yum -y install httpd echo `hostname -I` > /var/www/html/index.html systemctl enable --now httpd
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
测试
按LVS轮询调度方式
[root@client ~]# curl 172.16.0.100 10.0.0.17 [root@client ~]# curl 172.16.0.100 10.0.0.7 [root@client ~]# curl 172.16.0.100 10.0.0.17 [root@client ~]# curl 172.16.0.100 10.0.0.7
RS1 日志
[root@rs1 ~]# tail -f /var/log/httpd/access_log 192.168.10.6 - - [09/Jun/2022:00:31:49 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:31:50 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:31:51 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:31:53 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:32:01 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:33:21 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:33:22 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0"
RS2日志
[root@rs2 ~]# tail -f /var/log/httpd/access_log 192.168.10.6 - - [09/Jun/2022:00:31:48 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:31:50 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:31:51 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:31:52 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:32:00 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:33:18 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0" 192.168.10.6 - - [09/Jun/2022:00:33:21 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
ipvsadm命令说明
程序包:ipvsadm
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
ipvsadm核心功能
- 集群服务管理:增、删、改
- 集群服务的RS管理:增、删、改
- 查看
ipvsadm 工具用法:
#管理集群服务 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags] ipvsadm -D -t|u|f service-address #删除 ipvsadm –C #清空 ipvsadm –R #重载,相当于ipvsadm-restore ipvsadm -S [-n] #保存,相当于ipvsadm-save #管理集群中的RS ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address]
管理集群服务:增、改、删
增、修改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
service-address: -t|u|f: -t: TCP协议的端口,VIP:TCP_PORT 如: -t 10.0.0.100:80 -u: UDP协议的端口,VIP:UDP_PORT -f:firewall MARK,标记,一个数字 [-s scheduler]:指定集群的调度算法,默认为wlc
范例
ipvsadm -A -t 10.0.0.100:80 -s wrr
删除
ipvsadm -D -t|u|f service-address
管理集群上的RS:增、改、删
增、改
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
删
ipvsadm -d -t|u|f service-address -r server-address
server-address: rip[:port] 如省略port,不作端口映射 选项: lvs类型: -g: gateway, dr类型,默认 -i: ipip, tun类型 -m: masquerade, nat类型 -w weight:权重
范例
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:8080 -m -w 3
清空定义的所有内容
ipvsadm -C
清空计数器
ipvsadm -Z [-t|u|f service-address]
查看
ipvsadm -L|l [options]
--numeric, -n:以数字形式输出地址和端口号 --exact:扩展信息,精确值 --connection,-c:当前IPVS连接输出 --stats:统计信息 --rate :输出速率信息
ipvs规则
/proc/net/ip_vs
ipvs连接
/proc/net/ip_vs_conn
保存
建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE ipvsadm -S > /PATH/TO/IPVSADM_FILE systemctl stop ipvsadm.service #会自动保存规则至/etc/sysconfig/ipvsadm
重载
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE systemctl start ipvsadm.service #会自动加载/etc/sysconfig/ipvsadm中规则
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器