如何通过iptables阻止Facebook爬取服务器(*.fbsv.net)的请求?
如何通过iptables阻止Facebook爬取服务器(*.fbsv.net)的请求?
嘿,我来帮你搞定这个被Facebook爬取服务器骚扰的问题!首先得说清楚:iptables本身没法直接拦截域名(比如*.fbsv.net),它只能针对IP地址操作,所以我给你准备了两种方案——临时应急的快速方法,以及更持久的长效方案,你可以根据需求选。
一、临时应急方案(适合快速阻止已知IP)
这个方法能让你立刻见效,但缺点是Facebook的CDN IP会经常变动,过段时间可能需要手动更新:
- 先获取
*.fbsv.net相关的IP地址,用dig命令就行:# 获取泛域名解析的IP dig +short *.fbsv.net # 也可以单独解析你提到的那两个具体主机 dig +short fwdproxy-cco-031.fbsv.net fwdproxy-prn-050.fbsv.net - 把这些IP逐个加入iptables的拦截规则,或者用批量命令一次性添加:
这条命令会自动解析所有for ip in $(dig +short *.fbsv.net); do iptables -A INPUT -s $ip -j DROP; done*.fbsv.net的IP,然后把它们都加入INPUT链的DROP规则里,直接拒绝这些IP的请求。
二、长效持久方案(用ipset动态管理IP)
如果不想频繁手动更新IP,推荐用ipset工具来管理IP集合,还能配合定时任务自动更新,一劳永逸:
- 先安装ipset(不同系统命令略有不同):
- Debian/Ubuntu系统:
apt install ipset -y - CentOS/RHEL系统:
yum install ipset -y
- Debian/Ubuntu系统:
- 创建一个专门用来存放Facebook骚扰IP的集合:
ipset create facebook_spam hash:ip - 把
*.fbsv.net的IP添加到这个集合里:# 添加泛域名IP for ip in $(dig +short *.fbsv.net); do ipset add facebook_spam $ip; done # 再手动添加你提到的那两个具体主机IP,确保覆盖 for host in fwdproxy-cco-031.fbsv.net fwdproxy-prn-050.fbsv.net; do ip=$(dig +short $host) if [ ! -z "$ip" ]; then ipset add facebook_spam $ip fi done - 给iptables添加规则,拦截这个集合里的所有IP:
iptables -A INPUT -m set --match-set facebook_spam src -j DROP - 设置定时任务自动更新IP集合(防止Facebook换IP):
- 先创建一个更新脚本,比如
/usr/local/bin/update_facebook_ipset.sh,内容如下:#!/bin/bash # 清空旧的IP集合 ipset flush facebook_spam # 添加新的泛域名IP for ip in $(dig +short *.fbsv.net); do ipset add facebook_spam $ip done # 再次添加指定主机的IP for host in fwdproxy-cco-031.fbsv.net fwdproxy-prn-050.fbsv.net; do ip=$(dig +short $host) if [ ! -z "$ip" ]; then ipset add facebook_spam $ip fi done - 给脚本添加执行权限:
chmod +x /usr/local/bin/update_facebook_ipset.sh - 编辑crontab定时任务,让它每天凌晨自动更新:
在打开的文件里添加一行:crontab -e
保存退出后,每天凌晨0点就会自动刷新IP集合啦。0 0 * * * /usr/local/bin/update_facebook_ipset.sh
- 先创建一个更新脚本,比如
- (可选)保存ipset规则,防止重启服务器后丢失:
- Debian/Ubuntu:
ipset save > /etc/ipset.conf,然后在/etc/rc.local里添加ipset restore < /etc/ipset.conf(记得给rc.local加执行权限) - CentOS/RHEL:直接启用ipset服务
systemctl enable ipset,系统会自动保存和恢复规则。
- Debian/Ubuntu:
取消阻止的方法
如果你之后想取消拦截,也很简单:
- 临时方案:用
iptables -D INPUT -s [具体IP] -j DROP逐个删除规则,或者用iptables -F INPUT清空所有INPUT链规则(谨慎操作,会清空所有INPUT规则) - 长效方案:先删除iptables规则
iptables -D INPUT -m set --match-set facebook_spam src -j DROP,然后销毁ipset集合ipset destroy facebook_spam
备注:内容来源于stack exchange,提问作者kungfooman
相关产品推荐
相关产品推荐

