Nginx geo

nginx geo

Posted by gomyck on June 15, 2022

使用 GEO 指令操作 IP 后续的动作

geo指令

1
2
3
4
语法: geo [$address] $variable { ... }
默认值: —
配置段: http
定义从指定的变量获取客户端的IP地址。默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量获得。

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#如果从 $remote_addr 取, 可以省略这个参数
geo $remote_addr $var {
    default 0;
    127.0.0.1 1;
}
geo $gomyck_ip $var {
    default 0;
    127.0.0.1 1;
}

#使用 if 判断 var
if ( $var = 0 ) {
    return 403;
}

如果该变量的值不能代表一个合法的IP地址,那么nginx将使用地址 “255.255.255.255” nginx通过CIDR或者地址段来描述地址,支持下面几个参数:

1)delete: 删除指定的网络 2)default: 如果客户端地址不能匹配任意一个定义的地址,nginx将使用此值。 如果使用CIDR(无类型域间路由),可以用”0.0.0.0/0”代替default 3)include: 包含一个定义地址和值的文件,可以包含多个。 4)proxy: 定义可信地址。 如果请求来自可信地址,nginx将使用其“X-Forwarded-For”头来获得地址。 相对于普通地址,可信地址是顺序检测的。 5)proxy_recursive: 开启递归查找地址。 如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用”X-Forwarded-For”中的最 后一个地址来代替原始客户端地址。如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用”X-Forwarded-For”中最后一个与所有可 信地址都不匹配的地址来代替原始客户端地址。 6)ranges: 使用以地址段的形式定义地址,这个参数必须放在首位。为了加速装载地址库,地址应按升序定义。

1
2
3
4
5
6
7
geo $country {
    default CN;
    include conf/country.conf;
    delete 127.0.0.0/16;
    proxy 192.168.3.0/24;
    proxy 2001:0db8::/32;
}

vim conf/country.conf

1
2
3
4
127.0.0.0/24   US;
127.0.0.1/32   EN;
10.1.0.0/16    HK;
192.168.1.0/24 JP;

map 的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 映射值(http_host)到值(name):
map $http_host $name {
    hostnames;
    default       0;
    example.com   1;
    *.example.com 1;
    example.org   2;
    *.example.org 2;
    .example.net  3;
    wap.*         4;
}

map $http_user_agent $mobile {
    default       0;
    "~Opera Mini" 1;
}

limit_conn_zone 的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http {
    # $binary_remote_addr 是压缩变量:请求 IP
    # gomyck 是 zone 的名称, 随便定义
    # 10m 是连接池的大小, 存储 IP 的大小  1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息
    limit_conn_zone $binary_remote_addr zone=gomyck:10m;
    ...
    server {
        ...
        location /download/ {
            # gomyck 并发连接数限制为 1 个
            limit_conn gomyck 1;
        }
    }
}