使用 Linux 上的 iproute2,gre/gretap 接口使用 进行设置ip link add
,对于 GRE 需要remote
和可选local
属性指定端点。但是,我找不到任何方法来回过头再读这些属性。ip link show
没有显示它们,而且它们似乎没有在 C 函数返回的数据结构中的任何地方表示getifaddrs
(例如,如果我想实现自己的工具来获取它们)。我正在使用一个有大量此类接口的环境,我需要能够找到与特定远程地址关联的接口。有没有办法做到这一点,而无需将映射存储在带外的某个地方?
答案1
要从接口获取所有信息,您可以使用ip
的-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: <BROADCAST,MULTICAST> 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_GETLINK
rtnetlink (3)
- 用于操作 rtnetlink 消息的宏
您可以运行strace
该ip
命令来查看正在使用的系统调用和结构的类型。
找到一些文档:
在此基础上构建了更高级的库,例如库也。