使用 iptables 阻止特定地区和国家的 IP 访问

[toc]

前言

无论是出于什么原因,屏蔽和阻止特定地区和国家的 IP 访问都是我们日常建站中经常要用到的。

如果网站是 Nginx,则可以直接使用 Nginx-ngx_http_geoip_module 模块,该模块可以精确到国家、省、市等一级的 IP,并且全部由 Nginx 执行识别和阻止访问,所以相对于 PHP 来说比较省资源,但是 Nginx 编译起来比较费事。

如果网站是搭建在 VPS 或者独立服务器上,那么可以直接使用 Linux 防火墙,利用 iptables 规则来阻止特定国家和省份的 IP 访问。

iptables 规则来阻止特定 IP 访问

  1. 安装 iptables 防火墙
1
2
# CentOS
yum install iptables
  1. 清除已有 iptables 规则
1
2
3
iptables -F
iptables -X
iptables -Z
  1. 屏蔽指定 IP
1
2
3
4
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP
  1. 查看已添加的 iptables 规则
1
2
3
4
iptables -L -n
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M)
n:只显示IP地址和端口号,不将ip解析为域名
  1. iptables 的开机启动及规则保存
1
2
3
4
5
chkconfig –level 345 iptables on
systemctl enable iptables.service
# 如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。
# CentOS
service iptables save <--保存规则
  1. 重启后生效
1
2
开启:chkconfig iptables on
关闭:chkconfig iptables off
  1. 即时生效,重启后失效
1
2
开启:service iptables start
关闭:service iptables stop