python网络链接库
pyroute2的Python项目详细描述
Pyroute2是一个纯Pythonnetlink库它只需要Python stdlib, 没有第三方库。库作为rtnl协议启动 实现,因此名称是pyroute2,但现在它支持许多netlink 协议一些支持的netlink系列和协议:
- rtnl,网络设置-地址、路由、流量控制
- nfnetlink-netfilter API:ipset,nftables
- ipq-最简单的用户空间数据包过滤,iptables队列目标
- devlink-管理和监视启用devlink的硬件
- generic-generic netlink系列
- nl80211-无线功能API(基本支持)
- taskstats-扩展进程统计信息
- acpi_事件-acpi事件监视
- 热事件-热事件监视
- vfs_dquot-磁盘配额事件监视
从0.5.2开始,库还支持BSD系统上的pf_route套接字。
支持的系统
pyroute2在linux上本机运行,并模拟一些有限的子集 基于pf_路由通知的bsd系统上的rtnl netlink api 以及标准系统工具。
不支持其他平台。
最简单的用例
库提供的对象是具有 扩展API附加功能旨在:
- 帮助打开/绑定NetLink套接字
- 发现通用NetLink协议和多播组
- 构造、编码和解码netlink和PF_路由消息
也许最简单的用例是监视事件。磁盘配额事件:
from pyroute2 import DQuotSocket # DQuotSocket automatically performs discovery and binding, # since it has no other functionality beside of the monitoring with DQuotSocket() as ds: for message in ds.get(): print(message)
使用IPRoute获取有关网络设置更改的通知:
from pyroute2 import IPRoute with IPRoute() as ipr: # With IPRoute objects you have to call bind() manually ipr.bind() for message in ipr.get(): print(message)
rtnetlink示例
您可以在项目文档中阅读更多示例
低级iproute实用程序-Linux网络配置。 iproute类是一个1到1的rtnl映射。没有隐含的 接口查找等。
一些示例:
from socket import AF_INET from pyroute2 import IPRoute # get access to the netlink socket ip = IPRoute() # no monitoring here -- thus no bind() # print interfaces print(ip.get_links()) # create VETH pair and move v0p1 to netns 'test' ip.link('add', ifname='v0p0', peer='v0p1', kind='veth') idx = ip.link_lookup(ifname='v0p1')[0] ip.link('set', index=idx, net_ns_fd='test') # bring v0p0 up and add an address idx = ip.link_lookup(ifname='v0p0')[0] ip.link('set', index=idx, state='up') ip.addr('add', index=idx, address='10.0.0.1', broadcast='10.0.0.255', prefixlen=24) # create a route with metrics ip.route('add', dst='172.16.0.0/24', gateway='10.0.0.10', metrics={'mtu': 1400, 'hoplimit': 16}) # create MPLS lwtunnel # $ sudo modprobe mpls_iptunnel ip.route('add', dst='172.16.0.0/24', oif=idx, encap={'type': 'mpls', 'labels': '200/300'}) # create MPLS route: push label # $ sudo modprobe mpls_router # $ sudo sysctl net.mpls.platform_labels=1024 ip.route('add', family=AF_MPLS, oif=idx, dst=0x200, newdst=[0x200, 0x300]) # create SEG6 tunnel encap mode # Kernel >= 4.10 ip.route('add', dst='2001:0:0:10::2/128', oif=idx, encap={'type': 'seg6', 'mode': 'encap', 'segs': '2000::5,2000::6'}) # create SEG6 tunnel inline mode # Kernel >= 4.10 ip.route('add', dst='2001:0:0:10::2/128', oif=idx, encap={'type': 'seg6', 'mode': 'inline', 'segs': ['2000::5', '2000::6']}) # create SEG6 tunnel with ip4ip6 encapsulation # Kernel >= 4.14 ip.route('add', dst='172.16.0.0/24', oif=idx, encap={'type': 'seg6', 'mode': 'encap', 'segs': '2000::5,2000::6'}) # release Netlink socket ip.close()
该项目包含多个模块,用于不同类型的 netlink消息,不仅仅是RTNL
网络命名空间示例
网络命名空间操作:
from pyroute2 import netns # create netns netns.create('test') # list print(netns.listnetns()) # remove netns netns.remove('test')
创建veth接口对并移动到netns:
from pyroute2 import IPRoute with IPRoute() as ipr: # create interface pair ipr.link('add', ifname='v0p0', kind='veth', peer='v0p1') # lookup the peer index idx = ipr.link_lookup(ifname='v0p1')[0] # move the peer to the 'test' netns: ipr.link('set', index='v0p1', net_ns_fd='test')
列出某些netns中的接口:
from pyroute2 import NetNS from pprint import pprint ns = NetNS('test') pprint(ns.get_links()) ns.close()
有关更多详细信息和示例,请参见文档中的。
安装
进行安装或pip install pyroute2
要求
Python>;=2.7
Pyrout2测试框架要求: *薄片8 *覆盖范围 *鼻测试 *狮身人面像 *netaddr公司
测试的可选依赖项: *事件 *丝裂原 *瓶子 *团队(http://libteam.org/)