nginx:如何阻止访问者按国家与GeoIP模块(Debian / Ubuntu)

nginx:如何阻止访问者通过GeoIP模块(Debian / Ubuntu)

本教程介绍了如何使用nginx的GeoIP模块来阻止访问者按国家/地区。 GeoIP数据库可将用户的IP地址映射到国家。 必须使用HttpGeoipModule编译nginx才能使用GeoIP数据库。

我不会保证这将为您工作!

1初步说明

如引言所述,nginx必须用HttpGeoipModule编译。 要检查您的nginx是否使用该模块编译,请运行:

nginx -V

如果您在输出中看到--with-http_geoip_module ,则可以使用带有nginx的GeoIP数据库:

root@server1:~# nginx -V
nginx version: nginx/1.2.1
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-auth-pam --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-echo --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-upstream-fair --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-dav-ext-module
root@server1:~#

2安装GeoIP数据库

在Debian / Ubuntu上,GeoIP数据库可以安装如下:

apt-get install geoip-database libgeoip1

这将GeoIP数据库放在/usr/share/GeoIP/GeoIP.dat中

有可能是有点过时了。 因此,我们可以选择从GeoIP网站下载新的副本:

mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak
cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz

3配置nginx

打开/etc/nginx/nginx.conf ...

vi /etc/nginx/nginx.conf

...并将其放在http {}块中,然后再包含任何行:

[...]
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        FK no;
        FM no;
        EH no;
    }
[...]

这允许所有国家,除了三个国家设置为否(您可以在这里找到国家代码清单)。 要做到这一点,另一种方式,即阻止所有国家,只允许少数几个,你会这样做:

[...]
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default no;
        FK yes;
        FM yes;
        EH yes;
    }
[...]

现在,这实际上并不阻止任何国家,它只是设置$ allowed_country变量。 要实际阻止国家/地区,您必须打开vhost配置,并将以下代码放在服务器{}容器中(这可以进入任何位置{}块之外):

[...]
        if ($allowed_country = no) {
            return 444;
        }
[...]

这将向阻止的国家/地区的任何访问者返回444错误代码。 这样做是关闭连接而不发送任何标题。 您也可以使用其他错误代码,如403(“禁止”),如果你愿意的话。

之后重新加载nginx:

/etc/init.d/nginx reload

4链接

关于作者

Falko Timme是所有者 Timme Hosting (超快nginx网页托管)。 他是youcl(自2005年以来)的主要维护者, 也是ISPConfig的核心开发人员之一 (自2000年起)。 他还为O'Reilly的“Linux系统管理”一书作出了贡献。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏