跳转至

前言

相信大家也都看到了,如今网络世界“动荡不安”,各国之间的争斗早已在互联网里展开。咱也不是专业的,在我们仅有的安全技术水平上,能不能做些力所能及的安全措施。因为我的系统都是通过nginx代理出去访问的,所以我就想能不通过nginx限制使用区域,比如非大陆的IP无法访问我们的系统。

准备工作

  • 安装扩展
    yum install libmaxminddb-devel -y
    
  • nginx 源码
  • ngx_http_geoip2_module 模块
  • geoip2最新的IP库

我这里以tengine为例

开始编译

  1. 如果你之前已经使用了nginx/tengine,最好先看看之前的编译参数,做到兼容,进入之前编译的目录(objs) image.png 查询当时的一个编译参数(configure arguments)
    1
    nginx -V
    
    image.png
  2. 将ngx_http_geoip2_module 模块放到服务器上,并赋予755、777权限

image.png

在我们接下来的编译中需要带上上面的参数,在这些参数的基础上再加上:

1
--add-module=/opt/ngx_http_geoip2_module
image.png

编译过程没有报错就继续执行

1
make && make install

开始配置

在安装完成以后,会在系统生成/usr/share/GeoIP/目录: image.png

里面有默认的IP地址库,一个ipv4的,一个ipv6的,但是我们需要最新的,我已经下载好了,在仓库里自行下载

image.png

然后在服务器上解压,放在任意目录,我这里放在/data/tengine/GeoIP/目录下

接下来需要配置一下nginx.conf的文件,在http模块里添加获取IP区域的函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
http {
    ...
    # 禁止国外ip进行访问
    geoip2 /data/tengine/GeoIP/GeoLite2-Country.mmdb {
         auto_reload 5m;
         $geoip2_data_country_code country iso_code;
    }

    map $geoip2_data_country_code $allowed_country {
         default no;
         CN yes;
    }
    ...
}

image.png

配置好了以后就可以在我们自己的配置文件中直接引用了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server {
    listen       50001;
    server_name  localhost;

    if ($allowed_country = no) {
       # return https://www.baidu.com;
        return 404;
    }

    location / {
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:1024;
    }
}

image.png

如果想放开香港的地址,可以改为

1
2
3
4
5
map $geoip2_data_country_code $allowed_country {
         default no;
         CN yes;
         HK yes;
    }

其他地区的可以按需放开,会科学上网的可以测试一下,我们的系统已经禁止非大陆的IP访问了

总结

我们也不是专业的安全人员,以上操作只能防止国外的人访问我们的系统,并不能做到直接禁掉端口,所以不知道有没有用,只能心里安慰自己有大用。