У меня 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-адреса назначения.
Как правило, для этого вам необходимо сделать следующее:
Убедитесь, что хост C
получит пакет, например, захватив его на интерфейсе с помощью tcpdump или другой процедуры pcap на интерфейсе.
Вы должны убедиться, что пакет будет доставлен на хост C
. Это зависит от используемого канального уровня. Предполагая, что у вас есть Ethernet и 1 интерфейс NIC на хост:
B
в противном случае коммутатор не направит пакет в C
B
должен получить пакет и создать его копию, илиB
должен просто пересылать пакет на хост C
(в этом случае хост C
действует как шлюз по умолчанию для пересылки пакетов для хоста B
, где хозяин B
действует как маршрутизатор)Поскольку ваш исходный вопрос не предполагает, что пакет действительно будет получен хостом B
но просто переадресовано хозяину C
Я бы сделал следующее на хосте B
:
sysctl -w net.ipv4.ip_forward=1
ip rule add to 192.168.0.2 lookup 100
ip route add default via 192.168.0.3 dev ethXXX
где ethXXX
это имя интерфейса ссылки на C
это, однако, вызовет цикл на хосте B
это будет решено только TTL
заканчивается, и создаст чрезмерную нагрузку на сеть. Это самый простой способ добиться этого.
Лучше иметь правильно настроенный коммутатор или отдельную ссылку на хост B->C
отправить эти пакеты. В случае одноинтерфейсного и ненастроенного коммутатора вы всегда будете создавать петлю, если только вы не напишете для этого специализированное программное обеспечение с использованием pcap, и вам все равно придется обмануть коммутатор, притворившись, что настроен IP-адрес.