网页区域访问限制
需求:因为之前在加强网络安全那篇文章中,用ip来判断能不能登录wp-login.php界面,电脑固定住倒还好,但是一旦换了地址不能直接使用上,还需要去服务器修改IP,麻烦死了。再加上现在有一定的手机编辑需求,倒不是编辑文章,而是有感而发一篇说说都不行,因为IP老是变化,所以烦得很。
解决方法:一开始我想能不能搞到mac地址,后来移动端好像弄不到,最终还是放弃了。所以使用一个折中的方法吧,判断IP是不是北京的就行了,毕竟我会较长时间的停留在这个区域,所以移动端也能够登录,虽然会比之前的安全隐患大一点,但其实无所谓了,凑活吧。
CDN区域控制访问
CDN的设置,在访问控制,不过目前腾讯云内测,免费,我先嫖一段时间,估计之后要收费了。我只设置成只有中国才能够访问,正经人谁用外网访问我的网页。

nginx区域控制访问
参考链接:https://www.cnblogs.com/s42-/p/14668356.html
上面的粒度还是比较大的,使用nginx的geoip模块能更加细粒度的控制。
安装nginx的geoip
首先要有nginx,直接apt安装就行了
当然可以一开始直接安装带所有模块的nginx
sudo apt install nginx-full
由于我之前只安装了正常的nginx,现在需要模块
sudo apt install nginx-extras
这样子其他的所有模块都会加进来,不止有geoip,这样子方便,
当然可以只安装这两个模块
sudo apt install libnginx-mod-http-geoip libnginx-mod-http-geoip2
不过我不缺这点空间,还是把所有模块都加上了
下载geoip数据
去www.maxmind.com注册一个账号,然后就能免费下载数据了。
下载country和city的就行了,ASN是外国用的。
安装libmaxminddb
下载链接:https://github.com/maxmind/libmaxminddb/releases
去下载最新版的版本
然后安装
tar -xzf libmaxminddb-1.6.0.tar.gz
cd libmaxminddb-1.6.0
./configure
make
make check
sudo make install
sudo ldconfig
测试一下
mmdblookup --file ~/download/GeoLite2-City_20210824/GeoLite2-City.mmdb --ip 61.151.164.124
{
"city":
{
"geoname_id":
1816670 <uint32>
"names":
{
"de":
"Beijing" <utf8_string>
"en":
"Beijing" <utf8_string>
"es":
"Pekín" <utf8_string>
"fr":
"Pékin" <utf8_string>
"ja":
"北京市" <utf8_string>
"pt-BR":
"Pequim" <utf8_string>
"ru":
"Пекин" <utf8_string>
"zh-CN":
"北京" <utf8_string>
}
}
"continent":
{
"code":
"AS" <utf8_string>
"geoname_id":
6255147 <uint32>
"names":
{
"de":
"Asien" <utf8_string>
"en":
"Asia" <utf8_string>
"es":
"Asia" <utf8_string>
"fr":
"Asie" <utf8_string>
"ja":
"アジア" <utf8_string>
"pt-BR":
"Ásia" <utf8_string>
"ru":
"Азия" <utf8_string>
"zh-CN":
"亚洲" <utf8_string>
}
}
"country":
{
"geoname_id":
1814991 <uint32>
"iso_code":
"CN" <utf8_string>
"names":
{
"de":
"China" <utf8_string>
"en":
"China" <utf8_string>
"es":
"China" <utf8_string>
"fr":
"Chine" <utf8_string>
"ja":
"中国" <utf8_string>
"pt-BR":
"China" <utf8_string>
"ru":
"Китай" <utf8_string>
"zh-CN":
"中国" <utf8_string>
}
}
"location":
{
"accuracy_radius":
1 <uint16>
"latitude":
39.928500 <double>
"longitude":
116.385000 <double>
"time_zone":
"Asia/Shanghai" <utf8_string>
}
"registered_country":
{
"geoname_id":
1814991 <uint32>
"iso_code":
"CN" <utf8_string>
"names":
{
"de":
"China" <utf8_string>
"en":
"China" <utf8_string>
"es":
"China" <utf8_string>
"fr":
"Chine" <utf8_string>
"ja":
"中国" <utf8_string>
"pt-BR":
"China" <utf8_string>
"ru":
"Китай" <utf8_string>
"zh-CN":
"中国" <utf8_string>
}
}
"subdivisions":
[
{
"geoname_id":
2038349 <uint32>
"iso_code":
"BJ" <utf8_string>
"names":
{
"en":
"Beijing" <utf8_string>
"fr":
"Municipalité de Pékin" <utf8_string>
"zh-CN":
"北京市" <utf8_string>
}
}
]
}
nginx配置geoip2
因为我CDN上已经配置了国家了,所以这一块的国家我就不管了,我只用到city这个文件。
在nginx.conf中的http下新增
geoip2 /etc/nginx/maxmind/GeoLite2-City.mmdb{
$geoip2_city_name source=$http_x_forwarded_for city names en;
$geoip2_country_code country iso_code;
}
注意:,这里的source是重点,把访问的真实ip当做来源配置。关于http_x_forwarded_for可以查看我之前的加强网络安全这篇文章。
server下新增
location = /wp-login.php {
if ($geoip2_city_name !~ "Beijing) {
return 411;
}
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
上述的配置就是如果访问的地区如果不是Beijing,那么就返回411代码。
当然,有些IP可能解析不出来,比如我用的教育网,解析不出来是北京,那么就要手动添加白名单。首先先解析地区,如果地区对不上,那么看看IP是否对的上,如果IP也对不上,那么就返回411。由于nginx不支持逻辑或,只能通过下面这种取巧的方式。
location = /wp-login.php {
set $flag 0;
if ($geoip2_city_name !~ "Beijing|Wenzhou") {
set $flag "${flag}1";
}
if ($http_x_forwarded_for !~* "白名单IP1|白名单IP2") {
set $flag "${flag}2";
}
if ($flag = "012") {
return 411;
}
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
日志格式
顺便设置一下日志格式,这样子也能显示国家和地区名称,美滋滋。
log_format main '$geoip2_country_code $geoip2_city_name $http_x_forwarded_for - $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" ';





