Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。
因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
keepalived官网 http://www.keepalived.org
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。
在Keepalived服务正常工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
那么,什么是VRRP呢?
VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
Keepalived高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:
1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2) VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。
3) VRRP用 IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通信。
4) 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。
5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
Keepalived服务的工作原理:
Keepalived高可用对之间是通过VRRP进行通信的,VRRP是遑过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在 Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。
简易架构图如下:
两台RS服务器运行如下脚本实现
1 |
|
1) lvs1
1 | # 安装keepalived |
2) lvs2
1 | # 安装keepalived |
3) 配置router
1 | # 修改内核参数 |
4) 客户端添加默认网关
1 | route add default gw 172.18.201.200 |
5) 客户端测试
1 | for i in {1..100};do curl 10.0.0.100;sleep 1;done |
keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外
track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
示例如下:
1 | # 定义脚本 |
LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到DirectorServer上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(realserver)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。
LVS是 Linux Virtual Server的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网是 http://www.linuxvirtualserver.org 现在 LVS 已经是Linux内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的Linux服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
简易原理图如下:
当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器.
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
(1)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(2)PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(3)IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(4)POSTROUTING链通过选路,将数据包发送给Real Server
(5)Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(6)Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。此时报文的源IP为VIP,目标IP为CIP
lvs-nat 模型特性
(1)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(2)PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(3)IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(4)由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(5)RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(6)响应报文最终送达至客户端
lvs-dr 特性
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
lvs-tun特性:
lvs-fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP –> DIP VIP –> RIP
lvs-fullnat特性
注意:此类型kernel默认不支持
静态方法:仅根据算法本身进行调度
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
它是根据源地址散列算法进行静态分配固定的服务器资源,现在好多用户都是一个的snat,出口就一个ip,后端rs记录的访问地址,也是一个ip,明显的不符合实际情况。
该算法是根据目标 IP 地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1)集群服务的增改 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
2)集群服务的删除 ipvsadm -D -t|u|f service-address
3)管理集群上的RS:增、改 ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
4)集群上的删除 ipvsadm -d -t|u|f service-address -r server-address
5)清空定义的所有内容:ipvsadm –C
清空计数器:ipvsadm -Z [-t|u|f service-address]
查看:ipvsadm -L|l [options]
6)保存:建议保存至/etc/sysconfig/ipvsadmipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
7)重载:ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
限制响应级别:arp_ignore
限制通告级别:arp_announce
rs的配置脚本
1 |
|
vs的配置脚本
1 |
|
注意:
lvs是基于四层的调度转发,不能基于url进行转发,而且默认的不能对后端rs进行状态检查,通常借助ldirectord实现
]]>
- Nginx:engine X ,2002年,开源,商业版
- NGINX是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器
- 解决C10K问题(10K Connections)
- 官网:http://nginx.org
- 二次开发版:Tengine OpenResty(章亦春)
虚拟主机(server)
支持 keep-alive 和管道连接
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached 的 GET 接口
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载
模块分类:
核心模块:core module
标准模块:
第三方模块
ls /usr/local/nginx/
html是测试页,sbin是主程序s /usr/local/nginx/sbin/
nginx 只有一个程序文件ls /usr/local/nginx/html/
50x.html index.html 测试网页
Nginx:默认为启动nginx
nginx -s stop
停止nginx nginx -s reload
加载配置文件 -g directives
在命令行中指明全局指令1 | main block:主配置段,即全局配置段,对http,mail都有效 |
1 | http { |
帮助文档 http://nginx.org/en/docs/
模块加载配置文件:/usr/share/nginx/modules/*.conf
指明要装载的动态模块路径: /usr/lib64/nginx/modules
1、worker_processes number | auto
2、worker_cpu_affinity cpumask …
3、worker_priority number
4、worker_rlimit_nofile number
每个worker进程所能够打开的最大并发连接数数量,如10240
总最大并发数:worker_processes * worker_connections
指明并发连接请求的处理方法,默认自动选择最优方法 use epoll;
处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请
求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊
群”,影响性能
1、server { … }
配置一个虚拟主机1
2
3
4
5server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
2、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
注意:
(1) 基于port;listen PORT; 指令监听在不同的端口
(2) 基于ip的虚拟主机 listen IP:PORT; IP 地址不同
(3) 基于hostname server_name fqdn; 指令指向不同的主机名
3、server_name name …;
虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
支持通配任意长度的任意字符server_name *.magedu.com www.magedu.*
支持~起始的字符做正则表达式模式匹配,性能原因慎用server_name ~^www\d+\.magedu\.com$
说明: \d 表示 [0-9]
匹配优先级机制从高到低:
(1) 首先是字符串精确匹配 如:www.magedu.com
(2) 左侧通配符 如:.magedu.com
(3) 右侧通配符 如:www.magedu.
(4) 正则表达式 如: ~^.*.magedu.com$
(5) default_server
4、tcp_nodelay on | off;
在keepalived模式下的连接是否启用TCP_NODELAY选项
当为off时,延迟发送,合并多个请求后再发送
默认On时,不延迟发送
可用于:http, server, location
5、sendfile on | off;
是否启用sendfile功能,在内核中封装报文直接发送,默认Off
6、server_tokens on | off | build | string
是否在响应报文的Server首部显示nginx版本 ngx_http_core_modu
7、root
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http, server, location, if in location
1 | server { |
8、location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路
径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最
佳匹配,而后应用其配置
示例:1
2
3
4
5
6server {...
server_name www.magedu.com;
location /images/ {
root /data/imgs/;
}
}
^~: 对URI的最左边部分做匹配检查,不区分字符大小写
~: 对URI做正则表达式模式匹配,区分字符大小写
~*: 对URI做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于此uri的所有的uri
匹配优先级从高到低:=, ^~, ~/~*, 不带符号
9、alias path;
路径别名,文档映射的另一种机制;仅能用于location上下文
示例:
http://www.magedu.com/bbs/index.php1
2
3
4
5
6location /bbs/ {
alias /web/forum/;
} --> /web/forum/index.html
location /bbs/ {
root /web/forum/;
} --> /web/forum/bbs/index.html
注意:location中使用root指令和alias指令的意义不同
(a) root,给定的路径对应于location中的/uri/左侧的/
(b) alias,给定的路径对应于location中的/uri/右侧的/
10、index file …;
指定默认网页文件,注意:ngx_http_index_module模块
11、error_page code … [=[response]] uri;
模块:ngx_http_core_module
定义错误页,以指定的响应状态码进行响应
可用位置:http, server, location, if in location
error_page 404 /404.html
error_page 404 =200 /404.html
12、try_files file … uri;
try_files file … =code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
1 | location /images/ { |
13、keepalive_timeout timeout [header_timeout];
设定保持连接超时时长,0表示禁止长连接,默认为75s
14、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100
15、keepalive_disable none | browser …
对哪种浏览器禁用长连接
16、send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
17、client_body_buffer_size size;
用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
18、client_body_temp_path path [level1 [level2 [level3]]];
设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
目录名为16进制的数字;client_body_temp_path /var/tmp/client_body 1 2 2
1 1级目录占1位16进制,即2^4=16个目录 0-f
2 2级目录占2位16进制,即2^8=256个目录 00-ff
2 3级目录占2位16进制,即2^8=256个目录 00-ff
19、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,默认值0表示无限制
20、limit_except method … { … },仅用于location
限制客户端使用除了指定的请求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH
1 | limit_except GET { |
除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使用
21、aio on | off | threads[=pool];
是否启用aio功能
22、directio size | off;
当文件大于等于给定大小时,例如directio 4m,同步(直接)写磁盘,而非写缓存
23、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件元数据:文件的描述符、文件大小和最近一次的修改时间
(2) 打开的目录结构
(3) 没有找到的或者没有权限访问的文件的相关信息
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现管理,inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除
24、open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息,默认值为off
25、open_file_cache_min_uses number;
open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1
26、open_file_cache_valid time;
]]>缓存项有效性的检查频率,默认值为60s
可实现基于ip的访问控制功能
http, server, location, limit_except 自上而下检查,一旦匹配,将生效,条件严格的置前
示例:
1 | location / { |
实现基于用户的访问控制,使用basic机制进行用户认证
1、auth_basic string | off;
2、auth_basic_user_file file;1
2
3
4location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
1、明文文本:格式name:password:comment
2、加密文本:由htpasswd
命令实现 该命令由httpd-tools rpm包所提供
用于输出nginx的基本状态信息
Active connections:当前状态,活动状态的连接数
accepts:统计总值,已经接受的客户端请求的总数
handled:统计总值,已经处理完成的客户端请求的总数
requests:统计总值,客户端发来的总的请求数
Reading:当前状态,正在读取客户端请求报文首部的连接的连接数
Writing:当前状态,正在向客户端发送响应报文过程中的连接数
Waiting:当前状态,正在等待客户端发出请求的空闲连接数
示例1
2
3
4
5location /status {
stub_status;
allow 172.16.0.0/16;
deny all;
}
指定日志格式记录请求
示例:
1 | log_format compression '$remote_addr-$remote_user [$time_local] ' |
缓存各日志文件相关的元数据信息
max:缓存的最大文件描述符数量
min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项
inactive:非活动时长
valid:验证缓存中各缓存项是否为活动项的时间间隔
用gzip方法压缩响应数据,节约带宽
1、gzip on | off;
启用或禁用gzip压缩
2、gzip_comp_level level;
压缩比由低到高:1 到 9 默认:1
3、gzip_disable regex …;
匹配到客户端浏览器不执行压缩
4、gzip_min_length length;
启用压缩功能的响应报文大小阈值
5、gzip_http_version 1.0 | 1.1;
设定启用压缩功能时,协议的最小版本 默认:1.1
6、gzip_buffers number size;
支持实现压缩功能时缓冲区数量及每个缓存区的大小 默认:32 4k 或 16 8k
7、gzip_types mime-type …;
指明仅对哪些类型的资源执行压缩操作;即压缩过滤器
默认包含有text/html,不用显示指定,否则出错
8、gzip_vary on | off;
如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”
9、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;
nginx充当代理服务器时,对于后端服务器的响应报文,在何种条件下启
用压缩功能 off:不启用压缩
expired,no-cache, no-store,private:对后端服务器的响应报文首部
Cache-Control值任何一个,启用压缩功能
示例:
1 | gzip on; |
1、ssl on | off
为指定虚拟机启用HTTPS protocol, 建议用listen指令代替
2、ssl_certificate file;
当前虚拟主机使用PEM格式的证书文件
3、ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件
4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
支持ssl协议版本,默认为后三个
5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
none: 通知客户端支持ssl session cache,但实际不支持
builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:在各worker之间使用一个共享的缓存
6、ssl_session_timeout time;
客户端连接可以复用ssl session cache中缓存的有效时长,默认5m
示例:
1 | server { |
将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换
例如:http://www.magedu.com –> https://www.magedu.com/
1、rewrite regex replacement [flag]
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查
隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制
如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301
- last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环,不建议在location中使用
- break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
- redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
- permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301
2、return
return code [text];
return code URL;
return URL;
停止处理,并返回给客户端指定的响应码,对 301, 302, 303, 307, 308跳转到URL
3、rewrite_log on | off;
是否开启重写日志, 发送至error_log(notice level)
4、set $variable value;
用户自定义变量
注意:变量定义和调用都要以$开头
5、if (condition) { … }
条件满足时,执行配置块中的配置指令;server, location
condition:
比较操作符:
- = 相同 != 不同
- ~:模式匹配,区分字符大小写
- ~*:模式匹配,不区分字符大小写
- !~:模式不匹配,区分字符大小写
- !~*:模式不匹配,不区分字符大小写
文件及目录存在性判断:
- -e, !-e 存在(包括文件,目录,软链接)
- -f, !-f 文件 -d, !-d 目录 -x, !-x 执行
用来阻止Referer首部无有效值的请求访问,可防止盗链
1、valid_referers none|blocked|server_names|string …;
定义referer首部的合法可用值,不能匹配的将是非法值
none:请求报文首部没有referer首部
blocked:请求报文有referer首部,但无有效值
server_names:参数,其可以有值作为主机名或主机名模式
arbitrary_string:任意字符串,但可使用*作通配符
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,
例如: ~.*.magedu.com
示例:
1 | valid_referers none block server_names *.magedu.com *.mageedu.com |
转发请求至另一台主机
1、proxy_pass URL;
Context:location, if in location, limit_except
注意:proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机
1 | server { |
上面示例:http://HOSTNAME/uri –> http://host/uri
如果上面示例中有 /,即:http://host[:port]/
意味着:http://HOSTNAME/uri –> http://host/ 即置换
1 | server { |
http://HOSTNAME/uri/ –> http://host/new_uri/
1 | server { |
http://HOSTNAME/uri/ –> http://host/uri/
2、proxy_set_header field value;
设定发往后端主机的请求报文的请求首部的值
Context: http, server, location1
2proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
请求报文的标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
3、proxy_cache_path;
定义可用于proxy功能的缓存;Context:http
1 | proxy_cache_path path [levels=levels] [use_temp_path=on|off] |
4、proxy_cache zone | off; 默认off
指明调用的缓存,或关闭缓存机制;Context:http, server, location
5、proxy_cache_key string;缓存中用于“键”的内容
默认值:proxy_cache_key $scheme$proxy_host$request_uri;
6、proxy_cache_valid [code …] time;
定义对特定响应码的响应内容的缓存时长,定义在http{…}中
示例:1
2
3proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
ngx_http_proxy_module
示例:在http配置定义缓存信息
1 | proxy_cache_path /var/cache/nginx/proxy_cache |
说明:proxycache:20m 指内存中缓存的大小,主要用于存放key和metadata(如:使用次数)
max_size=1g 指磁盘存入文件内容的缓存空间最大值
调用缓存功能,需要定义在相应的配置段,如server{…};1
2
3
4proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
7、proxy_cache_use_stale;
proxy_cache_use_stale error | timeout | invalid_header | updating |
http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off …
在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端
8、proxy_cache_methods GET | HEAD | POST …;
对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
9、proxy_hide_header field;
默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel-等,用于隐藏后端服务器特定的响应首部
10、proxy_connect_timeout time;
定义与后端服务器建立连接的超时时长,如超时会出现502错误,默认为60s,一般不建议超出75s
11、proxy_send_timeout time;
将请求发送给后端服务器的超时时长;默认为60s
12、proxy_read_timeout time;
等待后端服务器发送响应报文的超时时长,默认为60s
向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值
1、add_header name value [always];
添加自定义首部
1 | add_header X-Via $server_addr; |
2、add_trailer name value [always];
添加自定义响应信息的尾部
转发请求到FastCGI服务器,不支持php模块方式
1、fastcgi_pass address;address为后端的fastcgi server的地址可用位置:location, if in location
2、fastcgi_index name;fastcgi默认的主页资源示例:fastcgi_index index.php;
3、fastcgi_param parameter value [if_not_empty];设置传递给 FastCGI服务器的参数值,可以是文本,变量或组合
示例1:
1)在后端服务器先配置fpm server和mariadb-serve
2)在前端nginx服务上做以下配置:
1 | location ~* \.php$ { |
示例2:通过pm_status和ping来获取fpm server状态信息
1 | location ~* ^/(pm_status|ping)$ { |
4、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size
[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time]
[manager_threshold=time] [loader_files=number] [loader_sleep=time]
[loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time]
[purger_threshold=time];
- 定义fastcgi的缓存;path 缓存位置为磁盘上的文件系统
- max_size=size 磁盘path路径中用于缓存数据的缓存空间上限
- levels=levels:缓存目录的层级数量,以及每一级的目录数量
- levels=ONE:TWO:THREE 示例:leves=1:2:2
- keys_zone=name:size k/v映射的内存空间的名称及大小
- inactive=time 非活动时长
5、fastcgi_cache zone | off;
调用指定的缓存空间来缓存数据 可用位置:http, server, location
6、fastcgi_cache_key string;
定义用作缓存项的key的字符串
示例:fastcgi_cache_key $request_rui;
7、fastcgi_cache_methods GET | HEAD | POST …;
为哪些请求方法使用缓存
8、fastcgi_cache_min_uses number;
缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方,可被认作活动项
9、fastcgi_keep_conn on | off;
收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启用长连接
10、fastcgi_cache_valid [code …] time;
不同的响应码各自的缓存时长
示例:
1 | http { |
用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用
1、upstream name { … }
定义后端服务器组,会引入一个新的上下文,默认调度算法是wrr Context: http
1 | upstream httpdsrvs { |
2、server address [parameters];
在upstream上下文中server成员,以及相关的参数;Context:upstream
3、ip_hash 源地址hash调度方法
4、least_conn 最少连接调度算法
当server拥有不同的权重时其为wlc,
当所有后端主机连接数相同时,则使用wrr,适用于长连接
5、hash key [consistent] 基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者组合
作用:将请求分类,同一类请求将发往同一个upstream server,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用
1 | hash $request_uri consistent; |
6、keepalive 连接数N;
为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗
7、ngx_stream_core_module模块
模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器
示例:1
2
3
4
5
6
7
8
9
10
11
12
13stream {
upstream mysqlsrvs {
server 192.168.0.10:3306;
server 192.168.0.11:3306;
hash $remote_addr consistent;
}
server {
listen 172.16.100.100:3306;
proxy_pass mysqlsrvs;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
同步/异步:关注的是消息通信机制
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
I/O模型:阻塞型、非阻塞型、复用型、信号驱动型、异步
select | poll | epoll | |
---|---|---|---|
操作方式 | 遍历 | 遍历 | 回调 |
底层实现 | 数组 | 链表 | 哈希表 |
IO效率 | 每次调用都进行线性时间复杂度为O(n) | 每次调用都进行线性遍历时间复杂度为O(n) | 时间通知方式,fd就绪系统注册的回调函数就会被调用,将就绪的fd放到rdlist里面,时间复杂度为O(1) |
最大连接数 | 1024(X86)或2048(X64) | 无上限 | 无上限 |
fd拷贝 | 每次调用select,都需要把fd集合从用户状态拷贝到内核态 | 每次调用poll,都需要把fd集合从用户态拷贝到内核态 | 调用expoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝 |
缺点
poll
本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态
边缘触发:只通知一次
epoll:在Linux 2.6内核中提出的select和poll的增强版本支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次
1 | vim /etc/vsftpd/vusers.txt |
1 | useradd -d /var/ftproot -s /sbin/nologin vuser |
Centos7 还需要执行以下操作:
1 | chmod -w /var/ftproot/ |
1 | vim /etc/pam.d/vsftpd.db |
1 | vim /etc/vsftpd/vsftpd.conf |
禁用SELinux 或者 setsebool -P ftpd_full_access 1
1 | mdkir /etc/vsftpd/vusers.d/ 创建配置文件存放的路径 |
cd /etc/vsftpd/vusers.d/ 进入此目录
vim wang
创建各用户自已的配置文件
1 | anon_upload_enable=YES |
vim mage
创建各用户自已的配置文件
1 | local_root=/ftproot 登录目录改变至指定的目录 |
说明:本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器
Centos7:在数据库服务器上安装
1 | yum –y install mariadb-server |
Centos6:在数据库服务器上安装
1 | yum –y install mysql-server |
在FTP服务器上安装vsftpd和pam_mysql包
1 | centos6:pam_mysql由epel6的源中提供 |
centos7:无对应rpm包,需手动编译安装
1 | yum -y groupinstall "Development Tools" |
1 | mysql> CREATE DATABASE vsftpd; |
ftp服务和mysql不在同一主机:1
2mysql> GRANT SELECT ON vsftpd.* TO
vsftpd@'172.16.%.%' IDENTIFIED BY 'magedu';
ftp服务和mysql在同一主机:1
2
3
4
5mysql> GRANT SELECT ON vsftpd.* TO
vsftpd@localhost IDENTIFIED BY 'magedu';
mysql> GRANT SELECT ON vsftpd.* TO
vsftpd@'127.0.0.1' IDENTIFIED BY 'magedu';
mysql> FLUSH PRIVILEGES;
1 | mysql> USE vsftpd; |
测试连接1
2mysql -uvsftpd -h 172.16.200.200 -pmagedu
mysql> SHOW DATABASES;
根据需要添加所需要的用户,为了安全应该使用PASSWORD函数加密其密码后
存储
1 | mysql>DESC users; |
1 | vi /etc/pam.d/vsftpd.mysql 添加如下两行 |
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()函数加密
建立虚拟用户映射的系统用户及对应的目录1
2
3
4useradd -s /sbin/nologin -d /var/ftproot vuser
chmod 555 /var/ftproot centos7 需除去ftp根目录的写权限
mkdir /var/ftproot/{upload,pub}
setfacl –m u:vuser:rwx /var/ftproot/upload
确保/etc/vsftpd.conf中已经启用了以下选项1
anonymous_enable=YES
添加下面两项1
2guest_enable=YES
guest_username=vuser
修改下面一项,原系统用户无法登录1
pam_service_name=vsftpd.mysql
1 | service vsftpd start;systemctl start vsftpd |
查看端口开启情况1
netstat -tnlp |grep :21
1 | restorecon -R /lib64/security |
1 | tail /var/log/secure |
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访
问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任
意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
1 | vim /etc/vsftpd/vsftpd.conf |
1 | mkdir /etc/vsftpd/vusers_config/ |
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如
果需要让用户wang具有上传文件的权限,可以修改/etc/vsftpd/vusers_config/wang文件,在里面添加如下选项并设置为YES即可,只读则设为NO
注意:需确保对应的映射用户对于文件系统有写权限1
2
3
4anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
local_root=/ftproot 登录目录改变至指定的目录
1、 基本匹配条件:无需加载模块,由iptables/netfilter自行提供
-s,--source address[/mask]
: 源ip地址或范围-d, --destination address[/mask][,...]
:目标IP地址或范围-p, --protocol protocol
:指定协议,可使用数字如0(all)protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or all 参看:/etc/protocols-i, --in-interface name
: 报文流入的接口;只能应用于数据报文流入环节,只应用于
INPUT、FORWARD、PREROUTING链-o, --out-interface name
: 报文流出的接口;只能应用于数据报文流出的环节,只应用
于FORWARD、OUTPUT、POSTROUTING链
2、 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
查看帮助 man iptables-extensions
隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展
机制,不需要手动加载扩展模块
[!] –source-port, –sport port[:port]:匹配报文的源端口;可以是端口
范围
[!] –destination-port,–dport port[:port]:匹配报文的目标端口;可以
是端口范围
[!] –icmp-type {type[/code]|typename}
type/code 0/0 echo-reply icmp应答 8/0 echo-request icmp请求
显式扩展::必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载
扩展模块 [-m matchname [per-match-options]]
处理动作:-j targetname [per-target-option
使用帮助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
1、 multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
示例:1
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
2、 iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
[!] –src-range from[-to] 源IP地址范围
[!] –dst-range from[-to] 目标IP地址范围
示例:1
iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --srcrange 172.16.1.5-172.16.1.10 -j DROP
3、 mac扩展
指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT chains
[!] –mac-source XX:XX:XX:XX:XX:XX
示例:1
2iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
iptables -A INPUT -s 172.16.0.100 -j REJECT
4、 string扩展
对报文中的应用层数据做字符串模式匹配检测
–algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
–from offset 开始偏移
–to offset 结束偏移
[!] –string pattern:要检测的字符串模式
[!] –hex-string pattern:要检测字符串模式,16进制格式
示例:
1
iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
5、 time 扩展
根据将报文到达的时间与指定的时间范围进行匹配
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–timestart hh:mm[:ss] 时间
–timestop hh:mm[:ss]
[!] –monthdays day[,day…] 每个月的几号
[!] –weekdays day[,day…] 星期几
–kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
注意: centos6 不支持kerneltz ,–localtz指定本地时区(默认)
示例:1
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
6、 connlimit扩展
根据每客户端IP做并发连接数数量匹配
可防止CC(Challenge Collapsar挑战黑洞)攻击
–connlimit-upto n:连接的数量小于等于n时匹配
–connlimit-above n:连接的数量大于n时匹配
通常分别与默认的拒绝或允许策略配合使用
示例:1
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
7、 limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
示例:1
2iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 10/minute -- limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
8、 state扩展
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
示例
1 | iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80 -m state -- state NEW,ESTABLISHED -j ACCEPT |
已经追踪到的并记录下来的连接信息库 /proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量 /proc/sys/net/nf_conntrack_max
不同的协议的连接追踪时长 /proc/sys/net/netfilter/
注意:CentOS7 需要加载模块: modprobe nf_conntrack
iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时解决方法两个:
(1) 加大nf_conntrack_max 值
1 | vi /etc/sysctl.conf |
(2) 降低 nf_conntrack timeout时间1
2
3
4
5
6vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter1
2
3vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES="nf_conntrack_ftp"
modproble nf_conntrack_ftp
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED1
2iptables –I INPUT -d LocalIP -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
1 | iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT |
1 | yum install vsftpd |
1、 安全放行所有入站和出站的状态为ESTABLISHED状态连接
2、 谨慎放行入站的新请求
3、 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4、 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
5、 不同类的规则(访问不同应用),匹配范围大的放在前面
6、 应该将那些可由一条规则能够描述的多个规则合并为一条
7、 设置默认策略,建议白名单(只放行特定连接)
1) iptables -P,不建议
2) 建议在规则的最后定义规则做为默认策略
保存规则至指定的文件
CentOS 6service iptables save
将规则覆盖保存至/etc/sysconfig/iptables文件中
CentOS 7 可用下面方法保存规则iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 6:
service iptables restart 会自动从/etc/sysconfig/iptables 重新载入规则
CentOS 7 重新载入预存规则文件中规则:iptables-restore < /PATH/FROM/SOME_RULES_FILE
-n, –noflush:不清除原有规则
-t, –test:仅分析生成规则集,但不提交
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
(1) 充当网关
(2) 使用filter表的FORWARD链
注意的问题:
(1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性
(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报
文直接放行
ip_forward功能启用
方法一:1
2
3iptables -P FORWARD DROP
iptables -t filter -A FORWARD -s 192.168.31.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.31.0/24 -p icmp --icmp-type 0 -j ACCEPT
方法二:1
2
3iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -s 192.168.31.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -j REJECT
1 | iptables -P FORWARD DROP |
1 | iptables -P FORWARD DROP |
1 | iptables -P FORWARD DROP |
1 | iptables -P FORWARD DROP |
修改自定义链,增加MYSQL的访问
1 | iptables -R WEB 1 -p tcp -m multiport --dports 21,80,443,3306 -s 192.168.31.0/24 -j ACCEPT |
删除自定义链
1 | iptables -vnL |
1 | iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -j SNAT --to-source 172.18.0.123 |
1、基于C/S架构
2、双通道协议:数据和命令连接
3、数据传输格式:二进制(默认)和文本
4、两种模式:服务器角度
5、服务器被动模式数据端口示例:
1、FTP服务器:
2、客户端软件:
1、状态码:
2、用户认证:
1、由vsftp包提供,不再由xinetd管理,用户认证配置文件:/etc/pam.d/vsftpd
2、服务脚本:/usr/lib/systemd/system/vsftpd.service,/etc/rc.d/init.d/vsftpd
3、配置文件:/etc/vsftpd/vsftpd.conf
- 格式:option=value- 注意:= 前后不要有空格
4、匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
5、系统用户共享文件位置:用户家目录
6、虚拟用户共享文件位置:为其映射的系统用户的家目录
1、命令端口
1 | listen_port=21 |
2、主动模式端口
1 | connect_from_port_20=YES 主动模式端口为20 |
3、被动模式端口范围
linux 客户端默认使用被动模式
windows 客户端默认使用主动模式
1 | pasv_min_port=6000 0为随机分配 |
4、使用当地时间
1 | use_localtime=YES 使用当地时间(默认为NO,使用GMT) |
5、匿名用户
1 | anonymous_enable=YES 支持匿名用户 |
指定上传文件的默认的所有者和权限
1 | chown_uploads=YES(默认NO) |
6、linux系统用户
1 | guest_enable=YES 所有系统用户都映射成guest用户 |
7、禁锢所有系统用户在家目录中
1 | chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户 |
8、禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反
1 | chroot_list_enable=YES |
9、vsftpd日志
1 | dual_log_enable=YES 使用vsftpd日志格式,默认不启用 |
10、登录提示信息
1 | ftpd_banner=“welcome to mage ftp server" |
11、目录访问提示信息
1 | dirmessage_enable=YES (默认) |
12、使用pam(Pluggable AuthenticationModules)完成用户认证
1 | pam_service_name=vsftppam |
13、是否启用控制用户登录的列表文件
1 | userlist_enable=YES 默认有此设置 |
14、vsftpd服务指定用户身份运行
1 | nopriv_user=nobody (默认值) |
15、连接数限制
1 | max_clients=0 最大并发连接数 |
16、传输速率:字节/秒
1 | anon_max_rate=0 匿名用户的最大传输速率 |
17、连接时间:秒为单位
1 | connect_timeout=60 主动模式数据连接超时时长 |
18、优先以文本方式传输
1 | ascii_upload_enable=YES |
1、 查看是否支持SSL
1 | ldd `which vsftpd` 查看到libssl.so |
2、 创建自签名证书
1 | cd /etc/pki/tls/certs/ |
3、 配置vsftpd服务支持SSL:/etc/vsftpd/vsftpd.conf
1 | ssl_enable=YES 启用SSL |
4、 用filezilla等工具测试
1、虚拟用户:
所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号
的家目录
各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
2、虚拟用户帐号的存储方式:
文件:编辑文本文件,此文件需要被编码为hash格式
奇数行为用户名,偶数行为密码
db_load -T -t hash -f vusers.txt vusers.db
关系型数据库中的表中:
3、实时查询数据库完成用户认证
]]>mysql库:pam要依赖于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
1、匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
扩展匹配:通过复杂高级功能匹配
2、处理动作:称为target,跳转目标
3、规则要添加在链上,才生效;添加在自定义上不会自动生效
1、内置链:每个内置链对应于一个钩子函数
2、自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效
1、要实现那种功能:判断添加在那张表上
2、报文流经的路径:判断添加在哪个链上
3、报文的流向:判断源和目的
4、匹配规则:业务需要
1、同类规则(访问同一应用),匹配范围小的放上面
2、不同类规则(访问不同应用),匹配到报文频率较大的放上面
3、将那些可由一条规则描述的多个规则合并为一个
4、设置默认策略
Centos 7 系统环境1
2systmectl stop firewalld.service 关闭防火墙
systemctl disable firewalld.service 设置开机不启动
Centos 6 系统环境1
2service iptables stop 关闭防火墙
chkconfig iptables off 设置开机不启动
1 | iptables [-t table] SUBCOMMAND chain [-m matchname [per-matchoptions]] -j targetname [per-target-options] |
-N:new,自定义一条新的规则链
-X:delete,删除自定义的空的规则链
-P:Policy,设置默认策略;对filter表中的链默认为ACCEPT,可修改DROP
-E:重命名自定义链;引用计数不为0的自定义链不能够重命名,也不能被删除
-L:list, 列出指定鏈上的所有规则,本选项须置后
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息
-vv 更详细
-x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
–line-numbers:显示规则的序号
常用组合:–vnL;–vvnxL; –line-numbers
-S selected,以iptables-save 命令格式显示链上规则
]]>-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
-D:delete,删除
(1) 指明规则序号
(2) 指明规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空指定的规则链
-Z:zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和