#bgp #ip #routes #networking #source #ip-address

app ban2bgp

作为BGP黑洞临时注入被禁用的IP地址作为黑洞路由到您的网络,以防止黑帽子破坏您的服务。

4个版本

0.1.3 2023年10月26日
0.1.2 2023年10月26日
0.1.1 2021年7月25日
0.1.0 2021年5月23日

#1498网络编程

MIT/Apache

79KB
2K SLoC

ban2bgp

描述

这是一个通过HTTP API控制的网络分布式入侵防御系统。当坏人试图攻击您的服务器或路由器时,他们的IP可以立即被封锁,阻止所有网络中的访问,有两种方式:

  1. 将坏IP宣布为到您的RR的hotroutes到null,这样坏人就不会收到响应。
  2. 将坏IP宣布为flowspec规则,阻止来自这些地址的任何流量。请小心处理攻击源,因为一些无会话协议(如DNS)不建议作为攻击源,因为源IP很容易被伪造。

快速开始

首先,您至少需要一个BGP RR来连接ban2bgp(:-)。另外,您还需要一些运行ban2bgp的Linux/FreeBSD(尽管Windows或Mac也可以工作,我希望)的PC。

其次,您应该配置您的路由器以接受来自PC的BGP连接。例如,您有的路由器IP为10.0.0.1,AS为65535。运行ban2bgp的PC的IP为10.1.1.1。在Cisco方言中,它可能看起来像这样:

! Set nexthop for denied routes to null
ip route 198.18.0.1 255.255.255.255 Null0
! Set up the BGP
router bgp 65535
 ! create a neighbor with your own AS, so it will be IBGP
 neighbor 10.1.1.1 remote-as 65535
 ! specify source IP
 neighbor 10.1.1.1 update-source Loopback0
 ! do not attempt to connect from router to PC, only from PC to router
 neighbor 10.1.1.1 transport connection-mode passive
 address-family ipv4
 ! it has ipv4 unicast address family
  neighbor 10.1.1.1 activate
 ! send all routing information to PC
  neighbor 10.1.1.1 route-reflector-client

现在在Linux或FreeBSD的PC上

$ git clone https://github.com/wladwm/ban2bgp
... git messages
$ cd ban2bgp
$ cargo build
... cargo messages
$ cat > ban2bgp.ini <<EOF
[main]
httplisten=0.0.0.0:8080
listen=0.0.0.0:1179
nexthop=198.18.0.1
communities=666:666
peers=r1
duration=3600
skiplist=10.0.0.0/24

[peer_r1]
peer=10.0.0.1
as=65535
mode=blackhole
EOF

$ RUST_LOG=info cargo run
Listening on http://0.0.0.0:8080
Connecting to 10.0.0.1:179
Connected to 10.0.0.1:179

在此之后,您可以在路由器上检查与10.1.1.1的BGP会话是否已建立。通过HTTP请求添加对主机10.2.2.2的一个小时的拒绝路由:/usr/bin/curl http://127.0.0.1:8080/api/add?net=10.2.2.2&dur=3600

或者,您可以使用捆绑的最小SPA,将浏览器指向http://127.0.0.1:8080/

在contrib文件夹中,您可以找到fail2ban的示例配置。当您在jain配置中指定banaction=ban2bgp而不是banaction=iptables...时

不良主机将被封锁,不仅限于单个服务器,还可以轻松集成到您的syslog服务器上,以便所有路由器。

配置

ban2bgp在当前目录中的ban2bgp.ini文件中查找配置。此文件有一个[main]部分,主要部分参数

  • httplisten - 内部http服务器绑定的地址和端口,默认0.0.0.0:8080。
  • http_files_root - http服务器从该位置提供文件,默认./contrib/。
  • listen - 不必要的BGP监听点,默认0.0.0.0:179,因为179<1024需要root权限。
  • nexthop - 拒绝路由的ipv4 nexthop。您所有的路由器都应该将此路由到Null。
  • nexthop6 - 拒绝路由的ipv6 nexthop。
  • communities - 拒绝路由的空格分隔的communities列表。
  • 对等节点 - 以逗号(或空格或制表符)分隔的对等节点列表。每个对等节点应在ini文件中有一个独立的节。
  • 持续时间 - 默认拒绝路由的存活时间(秒)。
  • 跳过列表 - 在添加请求中跳过的网络列表,以逗号分隔。
  • 对等节点 - 对等节点IP地址
  • AS - 对等节点AS
  • 模式 - 对等节点模式 - 黑洞或flowspec

API端点

  • /api/add 参数

    • net - 要宣布的ipv4/ipv6路由
    • dur - 秒数中的TTL
  • /api/remove 参数

    • net - 要从宣布中删除的ipv4/ipv6路由
  • /api/json 块操作。需要POST体中包含有效JSON对象,可选键“add”和“remove”。remove - 要删除的字符串路由数组,add - 包含“duration”和“nets”的对象。“nets” - 要添加的字符串路由数组,用于“duration”秒。例如:{"add":{"duration":86400,"nets":["33.3.3.3"]},"remove":["11.1.1.1","22.2.2.2"]}

  • /api/ping 检查服务存活性。返回“pong”

  • /api/status 返回包含每个对等节点状态和ipv4和ipv6路由数量的JSON对象 {'peers':{'10.0.0.1':'InSync'},'routes':{'ipv4':0,'ipv6':0}}

  • /api/dumprib 返回包含活动路由和时间的文本表

  • /api/dumpribjson 返回包含活动路由和时间的JSON对象

Crates.io

https://crates.io/crates/ban2bgp

文档

https://docs.rs/ban2bgp

许可证

MIT OR Apache-2.0

依赖关系

~11–20MB
~288K SLoC