网页区域访问限制

网页区域访问限制

需求:因为之前在加强网络安全那篇文章中,用ip来判断能不能登录wp-login.php界面,电脑固定住倒还好,但是一旦换了地址不能直接使用上,还需要去服务器修改IP,麻烦死了。再加上现在有一定的手机编辑需求,倒不是编辑文章,而是有感而发一篇说说都不行,因为IP老是变化,所以烦得很。

解决方法:一开始我想能不能搞到mac地址,后来移动端好像弄不到,最终还是放弃了。所以使用一个折中的方法吧,判断IP是不是北京的就行了,毕竟我会较长时间的停留在这个区域,所以移动端也能够登录,虽然会比之前的安全隐患大一点,但其实无所谓了,凑活吧。

CDN区域控制访问

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" ';
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇