首页 > 解决方案 > 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 代码。外部库使用正常。

标签: clinuxnetworkingroutesupnp

解决方案


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

您可能希望将套接字(AF_NETLINK、SOCK_RAW、NETLINK_ROUTE)与 RTM_GETROUTE 类型的请求一起使用。可以在例如:oleg 的博客中找到不错且完整的示例。使用libnl可能会以某种方式减少代码。一些细节也可以在linuxfoundation 的网站上找到。


推荐阅读