Linux: 从C代码如何检测哪个eth接口访问WAN?

Linux: from C code how to detect which eth interface accesses WAN?

环境: C代码,Linux

内容: 我想在使用 UPNP 的 SSH 协议的路由器上打开一个端口。 我知道如何使用 miniupnpc 库来做到这一点。 我可以发送 UPNP 请求,这个请求包括: 重定向的外部端口 要重定向到的内部端口 接受 SSH 流量的内部机器地址。

问题: 如果内部机器有多个 eth 接口,我如何找到合适的接口?

例如: 假设我有:

eth0, address 10.10.10.1 [WAN connection]
eth1, address 20.20.20.1 [No WAN connection]

eth0是连接路由器的接口,可以访问WAN。 eth1是连接内网的接口,不能上WAN。

发送 UPNP 请求时应包含:

External port: 2222
Internal port: 22
Local machine address: 10.10.10.1 [eth0]

问题:

如何从 C 代码中检测到哪个接口访问 WAN? 我不应该 运行 一个外部脚本,只有 C 代码。 外部库使用正常。

我想您必须通过读取 /proc/net/route 的内容来检测哪个接口分配了默认网关(仅零),或者可以使用 netlink 接口来完成。

您可能希望将 socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) 与 RTM_GETROUTE 类型的请求一起使用。可以在例如 oleg's blog. Code may be somehow reduced using libnl. Some details may also be found on linuxfoundation's web.

处找到不错且完整的示例