读回 Linux gre[tap] 本地/远程地址

读回 Linux gre[tap] 本地/远程地址

使用 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 消息的宏

您可以运行straceip命令来查看正在使用的系统调用和结构的类型。

找到一些文档:

网络:generic_netlink_howto

在此基础上构建了更高级的库,例如也。

相关内容