【问题标题】:Linux: from C code how to detect which eth interface accesses WAN?Linux:从C代码如何检测哪个eth接口访问WAN?
【发布时间】:2020-04-26 12:38:12
【问题描述】:

环境: 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 是连接路由器的接口,可以访问广域网。 eth1是连接内网的接口,无法接入广域网。

发送的 UPNP 请求应包含:

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

问题:

如何从 C 代码中检测访问 WAN 的接口? 我不应该运行外部脚本,只运行 C 代码。 外部库使用没问题。

【问题讨论】:

    标签: c linux networking routes upnp


    【解决方案1】:

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

    您可能希望将 socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) 与 RTM_GETROUTE 类型的请求一起使用。可以在例如:oleg's blog 找到不错且完整的示例。使用libnl 可能会以某种方式减少代码。一些细节也可以在linuxfoundation's web上找到。

    【讨论】:

    • 谢谢。这正是我所需要的。
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多