ASN(自治系统编号)黑名单是一种基于自治系统(AS)级别的网络封锁机制。在网络安全和反垃圾邮件领域,某些组织会将特定的ASN列入黑名单,以阻止来自这些自治系统的所有IP地址的访问。

ASN黑名单的应用场景:

  1. 垃圾邮件防护: 一些反垃圾邮件组织会将发送大量垃圾邮件的ASN列入黑名单,从而阻止这些网络的邮件进入目标系统。  UCEPROTECT
  2. 网络安全: 在防御DDoS攻击时,管理员可能会封锁特定ASN,以阻止来自这些网络的恶意流量。  Limbo Pro
  3. 内容过滤: 某些服务提供商可能会根据地理位置或法律要求,封锁特定国家或地区的ASN,以限制内容访问。

注意事项:

  • 误封风险: 由于一个ASN可能包含大量IP地址,封锁整个ASN可能会导致误封,影响正常用户的访问。
  • 动态调整: 网络环境不断变化,管理员应定期更新和审查ASN黑名单,以确保其有效性和准确性。

在实施ASN黑名单时,建议结合其他安全措施,如IP地址黑名单、端口封禁等,以构建多层次的安全防护体系。


ASN黑名单的具体规则(RULE)主要是通过防火墙、入侵检测系统(IDS)、或者内容过滤设备来实现的。以下是一些常用的规则示例:


1. 使用 iptables 封锁特定 ASN 的流量

先通过工具(例如 whois 或在线工具)查询特定 ASN 的 IP 范围,然后在 iptables 中添加规则:

iptables -A INPUT -s [IP_RANGE] -j DROP
  • 1.

示例:封锁 ASN 12345 的 IP 范围:

iptables -A INPUT -s 203.0.113.0/24 -j DROP
iptables -A INPUT -s 192.0.2.0/24 -j DROP
  • 1.
  • 2.

说明:

  • [IP_RANGE] 替换为该 ASN 的具体 IP 段。
  • ASN 的具体 IP 范围可以通过 RIPEstat 或  IPinfo 查询。

2. Nginx 配置基于 ASN 的黑名单

结合 geoipmaxmind 数据库进行 IP 到 ASN 的映射。

  • 安装 GeoIP 模块:
sudo apt-get install libmaxminddb-dev
  • 1.
  • 配置 nginx.conf
geoip2 /etc/nginx/GeoLite2-ASN.mmdb {
    $geoip2_data_as_num;
}

map $geoip2_data_as_num $block_asn {
    default 0;
    12345 1; # 封锁 ASN 12345
    67890 1; # 封锁 ASN 67890
}

server {
    listen 80;
    if ($block_asn) {
        return 403; # 禁止访问
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

3. Cloudflare 的 ASN 封锁规则

如果使用 Cloudflare,可以直接在防火墙规则中添加 ASN 黑名单:

  1. 登录 Cloudflare 仪表盘。
  2. 转到 Security -> WAF -> Firewall Rules
  3. 创建新的规则:
  • Field: ASN
  • Operator: is in
  • Value: 列出需要封锁的 ASN,例如 12345, 67890
  1. 动作:选择 BlockChallenge

4. 使用 BGP 实现 ASN 封锁

在网络层级,网络管理员可以直接通过边界网关协议(BGP)封锁 ASN。 配置思路:

  • 向路由器注入规则,拒绝特定 ASN 的路由。
router bgp [YOUR_ASN]
 neighbor [PEER_IP] route-map BLOCK-ASN out
route-map BLOCK-ASN deny 10
 match as-path 12345
  • 1.
  • 2.
  • 3.
  • 4.

注意: 需要网络管理员权限以及支持 BGP 的设备。


5. 使用 Fail2ban 配置动态 ASN 黑名单

借助 Fail2ban 和 IP 数据库,可以动态封锁特定 ASN 的流量。

  • 安装 whois 和相关工具:
sudo apt-get install whois
  • 1.
  • 配置 Fail2ban 规则: 在 /etc/fail2ban/jail.local 中添加:
[asn-blocker]
enabled = true
filter = asn-blocker
action = iptables[name=ASN-BLOCK, port=all, protocol=all]
logpath = /var/log/nginx/access.log
maxretry = 1
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

然后通过 filter 文件解析日志,判断 ASN。


6. 自定义脚本实现自动封锁

利用 Python 或 Shell 脚本动态下载 ASN 数据库并封锁 ASN。

示例:Python 脚本自动封锁 ASN 流量

import os
import requests

asn_list = ["12345", "67890"]  # 要封锁的 ASN
api_url = "https://api.iptoasn.com/v1/as/ip/"

for asn in asn_list:
    response = requests.get(api_url + asn)
    if response.status_code == 200:
        ip_ranges = response.json()["prefixes"]
        for ip_range in ip_ranges:
            os.system(f"iptables -A INPUT -s {ip_range} -j DROP")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

注意事项

  1. ASN 数据更新: 确保定期更新 ASN 和 IP 数据库,避免误封。
  2. 误封排查: 定义白名单机制,排除误封的合法 IP 或 ASN。
  3. 测试影响: 在生产环境使用前,先测试封锁规则的影响范围。

ASN(自治系统编号)与IP地址的映射关系表示一个自治系统(AS)所控制的IP地址范围。每个ASN通常对应一个或多个IP地址段,这些信息由互联网注册机构(如ARIN、RIPE、APNIC、LACNIC、AFRINIC)分配并维护。


ASN与IP地址的映射来源

  1. 互联网注册机构数据库: 各大区域互联网注册机构提供ASN与IP地址段的映射数据,例如:
  1. 开源数据集:
  • MaxMind ASN数据库(付费/免费版本)。
  • IPtoASN.com 提供ASN到IP的在线查询服务。
  1. BGP公告: 通过BGP(边界网关协议)路由信息,可解析各ASN宣布的IP地址段。

查询ASN与IP地址映射的工具

以下工具可用于查询ASN与IP地址的关系:

1. WHOIS 查询

使用 whois 查询某个IP地址所属的ASN及其范围:

whois 8.8.8.8
  • 1.

输出示例:

NetRange:       8.8.8.0 - 8.8.8.255
CIDR:           8.8.8.0/24
OriginAS:       AS15169
Organization:   Google LLC
  • 1.
  • 2.
  • 3.
  • 4.
  • NetRange: 对应的IP范围。
  • OriginAS: 对应的ASN编号。
2. IPinfo 查询

使用 IPinfo 的API获取IP到ASN的详细信息:

curl "https://ipinfo.io/8.8.8.8/json"
  • 1.

输出示例:

{
  "ip": "8.8.8.8",
  "hostname": "dns.google",
  "org": "AS15169 Google LLC",
  "city": "Mountain View",
  "region": "California",
  "country": "US"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
3. BGPView

在线工具查询ASN和IP范围:  https://bgpview.io/


映射示例:ASN到IP地址段

以下为常见ASN和对应IP段的映射示例:

ASN

IP段

组织

AS15169

8.8.8.0/24

Google LLC

AS32934

31.13.64.0/18

Facebook, Inc.

AS13335

104.16.0.0/12

Cloudflare, Inc.

AS16509

3.0.0.0/8

Amazon AWS


如何获取完整的ASN-IP映射数据

  1. 下载公共ASN数据库:
  • MaxMind 提供的 GeoLite2-ASN
  • IPtoASN 提供的 ASN 数据集:https://iptoasn.com/
  1. 通过BGP路由数据提取: 使用 RouteViews 或 RIPE NCC 提供的 BGP 数据。
  • 下载最新 BGP 数据:http://archive.routeviews.org/
  • 解析 ASN 与 IP 的关系:
    示例 Python 脚本:
from pybgpstream import BGPStream

stream = BGPStream()
stream.add_filter('project', 'ris')
stream.add_interval_filter(1633046400, 1633132800)  # 时间范围

for elem in stream:
    if elem.type == 'RIB':
        print(f"ASN: {elem.fields['as-path']}, Prefix: {elem.fields['prefix']}")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  1. 使用 RIPEstat API 获取指定ASN的IP段:
curl "https://stat.ripe.net/data/announced-prefixes/data.json?resource=AS15169"
  • 1.

返回示例:

{
    "data": {
        "prefixes": [
            {"prefix": "8.8.8.0/24"},
            {"prefix": "8.34.208.0/20"},
            {"prefix": "172.217.0.0/19"}
        ]
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

实时动态映射

为了动态管理ASN与IP的关系,可通过定期更新数据库或实时查询API来获取最新的映射数据。