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.
处找到不错且完整的示例
环境: 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.
处找到不错且完整的示例