Привет, у меня есть постановка проблемы, которую я пытаюсь решить уже довольно давно.
Постановка проблемы (это сетевой сценарий): машина A и машина B хотят подключиться к машине D, причем машина C является балансировщиком нагрузки между ними. На машине D я хочу определить, какое соединение пришло с машины A, а какое - с машины B.
Поскольку балансировщик нагрузки будет использовать один IP-адрес для SNAT всех подключений, поступающих от машины A и машины B.
Почему я хочу это решить? Предположим, что существует машина Z, которая является вредоносной машиной и пытается подключиться к машине D, я хочу контролировать все входящие подключения к этой машине.
По сути, соединения происходят для каждого запроса от A до D.
Есть ли что-то общее в пакетах tcp / ip этих двух соединений, которое можно использовать в качестве идентификатора?
Если у вас есть балансировщик нагрузки уровня 7 и сетевой трафик его поддерживает, балансировщик нагрузки может вставлять подсказки в трафик об исходном адресе (например, обратные прокси-серверы HTTP обычно добавляют X-Forwarded-For
заголовок, который содержит исходный адрес вызывающего абонента).
На более низких уровнях вы не имеете ни малейшего представления об источнике полученного пакета, поскольку любой тип NAT изменяет заголовок IP.
Возможно, стоит упомянуть, что в сценариях, подобных вашему, вся фильтрация должна выполняться на балансировщике нагрузки или до этого, а не на внутренних серверах. Внутренние серверы не должны заботиться о фильтрации пакетов и идентификации источника (кроме, возможно, целей на уровне приложений).
Вы можете сделать это, проверив поля IP-пакетов. Например, вы можете изменить TTL или установить DSCP на исходном компьютере и проверить его в пункте назначения. Однако здесь есть некоторые ограничения - изменение TTL будет работать, если вы знаете, как далеко (в шагах) находятся ваши «допустимые» машины.