【问题标题】:Python - Twisted - Simple UDP forwarder. Preserve source IP?Python - Twisted - 简单的 UDP 转发器。保留源 IP?
【发布时间】:2014-11-15 01:04:52
【问题描述】:

我在 Python 3 中有这个基本的 UDP 转发脚本。

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor

class Forward(DatagramProtocol):
  def __init__(self, targetTuples):
    print ('in init, targetTuples are ', targetTuples)
    self._targetTuples = targetTuples

  def datagramReceived(self, data, hostAndPort):
    print ('self._targetTuples is ', self._targetTuples)
    for (targetHost, targetPort) in self._targetTuples:

        self.transport.write(data, (targetHost, targetPort))

reactor.listenUDP(5005, Forward([('10.35.203.24', 5000), ('10.35.200.251', 5005)]))  
reactor.run()

所以我正在侦听端口 5005 UDP,并将这些数据包转发到两个 IP 地址和不同的端口。

我的问题是这个 -

如何保留twisted在5005端口监听时获得的原始IP地址?

源 IP (10.1.1.1) --> Twisted (10.30.1.1) --> 多个目标

如何获取 Multiple Destinations 以查看从 (10.1.1.1) 的源 IP 保留的数据包源?

【问题讨论】:

    标签: python networking udp twisted packets


    【解决方案1】:

    当使用 BSD 套接字 API 发送 UDP 数据报时(作为第一个近似,Twisted 是一个包装器),源地址设置为套接字绑定的地址。您可以通过将interface 参数的值传递给reactor.listenTCP 来指定Twisted 中UDP 套接字的绑定地址的IP。但是,您通常受限于允许绑定的地址。通常,唯一允许的值是分配给本地网络接口的地址。如果您正在转发 10.1.1.1 的流量,但您在主机 10.30.1.1 上,那么您可能无法设置发送到 10.1.1.1 的 UDP 数据包的源地址,因为该地址未分配给主机上的网络接口转发。如果您将其分配给一个,您的网络上的路由可能会以奇怪的方式中断,因为两个不同的主机将具有相同的 IP 地址。

    这并不意味着不可能做你想做的事——但它确实意味着你可能无法使用 Twisted 的基本 UDP 支持来做到这一点。您可以采取许多其他方法。例如,您可以在 Linux 上使用 iptables 重写源地址。或者您可以在 IP 级别上操作并自己解析和生成完整的 UDP 数据报,让您指定您想要的任何源地址(您也可以在 Linux 上使用 Twisted 执行此操作,使用 twisted.pair.tuntap)。可能还有许多其他方法。最适合您的解决方案可能取决于您所针对的平台以及您希望进行此类转发的特定原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2020-07-13
      相关资源
      最近更新 更多