Simulates BGP prefix hijacking and route leak attacks in isolated Containerlab labs with FRRouting to evaluate RPKI, route origin validation, and BGP monitoring defenses.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 评估组织对 BGP 前缀劫持(BGP prefix hijacking)和路由泄漏攻击(route leak attack)的暴露程度
Simulates BGP hijacking scenarios in authorized lab environments to assess RPKI deployment, route origin validation, and BGP monitoring defenses against prefix hijacking and route leaks.
Simulates BGP hijacking in isolated labs using Containerlab/FRR to test RPKI, ROA, prefix filtering, and monitoring against prefix hijacks and route leaks.
Implements BGP route origin validation (RPKI/ROV) using ROAs via RIRs, RPKI-to-Router protocol, Routinator validator, and policies on Cisco IOS-XE/Juniper Junos routers to prevent route hijacking.
Share bugs, ideas, or general feedback.
不适用场景:对实际互联网执行 BGP 路由劫持;在未经授权的情况下针对 BGP 对等体;破坏真实互联网路由基础设施。对生产系统的 BGP 攻击是违法的,可能导致大规模互联网中断。
# 安装 Containerlab 用于 BGP 仿真
sudo bash -c "$(curl -sL https://get.containerlab.dev)"
# 创建 BGP 实验室拓扑文件
cat > bgp-lab.clab.yml << 'EOF'
name: bgp-hijack-lab
topology:
nodes:
# 合法 AS(AS65001)通告 10.0.0.0/24
legitimate-router:
kind: linux
image: frrouting/frr:v8.5.0
binds:
- legitimate-frr.conf:/etc/frr/frr.conf
# 攻击者 AS(AS65002),将劫持该前缀
attacker-router:
kind: linux
image: frrouting/frr:v8.5.0
binds:
- attacker-frr.conf:/etc/frr/frr.conf
# 转接提供商(AS65000),连接双方
transit-router:
kind: linux
image: frrouting/frr:v8.5.0
binds:
- transit-frr.conf:/etc/frr/frr.conf
# 接收路由的受害者网络
victim-router:
kind: linux
image: frrouting/frr:v8.5.0
binds:
- victim-frr.conf:/etc/frr/frr.conf
links:
- endpoints: ["legitimate-router:eth1", "transit-router:eth1"]
- endpoints: ["attacker-router:eth1", "transit-router:eth2"]
- endpoints: ["transit-router:eth3", "victim-router:eth1"]
EOF
# 配置合法路由器(AS65001)
cat > legitimate-frr.conf << 'EOF'
frr defaults traditional
hostname legitimate-router
router bgp 65001
bgp router-id 1.1.1.1
neighbor 10.0.1.2 remote-as 65000
address-family ipv4 unicast
network 10.0.0.0/24
neighbor 10.0.1.2 activate
exit-address-family
!
interface eth1
ip address 10.0.1.1/30
!
interface lo
ip address 10.0.0.1/24
EOF
# 配置攻击者路由器(AS65002)——初始不通告该前缀
cat > attacker-frr.conf << 'EOF'
frr defaults traditional
hostname attacker-router
router bgp 65002
bgp router-id 2.2.2.2
neighbor 10.0.2.2 remote-as 65000
address-family ipv4 unicast
neighbor 10.0.2.2 activate
exit-address-family
!
interface eth1
ip address 10.0.2.1/30
EOF
# 部署实验室
sudo containerlab deploy -t bgp-lab.clab.yml
# 连接受害者路由器,验证到 10.0.0.0/24 的路由
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip bgp"
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip route 10.0.0.0/24"
# 预期:路由经过 AS65000 AS65001(合法路径)
# 验证 traceroute 沿合法路径转发
docker exec -it clab-bgp-hijack-lab-victim-router traceroute 10.0.0.1
# 检查转接路由器上的 BGP 表
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show ip bgp 10.0.0.0/24"
# 在攻击者路由器上通告更精确的前缀
docker exec -it clab-bgp-hijack-lab-attacker-router vtysh << 'VTYSH'
configure terminal
router bgp 65002
address-family ipv4 unicast
network 10.0.0.0/25
network 10.0.0.128/25
exit-address-family
!
interface lo
ip address 10.0.0.1/25
ip address 10.0.0.129/25
exit
end
write memory
VTYSH
# 在受害者路由器上验证劫持
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip bgp 10.0.0.0/24 longer-prefixes"
# 受害者现在应优先选择经过攻击者的 /25 路由
# 因为更精确路由在 IP 路由中始终优先
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip route 10.0.0.1"
# 预期:路由现在经过 AS65000 AS65002(攻击者)
# 来源劫持:攻击者通告完全相同的 /24 前缀
docker exec -it clab-bgp-hijack-lab-attacker-router vtysh << 'VTYSH'
configure terminal
router bgp 65002
address-family ipv4 unicast
network 10.0.0.0/24
no network 10.0.0.0/25
no network 10.0.0.128/25
exit-address-family
end
write memory
VTYSH
# 检查受害者更偏好哪条路由
# 前缀长度相同时,AS 路径最短者优先
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip bgp 10.0.0.0/24"
# 两条路由均可见,攻击者可能基于 AS 路径长度获胜
# 分析 BGP 路径选择如何决定胜者
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show ip bgp 10.0.0.0/24 bestpath-compare"
# 设置 RPKI 验证器(Routinator)
docker run -d --name routinator \
-p 3323:3323 -p 8323:8323 \
nlnetlabs/routinator:latest
# 配置转接路由器使用 RPKI 验证
docker exec -it clab-bgp-hijack-lab-transit-router vtysh << 'VTYSH'
configure terminal
rpki
rpki cache 172.17.0.1 3323 preference 1
exit
!
route-map RPKI-FILTER permit 10
match rpki valid
!
route-map RPKI-FILTER deny 20
match rpki invalid
!
route-map RPKI-FILTER permit 30
match rpki notfound
!
router bgp 65000
address-family ipv4 unicast
neighbor 10.0.2.1 route-map RPKI-FILTER in
exit-address-family
end
write memory
VTYSH
# 验证 RPKI 状态
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show rpki prefix-table"
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show ip bgp 10.0.0.0/24"
# 如果存在 ROA,攻击者的通告应被标记为 RPKI Invalid
# 安装 BGPalerter 用于实时监控
npm install -g bgpalerter
bgpalerter generate -o /etc/bgpalerter
# 配置 BGPalerter 监控你的前缀
cat > /etc/bgpalerter/prefixes.yml << 'EOF'
10.0.0.0/24:
description: 生产网络
asn: 65001
ignoreMorespecifics: false
group: production
EOF
# 开始监控
bgpalerter
# 使用 bgpstream 查询历史路由数据
pip3 install pybgpstream
python3 << 'PYEOF'
import pybgpstream
# 查询历史前缀通告
stream = pybgpstream.BGPStream(
from_time="2024-03-14 00:00:00",
until_time="2024-03-15 00:00:00",
collectors=["route-views2", "rrc00"],
record_type="updates",
filter="prefix more 10.0.0.0/24"
)
for rec in stream.records():
for elem in rec:
if elem.type == "A": # 通告
print(f"时间:{elem.time}")
print(f"前缀:{elem.fields['prefix']}")
print(f"AS 路径:{elem.fields['as-path']}")
print(f"对等体:{elem.peer_asn}")
print("---")
PYEOF
# 通过 RIPEstat 检查 RPKI 状态
curl -s "https://stat.ripe.net/data/rpki-validation/data.json?resource=AS65001&prefix=10.0.0.0/24" | python3 -m json.tool
| 术语 | 定义 |
|---|---|
| BGP 路由劫持(BGP Hijacking) | 不拥有 IP 前缀的 AS 对其进行未授权通告,将流量转向攻击者网络 |
| 更精确路由劫持(More-Specific Hijack) | 通告比受害者更精确的前缀(更长的掩码),由于最长前缀匹配规则,这类前缀在 IP 路由中始终优先 |
| RPKI(资源 PKI) | 允许 IP 前缀持有者通过路由来源授权(ROA)授权特定 ASN 通告其路由的密码学框架 |
| 路由来源授权(ROA,Route Origin Authorization) | 授权 AS 通告特定 IP 前缀的数字签名对象,支持基于 RPKI 的路由验证 |
| AS 路径前置(AS Path Prepending) | 在 AS 路径中添加重复 AS 号以降低路由优先级的 BGP 技术,也可防御性地用于对抗路由劫持 |
| 路由泄漏(Route Leak) | BGP 路由通告超出其预期范围的传播,例如客户将转接提供商的路由重新通告给其他提供商 |
背景:某云托管公司(AS12345)为其面向客户的服务通告 203.0.113.0/24。他们需要评估自身对 BGP 路由劫持攻击的韧性,并验证 RPKI 部署的有效性。评估包括实验室仿真和真实世界监控验证。
方法:
常见陷阱:
## BGP 安全评估报告
**组织**:Cloud Hosting Co.(AS12345)
**评估前缀**:203.0.113.0/24,198.51.100.0/24
**评估日期**:2024-03-15
### RPKI 状态
| 前缀 | ROA 存在 | 最大长度 | 来源 AS | 状态 |
|--------|-----------|------------|-----------|--------|
| 203.0.113.0/24 | 是 | /24 | AS12345 | 有效 |
| 198.51.100.0/24 | 否 | N/A | AS12345 | 未找到 |
### 实验室仿真结果
| 攻击类型 | RPKI 验证 | 结果 |
|-------------|-----------------|--------|
| 更精确 /25 劫持 | 已启用 | 被拦截(来源无效) |
| 更精确 /25 劫持 | 已禁用 | 成功(流量被转向) |
| 完全匹配来源劫持 | 已启用 | 被拦截(来源无效) |
| 客户路由泄漏 | 已启用 | 未拦截(来源有效,路径错误) |
### 建议
1. 为 198.51.100.0/24 创建 ROA(当前未受保护)
2. 在 ROA 中将最大长度设为 /24 以防止更精确前缀劫持
3. 请求上游 ISP 启用 RPKI 路由来源验证
4. 部署 BGPalerter 进行持续前缀监控
5. 向 IRR 数据库注册并向对等体申请前缀过滤