外国貿易ウェブサイトを構築している多くの友人は、自分のウェブサイトが国内 IP からアクセスされることを制限したいと考えています。また、さまざまな理由で特定の IP からブロックする必要があるリソースをウェブサイトに保存している友人もいます。ソース IP のほとんどは海外からのものであるため、外国の IP が Web サイトにアクセスできないようにしたいと考えています。
理由が何であれ、特定の地域や国からのIPアクセスをブロックしたりブロックしたりすることは、日常のWebサイト構築でよく使用されます。 PHP を使用している場合、比較的簡単な方法は、PHP ファイルに IP を決定するコードを追加し、IP ライブラリを使用して比較することです。IP がアクセス制限範囲内にある場合は、アクセスの継続を禁止します。
Web サイトが Nginx の場合、Nginx-ngx_http_geoip_module モジュールを直接使用できます。このモジュールは国、地方、都市などの IP を正確に把握でき、アクセスの識別とブロックはすべて Nginx によって実行されます。 PHP に比べてリソースが節約されますが、Nginx はコンパイルが面倒です。
Web サイトが VPS または独立したサーバー上に構築されている場合は、Linux ファイアウォールを直接使用し、iptables ルールを使用して特定の国や地方からの IP アクセスをブロックできます。もちろん、WordPress には IP アクセスを制限するさまざまなプラグインがすでに用意されているため、WordPress ユーザーは Nginx、iptables、その他の設定の問題について心配する必要はありません。
この記事では、Web サイトをブロックし、特定の地域や国で IP アクセス設定をブロックするための 4 つの方法 (PHP コード、Nginx モジュール、iptables ファイアウォール、WordPress プラグイン) を紹介します。 Web サイトの構築プロセス中に常にさまざまな悪意のある攻撃に悩まされている場合は、次の方法を試すことができます。
- 無料の VPS コントロール パネルを使用するための 5 つのセキュリティに関するヒント – ハッカーに利用させないでください
- WordPress で Nginx fastcgi_cache キャッシュ アクセラレーション メソッドを有効にする - Nginx 構成例
- あなたが知らないかもしれない CloudFlare の無料 CDN 高速化に関する 10 のヒント - SSLDDOSCache
追記: 2019 年 3 月 25 日更新、 VPS のセキュリティ問題に関しては、多くの友人が VPS 自体の SSH 設定を無視している可能性があります。強化戦略は次のとおりです。VPS ホストとサーバーのセキュリティ保護: SSH 変更ポート。 、ホワイトリストを追加、キーログインのみ。
追記: 2020 年 3 月 19 日更新 、Web サイトがハッキングされた場合は、次の方法を参照して問題を解決できます: Web サイトのトロイの木馬とサーバー ハッキングのトラブルシューティング分析 - VPS ホストとサーバーの強化されたセキュリティ方法。
1. PHP コードが特定の IP をブロックする
PHP コードは比較的単純で、次のコードを PHP ファイルに挿入するだけで、特定の範囲内の IP が Web サイトにアクセスするのを防ぐことができます。例は次のとおりです (このコードは BA 中に使用できます)。
<?php
/**
*
* test.php(屏蔽国家IP)
*
*/
$verification = '美国';//需要屏蔽国家的IP
function get_client_ip() {
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR'];
}
elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
return $ip;
}
$ip = get_client_ip();//获取访客IP
$antecedents = $_SERVER['HTTP_REFERER'];//访客来路地址
$result = file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip);//IP数据库来自淘宝。
$address = json_decode($result,true);
//判断访客是否属于美国,是否来自百度,是否来自谷歌
if($address['data']['country'] == $verification && strpos($antecedents, 'baidu') === false && strpos($antecedents, 'google') === false){
sleep(10);//设置一个10秒等待。
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 3600000');
exit;
}
/****** 如果需要阻止某一个省份的IP访问,使用以下代码*********/
<?php
/**
*
* test.php(屏蔽地方IP)
*
*/
$verification = '江西省';//需要屏蔽省份的IP
function get_client_ip() {
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR'];
}
elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
return $ip;
}
$ip = get_client_ip();//获取访客IP
$antecedents = $_SERVER['HTTP_REFERER'];//访客来路地址
$result = file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip);//IP数据库来自淘宝。
$address = json_decode($result,true);
//判断访客是否属于江西省,是否来自百度,是否来自谷歌
if($address['data']['region'] == $verification && strpos($antecedents, 'baidu') === false && strpos($antecedents, 'google') === false){
sleep(99999999);//设置一个999999秒的等待。
Header("HTTP/1.1 204 No Content");
exit;
}2. Nginx-ngx_http_geoip_module モジュール
IP ライブラリのダウンロード:
- HTTPS://Dev.马Xiumin's.com/Geo IP/legacy/geohlit/
2.1 特定の国 IP からのアクセスを禁止する
ngx_http_geoip_module モジュールを使用すると、Nginx が訪問者の IP に基づいてさまざまなニーズを実装できるようになります。ここでは、ngx_http_geoip_module モジュールを使用して、特定の IP アドレスが Web サイトにアクセスするのを防ぎます。
1 つ目は、ngx_http_geoip_module を Nginx にコンパイルすることです。 Pagoda BT パネルを使用している場合は、次のコマンドを使用できます。
#安装geoip库 yum -y install epel-release yum -y install geoip-devel #先查看一下本机的Nginx配置情况 [root@cs ~]# nginx -V nginx version: nginx/1.14.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.0.2l 25 May 2017 TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 --with-ld-opt=-ljemalloc #开始下载Nginx,这里用的是1.15.1,你也可以下载其它的版本 wget http://nginx.org/download/nginx-1.15.1.tar.gz tar -xzvf nginx-1.15.1.tar.gz cd nginx-1.15.1 #下面的命令只是在上面的Nginx -v得到的配置详情后加上了--with-http_geoip_module,目的是为了保持原来的配置不变同时又增加新的模块 ./configure --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 --with-ld-opt=-ljemalloc --with-http_geoip_module #只编译不安装 make
LNMP スクリプトまたは Oneinstack を使用している場合は、Oneinstack を参照してください。 Nginx-ngx_http_geoip_module モジュールを有効にします。まずNginxを無効にします。

次に、新しい Nginx を置き換えて、geoip モジュールがロードされているかどうかを確認します。コマンドは次のとおりです。
mv /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx-lala.im cp objs/nginx /www/server/nginx/sbin/nginx ldd /www/server/nginx/sbin/nginx

Pagoda パネルに移動し、「Nginx」をクリックして構成ファイルを変更し、次のコードを追加します。
geoip_country /usr/share/GeoIP/GeoIP.dat;
操作は次のとおりです。

次に、Nginx を起動します。たとえば、指定したエラーを返したり、特定の国から別のページや Web サイトに直接 IP アクセスをしたりできます。
#返回403 502 404等错误
location / {
default_type text/html;
charset utf-8;
if ($geoip_country_code = CN) {
return 403;
}
}
#导向另一个网站目录
location / {
default_type text/html;
charset utf-8;
if ($geoip_country_code = CN) {
root /home/www/wzfou.com-cn/;
}
}これは、Web サイトの構成を追加するためです。

最終的な効果は以下の通りです。

2.2 指定した国からの IP アクセスのみを許可する
方法は上記と同じです。まず、Nginx のメイン構成に IP ライブラリを導入し、次に Web サイトの Nginx 構成ですべての国内 IP をブロックし、指定された国内 IP を許可するコードを追加します。
# 引入IP库
geoip_country /usr/share/GeoIP/GeoIP.dat;
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;
map $geoip_country_code $allowed_country {
default no;
CN yes;
}
# 在配置中阻止IP
if ($allowed_country = no) {
return 403;
}3. iptables ファイアウォール
まず、iptables の使用法と ipset について理解してください。
1. iptables には複数のテーブルが含まれており、各テーブルはチェーンで構成されています。デフォルトはフィルター テーブルで、最も一般的に使用されるのはフィルター テーブルで、その他のより一般的に使用されるのは nat テーブルです。一般に、IP ブロッキングは、フィルター テーブルの INPUT チェーンにルールを追加することです。
2. ルールを照合する場合は、ルール リストの先頭から最後まで 1 つずつ照合します。
3. ipset は、この O(n) 操作を O(1) に変換するメソッドを提供します。処理対象の IP をセットに入れ、このセットに iptables ルールを設定します。 iptable と同様に、IP セットは Linux カーネル内の何かであり、ipset コマンドはそれを操作するツールです。
iptables は、指定された IP がマシンの指定されたポートにアクセスすることのみを許可します。 コマンドは次のとおりです。
1、在tcp协议中,禁止所有的ip访问本机的3306端口。 iptables -I INPUT -p tcp –dport 3306 -j DROP 2、允许123.456.789访问本机的3306端口 iptables -I INPUT -s 123.456.789 -p tcp –dport 3306 -j ACCEPT 以此类推………………………………… 封掉一个IP段: iptables -I INPUT -s 121.0.0.0/8 -j DROP 以上命令的顺序不能错 然后保存iptables # service iptables save 重启防火墙 #service iptables restart
iptables ルールを削除、クリア、閉じ、保存する方法:
#CentOS 7请停止firewalld并安装iptables-services systemctl stop firewalld systemctl mask firewalld #安装 iptables-services yum install iptables-services ################ 保存 iptables 规则 service iptables save 重启 iptables service iptables restart ################# 执行清除命令 iptables -F时可能会断开与服务器的连接,如果想清空的话,先执行 /sbin/iptables -P INPUT ACCEPT 然后执行 /sbin/iptables -F 如果关闭防火墙,执行 /etc/init.d/iptables stop 或者是 services iptables stop ####################### iptables 规则若重启后消失,请用以下方法 步骤1:备份 iptables-save > /etc/iptables.up.rules.bak 步骤2:删除规则 vim /etc/sysconfig/iptables 或 vim /etc/iptables.up.rules 手动删除即可。 步骤3:导入新规则 iptables-restore < /etc/sysconfig/iptables 最后,重启VPS就可以生效了。
3.1 指定した国からの IP アクセスをワンクリックでブロック
- HTTPS://GitHub.com/III i III1/block-IPS-from-countries
原則として、指定した国の IP セグメントをダウンロードし、その IP セグメントを iptables ルールに追加して、次のコマンドを直接実行します。
wget https://raw.githubusercontent.com/iiiiiii1/Block-IPs-from-countries/master/block-ips.sh chmod +x block-ips.sh ./block-ips.sh
次に、IP をブロックするか、IP のブロックを解除するかを選択するよう求められます。

IP をブロックすることを選択すると、国コードを入力するように求められます。http://www.ipdeny.com/ipblocks を確認してください。たとえば、米国の場合は必ず IP を入力してください。米国全体の禁止。

ブロックを解除したい場合は、再度コマンドを実行し、2を選択してください。

3.2 ワンクリックで指定した国の IP アクセスのみを許可
上記では特定の国からの IP アクセスをワンクリックでブロックする機能を実装しましたが、多くの人は特定の国からの IP のみに Web サイトへのアクセスを許可し、他の国からのアクセスを禁止したいと考えています。指示:
wget https://do.wzfou.net/wzfou/block-any.sh chmod +x block-ips.sh ./block-ips.sh
上記のコードは国内 IP アクセスのみを許可し、ルールを /etc/rc.d/rc.local に書き込みます。iptables ルールを調整すると、システムが再起動されるたびに iptables ルールが再インポートされます。編集する必要があります: / etc/rc.d/rc.local 対応する起動自己実行コードを削除します。 block-any.sh コードは次のとおりです。
#! /bin/bash
#判断是否具有root权限
root_need() {
if [[ $EUID -ne 0 ]]; then
echo "Error:This script must be run as root!" 1>&2
exit 1
fi
}
#检查系统分支及版本(主要是:分支->>版本>>决定命令格式)
check_release() {
if uname -a | grep el7 ; then
release="centos7"
elif uname -a | grep el6 ; then
release="centos6"
yum install ipset -y
elif cat /etc/issue |grep -i ubuntu ; then
release="ubuntu"
apt install ipset -y
fi
}
#安装必要的软件(wget),并下载中国IP网段文件(最后将局域网地址也放进去)
get_china_ip() {
#安装必要的软件(wget)
rpm --help >/dev/null 2>&1 && rpm -qa |grep wget >/dev/null 2>&1 ||yum install -y wget ipset >/dev/null 2>&1
dpkg --help >/dev/null 2>&1 && dpkg -l |grep wget >/dev/null 2>&1 ||apt-get install wget ipset -y >/dev/null 2>&1
#该文件由IPIP维护更新,大约一月一次更新(也可以用我放在国内的存储的版本,2018-9-8日版)
[ -f china_ip_list.txt ] && mv china_ip_list.txt china_ip_list.txt.old
wget https://github.com/17mon/china_ip_list/blob/master/china_ip_list.txt
cat china_ip_list.txt |grep 'js-file-line">' |awk -F'js-file-line">' '{print $2}' |awk -F'<' '{print $1}' >> china_ip.txt
rm -rf china_ip_list.txt
#wget https://qiniu.wsfnk.com/china_ip.txt
#放行局域网地址
echo "192.168.0.0/18" >> china_ip.txt
echo "10.0.0.0/8" >> china_ip.txt
echo "172.16.0.0/12" >> china_ip.txt
}
#只允许国内IP访问
ipset_only_china() {
echo "ipset create whitelist-china hash:net hashsize 10000 maxelem 1000000" > /etc/ip-black.sh
for i in $( cat china_ip.txt )
do
echo "ipset add whitelist-china $i" >> /etc/ip-black.sh
done
echo "iptables -I INPUT -m set --match-set whitelist-china src -j ACCEPT" >> /etc/ip-black.sh
#拒绝非国内和内网地址发起的tcp连接请求(tcp syn 包)(注意,只是屏蔽了入向的tcp syn包,该主机主动访问国外资源不用影响)
echo "iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 0 -j DROP" >> /etc/ip-black.sh
#拒绝非国内和内网发起的ping探测(不影响本机ping外部主机)
echo "iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP" >> /etc/ip-black.sh
#echo "iptables -A INPUT -j DROP" >> /etc/ip-black.sh
rm -rf china_ip.txt
}
run_setup() {
chmod +x /etc/rc.local
sh /etc/ip-black.sh
rm -rf /etc/ip-black.sh
#下面这句主要是兼容centos6不能使用"-f"参数
ipset save whitelist-china -f /etc/ipset.conf || ipset save whitelist-china > /etc/ipset.conf
[ $release = centos7 ] && echo "ipset restore -f /etc/ipset.conf" >> /etc/rc.local
[ $release = centos6 ] && echo "ipset restore < /etc/ipset.conf" >> /etc/rc.local
echo "iptables -I INPUT -m set --match-set whitelist-china src -j ACCEPT" >> /etc/rc.local
echo "iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 0 -j DROP" >> /etc/rc.local
echo "iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP" >> /etc/rc.local
#echo "iptables -A INPUT -j DROP" >> /etc/rc.local
}
main() {
check_release
get_china_ip
ipset_only_china
case "$release" in
centos6)
run_setup
;;
centos7)
chmod +x /etc/rc.d/rc.local
run_setup
;;
ubuntu)
sed -i '/exit 0/d' /etc/rc.local
run_setup
echo "exit 0" >> /etc/rc.local
;;
esac
}
main一部の IP を除外し、これらの IP が例外としてアクセスを継続できるようにする場合は、iptables -I コマンドを使用して iptables ルールを追加するか、iptables ルールを手動で追加することができます。ルールの順序は次のとおりです。 iptables は上から下に実行されます。
3.3 特定の国からの IP アクセスのみを許可するように手動で設定
手動設定は、上記のワンクリック設定方法と同じで、次のコマンドを 1 つずつ実行するだけです。
1、安装ipset #Debian/Ubuntu系统 apt-get -y install ipset #CentOS系统 yum -y install ipset CentOS 7还需要关闭firewall防火墙: systemctl stop firewalld.service systemctl disable firewalld.service 2、清空之前的规则 #防止设置不生效,建议清空下之前的防火墙规则 iptables -P INPUT ACCEPT iptables -F 3、创建新规则 #创建一个名为cnip的规则 ipset -N cnip hash:net #下载国家IP段,这里以中国为例,其它国家IP下载参考:http://www.ipdeny.com/ipblocks/ wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone #将IP段添加到cnip规则中 for i in $(cat /root/cn.zone ); do ipset -A cnip $i; done 4、设置IP段白名单 #放行IP段 iptables -A INPUT -p tcp -m set --match-set cnip src -j ACCEPT #关掉所有端口 iptables -P INPUT DROP 这时候就只有指定国家的IP能访问服务器了。 #如果你在国内,网站不允许被国内人访问,建议别关所有端口,这样你的S-S-H会上不去,我们可以只关闭80/443端口。 #关闭指定端口,比如80/443 iptables -A INPUT -p tcp --dport 80 -j DROP iptables -A INPUT -p tcp --dport 443 -j DROP 这时候其他国家的IP是无法访问你服务器的80/443端口,等于无法访问你的网站,其它端口还是可以访问的。 5、删除规则 #将参数里的-A改成-D就是删除规则了,如 iptables -D INPUT -p tcp -m set --match-set cnip src -j ACCEPT iptables -D INPUT -p tcp --dport 443 -j DROP
4. WordPress が特定の IP をブロックする
WordPress プラグイン
- HTTPS://WordPress.org/plugins/word volume/
- HTTPS://WordPress.org/plugins/all-in-one-怖い-security-安定-firewall/
- HTTPS://WordPress.org/plugins/IP-geoh-block/
上記の 3 つの WordPress セキュリティ プラグインにはすべて、IP アクセスをブロックする設定があり、IP の送信元、国、範囲、ドメイン名に基づいてブロックできます。 (拡大するにはクリックしてください)

IP Geo Block は、特定の IP アドレスをブロックするだけでなく、別の IP アドレスが別のページにアクセスすることをブロックまたは防止することもできます。 (拡大するにはクリックしてください)

5. まとめ
Web サイトが特定の国の IP をブロックする最も簡単な方法は、この記事で紹介した PHP コードです。これは精度が非常に高く、州や都市も正確にブロックできます。ニーズに応じて調整できます。欠点は、HTTPS をサポートしておらず、PHP でのみ実行できることです。
実際、最も一般的に使用されているのは iptables で、Linux ファイアウォールのように IP アクセスを直接ブロックします。リソースを消費せず、クリーンかつ完全にブロックします。 Nginx の Geo IP モジュールには幅広いアプリケーションがあり、Nginx と組み合わせることで、さまざまな IP ユーザーにさまざまなコンテンツを表示できます。