在Python中检索网络命名空间的netnsid

时间:2018-05-06 06:36:45

标签: python netlink iproute

当尝试查找位于不同命名空间的link-netnsid对的正确对等网络接口时,该端不仅由​​其link-netnsid属性指示,还由{{1}指示}。此RTM_GETNSID是网络命名空间ID,仅在当前网络命名空间内有意义。

Linux内核不提供将netnsid映射到网络命名空间inode编号,这是唯一的唯一标识。但是,Linux提供NETNSA_FD请求,该请求将由fd(NETNSA_PID)或PID(RTM_GETNSID)标识的网络命名空间映射到本地netnsid。

如何在Python中创建这样的pyroute2请求,最好使用from pyroute2 import IPRoute from pyroute2.netlink import NLM_F_REQUEST import pyroute2.netlink.rtnl as rtnl import pyroute2.netlink.rtnl.nsidmsg as nsidmsg netstack = IPRoute() req = nsidmsg.nsidmsg() req['rtgen_family'] = 0 # 12345 is PID of a process inside another network namespace req['attrs'] = [('NETNSA_PID', 12345)] ret = netstack.nlm_request(req, rtnl.RTM_GETNSID, NLM_F_REQUEST) 库?到目前为止,我无法成功地为PID标识的命名空间请求netnsid,但只使用以下脚本返回无效参数错误22:

public long? PatientFileId {get; set;}

1 个答案:

答案 0 :(得分:0)

事实证明我的代码实际上是正确的,但pyroute2中存在一个错误,导致RTNETLINK消息太短几个八位字节(在strace中可见)。作为这个库错误的临时黑客,设置两个属性就足够了,这样内核就会接受RTNETLINK数据包并对其进行处理,即使它不完全正确。

from pyroute2 import IPRoute
from pyroute2.netlink import NLM_F_REQUEST
import pyroute2.netlink.rtnl as rtnl
import pyroute2.netlink.rtnl.nsidmsg as nsidmsg

netstack = IPRoute()
req = nsidmsg.nsidmsg()
req['rtgen_family'] = 0
# 12345 is PID of a process inside another network namespace
req['attrs'] = [('NETNSA_PID', 12345), ('NETNSA_PID', 0]  # hack around pyroute 0.5.0 bug
ret = netstack.nlm_request(req, rtnl.RTM_GETNSID, NLM_F_REQUEST)