Назад | Перейти на главную страницу

Перенаправить пакет на другой хост в той же сети

У меня 3 хоста в одной подсети, у каждого хоста один сетевой интерфейс:

A: 192.168.0.1/24
B: 192.168.0.2/24
C: 192.168.0.3/24

На хосте A я только один раз пингую хост B. Это должно сгенерировать пакет (A-> B) и отправить его B. B получает пакет нормально.

Теперь, когда B получает пакет от A, как я могу повторно переслать тот же пакет (A-> B) на хост C без изменения IP-адреса источника или назначения?
т.е. я буквально хочу, чтобы хост C получал пакет как (A-> B), а не (A-> C) или (B-> C)

Большое спасибо,

Если это Linux, я мог бы предложить изучить предварительную и пост-маршрутизацию. Взгляните на страницы руководства, это должно быть началом.

Если это приложение, в зависимости от вашего протокола создайте свой собственный пакет с конечным IP-адресом (что мне нужно было сделать).

Надеюсь это поможет!

Да, это можно сделать, обновив MAC-адреса источника и получателя перед повторной отправкой пакета в сеть, но оставив IP-адреса неизменными.

Этот принцип используется в некоторых балансировщиках нагрузки на основе DSR. Цитируя Сообщение в блоге HAProxy:

В режиме DSR балансировщик нагрузки направляет пакеты на бэкэнд, не меняя в нем ничего, кроме MAC-адреса назначения.

Как правило, для этого вам необходимо сделать следующее:

  1. Убедитесь, что хост C получит пакет, например, захватив его на интерфейсе с помощью tcpdump или другой процедуры pcap на интерфейсе.

  2. Вы должны убедиться, что пакет будет доставлен на хост C. Это зависит от используемого канального уровня. Предполагая, что у вас есть Ethernet и 1 интерфейс NIC на хост:

    1. Если вы используете Ethernet с концентратором или правильно настроенным коммутатором, то упакованные данные можно просто транслировать на оба порта.
    2. Если вы используете коммутатор Ethernet с таблицей MAC-адресов, вам необходимо изменить MAC-адрес назначения на хосте. B в противном случае коммутатор не направит пакет в C
    3. в случае Wi-Fi, например, поскольку он действует как концентратор, вы можете иметь одинаковые MAC-адреса и IP-адреса на обоих ПК.
  3. Тогда есть два варианта: либо
    1. хозяин B должен получить пакет и создать его копию, или
    2. хозяин B должен просто пересылать пакет на хост C (в этом случае хост C действует как шлюз по умолчанию для пересылки пакетов для хоста B, где хозяин B действует как маршрутизатор)

Поскольку ваш исходный вопрос не предполагает, что пакет действительно будет получен хостом B но просто переадресовано хозяину C Я бы сделал следующее на хосте B:

  1. разрешить пересылку пакетов sysctl -w net.ipv4.ip_forward=1
  2. создать правило для маршрутизации этого пакета в отдельной таблице с идентификатором 100 например ip rule add to 192.168.0.2 lookup 100
  3. в таблице с идентификатором 100 добавьте шлюз по умолчанию, куда должен идти пакет: ip route add default via 192.168.0.3 dev ethXXX где ethXXX это имя интерфейса ссылки на C

это, однако, вызовет цикл на хосте B это будет решено только TTL заканчивается, и создаст чрезмерную нагрузку на сеть. Это самый простой способ добиться этого.

Лучше иметь правильно настроенный коммутатор или отдельную ссылку на хост B->C отправить эти пакеты. В случае одноинтерфейсного и ненастроенного коммутатора вы всегда будете создавать петлю, если только вы не напишете для этого специализированное программное обеспечение с использованием pcap, и вам все равно придется обмануть коммутатор, притворившись, что настроен IP-адрес.