1 通过IP地址限制访问
Nginx能允许或拒绝基于特定IP地址或客户端计算机IP地址范围。为了允许或定义访问,在stream上下文或server块中使用allow和deny指令:
stream {
...
server {
listen 12345;
deny 192.168.1.2;
allow 192.168.1.1/24;
allow 2001:0db8::/32;
deny all;
}
}
规则按顺序处理,从上到下:如果在序列中第一个指令deny all,那么后面所有allow指令都没有效果。在该例子中,子网络192.168.1.1/24允许访问,除了192.168.1.2。IPv6范围地址2001:0db8::/32也允许,其它任何IP地址被拒绝。
2 限制TCP连接数
你能限制来自一个IP地址同时的TCP连接。这能防止拒绝服务(Dos)攻击。
首先,让我们定义区域存储一台服务器最大TCP连接数,和标识连接的键。这可以在stream上下文中使用limit_conn_zone指令完成:
stream {
...
limit_conn_zone $binary_remote_addr zone=ip_addr:10m;
...
}
标识连接的键定义为$binary_remote_addr,代表客户端IP地址的二进制格式。共享内存区域的名字是ip_addr,区域大小是10兆字节。
区域定义后,使用limit_conn指令限制连接。它的第一个参数指定共享内存区域的名字。第二个参数,指定每个IP地址允许连接的最大连接数:
stream {
...
limit_conn_zone $binary_remote_addr zone=ip_addr:10m;
server {
...
limit_conn ip_addr 1;
}
}
当每个IP地址的连接数时,请注意,多个主机在一个广播地址(NAT)设备共享相同IP地址。
3 限制带宽
你能配置TCP连接的最大下载或上传速度。分别包括proxy_download_rate或proxy_upload_rate指令:
server {
...
proxy_download_rate 100k;
proxy_upload_rate 50k;
}
使用这些设置,客户端能通过单个连接最大每秒100千字节下载数据,通过单个连接最大每秒50千字节上传数据。然而,客户端能打开多个连接。如果我们的目标是为每个客户端限制整体加载的速度,连接数必须限制为1:
stream {
...
limit_conn_zone $binary_remote_addr zone=ip_addr:10m;
server {
...
limit_conn ip_addr 1;
proxy_download_rate 100k;
proxy_upload_rate 50k;
}
}