BGP协议的Python实现:yabgp
jopen
9年前
YABGP是BGP协议的另一个Python实现。它可以被用于建立与各种路由器的BGP连接(包括实思科/华为/ Juniper路由器和一些路由器模拟器像GNS3)和接收/解析BGP消息以供将来分析。
We write it in strict accordance with the specifications of RFCs.
This software can be used on Linux/Unix, Mac OS and Windows systems.
Features
- It can establish BGP session based on IPv4 address (TCP Layer) in active mode(as TCP client);
- Support TCP MD5 authentication(IPv4 and does not support Windows now);
- BGP capabilities support: 4 Bytes ASN, IPv4 address family, Route Refresh(Cisco Route Refresh);
- Decode all BGP messages to human readable strings and write files to disk(configurable);
Quick Start
We recommend runyabgpthrough python virtual-env from source code or pip install
Use yabgp from source code:
$ virtualenv yabgp-virl $ source yabgp-virl/bin/activate $ git clone https://github.com/smartbgp/yabgp $ cd yabgp $ pip install -r requirements.txt $ cd bin $ python yabgpd -h
Use pip install
$ virtualenv yabgp-virl $ source yabgp-virl/bin/activate $ pip install yabgp $ which yabgpd /home/bgpmon/yabgp-virl/bin/yabgpd $ yabgpd -h
For example:
$ yabgpd --bgp-local_addr=1.1.1.1 --bgp-local_as=65001 --bgp-remote_addr=1.1.1.2 --bgp-remote_as=65001 --bgp-md5=test --config-file=../etc/yabgp/yabgp.ini
BGP message example:
inyabgp.ini, you can point out if you want to store the parsing BGP message to local disk and where you want to put them in.
[message] # how to process parsed BGP message? # Whether the BGP message is written to disk # write_disk = True # the BGP messages storage path # write_dir = /home/bgpmon/data/bgp/ write_dir = ./ # The Max size of one BGP message file, the unit is MB # write_msg_max_size = 500
$ more 1429257741.41.msg [1429258235.343657, 1, 1, {'bgpID': '192.168.45.1', 'Version': 4, 'holdTime': 180, 'ASN': 23650, 'Capabilities': {'GracefulRestart': False, 'ciscoMultiSession': False, 'ciscoRouteRefresh': True, '4byteAS': True, 'AFI_SAFI': [(1, 1)], '7 0': '', 'routeRefresh': True}}, (0, 0)] [1429258235.346803, 2, 4, None, (0, 0)] [1429258235.349598, 3, 4, None, (0, 0)] [1429258235.349837, 4, 2, {'ATTR': {1: 0, 2: [(2, [64639, 64660])], 3: '192.168.24.1', 4: 0, 5: 100}, 'WITHDRAW': [], 'NLRI': ['192.168.1.0/24']}, (1, 1)]
The structure of each line is:
[timestamp, sequence number, message type, message content, address family]
For message type:
MSG_OPEN = 1 MSG_UPDATE = 2 MSG_NOTIFICATION = 3 MSG_KEEPALIVE = 4 MSG_ROUTEREFRESH = 5 MSG_CISCOROUTEREFRESH = 128