我有一个网络应用,在菲律宾没有用户,但却不断受到垃圾邮件发送者、测试卡的卡片发送者和其他不良活动的轰炸。我在日志中看到,他们的 IP 在菲律宾,最初是通过 google.ph 或其他.ph
网站找到我的网站的。
我已经安装了相当好的过滤器和安全检查,所以它们实际上不会造成太大的损害,但尽管如此,我真的厌倦了。它们占用带宽,用垃圾填满我的数据库、滥用日志和安全日志,浪费我的时间处理帐户等。
虽然绝大多数菲律宾公民都不是垃圾邮件发送者,我也不能屏蔽每个让我感到厌烦的国家,但目前,我认为解决方案就是屏蔽从菲律宾到我的网络应用程序的所有流量。(我知道屏蔽整个国家的 IP 封禁不是一个好做法,而且存在很多问题,但对于这个国家,我想破例。)
(我知道他们可以伪造他们的 IP 地址,但至少我可以让他们为此付出一点努力。)
我知道有一些 geoip 服务。有人知道有什么免费或便宜的服务吗?或者有其他方法可以过滤掉来自特定国家的流量吗?
如果重要的话,我在 Apache 2 上运行 PHP。
答案1
您可以使用免费的 IP Locatin API(如 IPInfoDB http://ipinfodb.com/index.php)根据 IP 地址执行此操作。
答案2
与这里的大多数其他发帖者不同,我不会告诉你这是一个坏主意,你不应该这样做,这不会解决你的问题,或者你应该做其他事情。以下是我们发生的事情:
来自中国和韩国的人(或者无论如何使用中国和韩国的代理)一直在骚扰我们。端口扫描、爬取我们的网站以寻找漏洞、尝试登录等。我试图忽略它们(fail2ban 通常会处理它们),但有时它们对我们的攻击非常严重,以至于实际上变成了 DoS 攻击。当您同时有数百个连接时,这些连接来自试图将您的网络服务器用作代理、试图通过 SSH 进入您的计算机、尝试随机用户名和密码的人,这往往会对网站造成压力。我最终受够了。
我们没有从中国或韩国获得任何合法流量;我们的公司不在那里销售(我们是电子商务),所以不存在失去合法流量的风险,所以我想提前阻止他们比等到他们变成混蛋更容易。
- 已访问http://ip.ludost.net/并下载了他们的IP<->国家数据库。
- 提取所有中文和韩文的IP地址范围。
- 安装了netfilter 的 ipset 模块
- 为中国和韩国建立 ipset 转储(见下文)
- 向 iptables 中添加规则,以静默删除来自这些集合的任何流量。
就这样。我们的问题用户走了,网络和服务器的负载减少了,我们毫无困难地度过了圣诞节。
注 1:您可以使用常规 iptables(即不使用 ipset)来执行此操作,但它比使用 ipset 的计算成本更高。
笔记2:转储文件如下所示(如果您需要,ipset 将为您生成这些文件):
# Generated by ipset 2.3.3 on Sat Oct 4 18:02:57 2008
-N china nethash --hashsize 5184 --probes 4 --resize 50
-A china 203.207.128.0/17
-A china 221.176.0.0/13
-A china 58.154.0.0/15
-A china 114.54.0.0/15
...etc...
注 3:我们使用 nethash 是因为我们所有的范围都存储为 CIDR 块。如果您不想将它们转换为 CIDR,您可以改用 iptreemap,但我想如果您有大量流量,这可能会效率较低。
答案3
首先,我强烈建议不要这样做。
正如其他人更雄辩地指出的那样,屏蔽特定国家/地区并不能解决问题,它只是稍微推迟了问题。此外,当来自该国/地区的用户看到您已屏蔽时他们具体来说,这只会激励他们让你更多的问题。
话虽如此,如果你真的想要这样做,IP信息数据库提供免费的 IP 地理位置数据库,
首先,就是按国家来定位IP。
你可以这样搜索:
SELECT * FROM `ip_group_country` where `ip_start` <= INET_ATON('74.125.45.100') order by ip_start desc limit 1;
或者
SELECT * FROM `ip_group_country` where `ip_start` <= 1249717504 order by ip_start desc limit 1;
其次,您可能希望获取特定国家/地区的 IP,以便使用 iptable、htaccess 文件或您使用的任何文件生成阻止列表。可以这样做:
SELECT `ip_cidr` FROM `ip_group_country` WHERE `country_code` = 'AF' order by ip_start;
这将给你:
63.243.149.0/24 67.212.160.0/24
答案4
如何修复代码中的错误?
像这样吗?
错误:Add(2,2) 返回 0,应该返回 4。
固定代码:
int Add(int x, int y)
{
if (x == 2 && y == 2)
{ return 4; }
return 0;
}
显然不是。你不能只是创造一个摇摇欲坠的特殊情况怪物,这是极其脆弱的,是灾难的根源。你也不能只是修补潜在问题的当前症状。
相反,找出根本原因并加以解决。这比你能实施的任何黑客特例补丁都要强大得多。
为什么您的 Web 应用程序容易受到垃圾邮件的攻击?哪些特征使其容易受到攻击?哪些特征使其成为有价值的目标?是否有方法可以改变这些特征,使您的应用程序更能抵御垃圾邮件,并且不那么诱人?这些问题的答案几乎肯定是肯定的。在您的表单中添加验证链,智能地使用验证码,随机化 URL 和/或参数名称,使它们对机器人不友好。有数百万种方法可以解决这个问题,我很遗憾地说,您选择了其中一种最不值钱、最没用、最脆弱的解决方案。