Python — Twisted — простой UDP-форвардер. Сохранить исходный IP?

У меня есть этот базовый сценарий пересылки UDP в Python 3.

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-адреса и разные порты.

Мой вопрос таков -

Как сохранить исходный IP-адрес, который получает скрученный при прослушивании порта 5005?

Исходный IP-адрес (10.1.1.1) --> Twisted (10.30.1.1) --> Несколько пунктов назначения

Как я могу заставить несколько пунктов назначения видеть источник пакета, сохраненный из исходного IP-адреса (10.1.1.1)?


person Balrizangor    schedule 15.11.2014    source источник


Ответы (1)


При отправке дейтаграмм UDP с использованием API сокетов BSD (вокруг которого, в первом приближении, Twisted является оберткой), адрес источника устанавливается в адрес, к которому привязан сокет. Вы можете указать IP-адрес привязки для сокета UDP в Twisted, передав значение аргумента interface в reactor.listenTCP. Однако обычно вы ограничены в том, к каким адресам вам разрешено привязываться. Обычно разрешены только адреса, назначенные локальному сетевому интерфейсу. Если вы перенаправляете трафик для 10.1.1.1, но находитесь на хосте 10.30.1.1, то вы, вероятно, не можете установить исходный адрес UDP-пакетов, которые вы отправляете на 10.1.1.1, потому что этот адрес не назначен сетевому интерфейсу на хосте, выполняющем пересылку. Если вы назначите его одному, маршрутизация в вашей сети, вероятно, прервется странным образом, потому что тогда два разных хоста будут иметь один и тот же IP-адрес.

Это не означает, что невозможно делать то, что вы хотите, но это означает, что вы, вероятно, не можете сделать это, используя базовую поддержку Twisted UDP. Есть ряд других подходов, которые вы могли бы использовать. Например, вы можете переписать исходные адреса, используя iptables в Linux. Или вы можете работать на уровне IP и самостоятельно анализировать и генерировать полные дейтаграммы UDP, позволяя указать любой исходный адрес, который вы хотите (вы также можете сделать это с Twisted в Linux, используя twisted.pair.tuntap). Наверняка есть еще несколько способов. Лучшее решение для вас может зависеть от того, на какие платформы вы ориентируетесь, и от конкретных причин, по которым вы хотите выполнять такую ​​переадресацию.

person Jean-Paul Calderone    schedule 16.11.2014