【问题标题】:Host interface or route for remote address远程地址的主机接口或路由
【发布时间】:2020-01-07 12:31:48
【问题描述】:

我如何知道哪个接口将用于特定的远程地址?

说,我有两个接口。其中一个是 192.168.0.50/24,另一个是 10.0.2.30/21,所有流量都通过它路由。因此,对于 192.168.0.100,我预计为 192.168.0.50,对于 10.0.3.40 或 8.8.8.8,我预计为 10.0.2.30。

我想询问操作系统,因为当我执行socket.connectsocket.sendto 时,它会以某种方式将地址绑定到特定接口。那么我如何找出操作系统绑定socket.connect上的套接字而不执行socket.connect的地址?

有两个目标:“测试”路由表并将套接字绑定到特定端口和对等方可访问的适配器。

Can Python select what network adapter when opening a socket? 不同,我没有地址重叠的适配器,而且我不知道套接字将绑定到的适配器的地址。我的目标是找到这个地址。

【问题讨论】:

  • 你不想socket.connect的原因是什么?您的目标实际上是找出套接字绑定到哪个接口,还是要避免打开绑定到特定接口的套接字?
  • @Pynchia 这是不相关的问题。
  • @Pynchia 谢谢你指出这个问题,我学到了一些新东西!
  • @MisterMiyagi 我在问题中回答了。

标签: python sockets


【解决方案1】:

没有开箱即用的方法来模拟这样的路由调用。如果你不想连接,你必须做一些事情来解析本地路由表信息。

如果您使用的是 Linux,您可以使用 pyroute2 (pip install...) 来执行此操作。它是一个辅助库,用于读取和修改路由表。

然后你可以做这样的事情 - 输出需要一些解析:

from pyroute2 import IPRoute

foo = IPRoute()
bar = foo.route('get', dst='192.168.42.42')
print(bar[0]['attrs'])

结果是一个元组。您将对RTA_PREFSRC 字段感兴趣,因为它将是本地接口的IP 地址,用于将要发送的数据包路由到该特定目的地。

【讨论】:

  • 绝对值得一试!我写的东西应该可以在 Linux 和 Windows 上运行,但是库中有一些适用于 Windows 的东西。但是,是的......如果它在标准库中会更好。
  • 该软件包现在可能还包含 Windows 代码 - 至少源代码树似乎有一个 windows 目录。至少值得检查。 Windows 也可能有类似的东西 - 这只是解析路由表。如果没有,您可能需要构建一个解析器来提取路由信息并将目标地址与之匹配。
猜你喜欢
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 2015-07-07
  • 2011-05-14
相关资源
最近更新 更多