+135 410 16684Mon. - Fri. 10:00-22:00

aws elb负载均衡下,Apache及Nginx上进行访问限制

aws elb负载均衡下,Apache及Nginx上进行访问限制

aws elb负载均衡下,Apache及Nginx上进行访问限制

AccessLimitBehindLoadblancer

架构Web系统时在负载均衡下运行多台Web服务器,无论是在物理环境还是在云端都是常见场景。在阿里云上实现同样的架构时使用SLB + ECS
实现,当SLB在Web系统前端时和在单台ECS上运行Web系统时有些差异。

例如Web服务器识别的访问源IP地址就不同,SLB + ECS架构时Web服务器识别到的访问源IP地址(客户端地址)将会是SLB内网IP地址。而访问源IP地址将会被添加到X-Forwarded-For的末尾。虽然X-Forwarded-For不是RFC规定内容,而在使用代理或者负载均衡服务时的实际标准。

Apache上的访问限制

在Apache2.2里使用mod_setenvif模块进行,指定IP地址的访问限制。

<Location />
  # 禁止所有客户端的访问
  Order Allow,Deny
  Allow from all
</Location>
 
<Location /site_b>
  SetEnvIf X-Forwarded-For "192\.168\.0\.0.*" allowed_ip
 
  # 仅允许指定IP访问
  Order Deny,Allow
  Deny from all
  Allow from env=allowed_ip
</Location>

接下来介绍一下在Apache2.4上进行访问限制的方法。Apache2.4里使用mod_remoteip模块,在Amazon Linux的httpd24包默认激活的状态。该模块提供的RemoteIPHeader指令,确认X-Forwarded-For内容并让Apache识别为访问源IP地址(客户端IP)。利用该模块可简单的进行访问限制。

# 把X-Forwarded-For设定为访问源IP(客户端IP)
RemoteIPHeader X-Forwarded-For
 
<Location />
  # 允许所有客户端的访问
  Require all granted
</Location>
 
<Location />
  # 仅允许指定的IP地址访问
  Require ip 192.168.0.0
</Location>

Nginx上的访问限制

在Nginx上使用ngx_http_map_module模块 $http_x_forwarded_for 进行访问限制,nginx.conf上的设定如下。

map $http_x_forwarded_for $allowed {
    default deny;
    ~\s*192.168.0.0$ allow;
    ~\s*8.8.8.*$   allow;
}

location / {
    if ( $allowed = "deny" ) { return 403; }
    alias /path/to/document_root
}

ngx_http_map_module

小结

阿里云的SLB是一个简单易用的负载均衡器,可使用“加权轮询”、“加权最小连接数”、“轮询”分配方式。

在负载均衡下配置Web服务器时,访问日文文件里记录获取访问源IP(客户端IP)时,也使用 X-Forwarded-For 信息。

比如在SLB下运行Nginx时,获取访问源IP地址时也需添加 $http_x_forwarded_for。

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" $request_time';

Leave a Reply