在Linux上的iproute2中,gre/gretap接口是用ip link add
设置的,对于D0
,GRE需要remote
,还可以选择指定端点的local
属性。但是,我找不到任何方法来读取这些属性。ip link show
没有显示它们,而且在C函数getifaddrs
返回的数据结构中似乎没有表示它们(例如,如果我想实现自己的工具来获取它们)。我正在处理的环境中有大量这样的接口,我需要能够找到与特定远程地址相关联的接口。有没有办法不把映射存储在带外的某个地方?
发布于 2020-11-27 00:41:12
要从接口获取所有信息,可以使用ip
's -details
选项:
-d
,-details
成品率输出更详细的信息。
# ip link add name gretaptest type gretap remote 192.0.2.1 local 192.0.2.2
# ip -details link show dev gretaptest
49: gretaptest@NONE: mtu 1462 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 5e:1d:10:f9:05:f9 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 0
gretap remote 192.0.2.1 local 192.0.2.2 ttl inherit erspan_ver 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
如果您想在脚本中使用这一点,那么您确实应该在-json
工具中使用jq
。非常基本的示例(没有任何检查):
# ip -json -details link show dev gretaptest | jq '.[].linkinfo.info_data | .remote, .local'
"192.0.2.1"
"192.0.2.2"
如果您想使用可用的系统调用和函数在工具中直接实现这一点,那么首先应该查看一下:
rtnetlink (7)
- Linux IPv4路由套接字(不仅仅是IPv4),它很可能是RTM_GETLINKrtnetlink (3)
-宏来操作rtnetlink消息您可以在strace
命令上运行ip
,只需查看所使用的系统调用和结构类型。
在以下方面发现了一些文件:
在此基础上还构建了更高的库,如利卜勒。
https://serverfault.com/questions/1043957
复制相似问题