c - Linux:从C代码如何检测哪个eth接口访问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 接口完成相同的操作。
您可能希望将套接字(AF_NETLINK、SOCK_RAW、NETLINK_ROUTE)与 RTM_GETROUTE 类型的请求一起使用。可以在例如:oleg 的博客中找到不错且完整的示例。使用libnl可能会以某种方式减少代码。一些细节也可以在linuxfoundation 的网站上找到。