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

ARP / ICMP в сетевой среде с перекрывающимся IP-адресом

В настоящее время у меня есть лабораторная настройка сети, имитирующая развертывание сети клиента. (По словам клиента, они используют VRF через VLAN, чтобы их клиент мог иметь перекрывающуюся сеть, соединяющуюся с одним и тем же хостом сервера).

Так что абстрагируйтесь от всей сложности, у меня есть такая установка:

     client 1                                      server                      
+--------------------+                   +--------------------------------+
| vlan 100           |                   |                                |    
|                    |                   |----+-----+                     |    
| ip: 192.168.1.100  |------------------>|    |  e  | vlan100             |
| on eth1            |                   |    |  t  |                     |    
|                    |                   |    |  h  | ip: 192.168.1.200   |    
+--------------------+                   | e  | 0.1 |                     |    
                                         | t  |-----+                     |    
     client 2                            | h  |-----+                     |    
+--------------------+                   | 0  |  e  | vlan101             |
| vlan 101           |                   |    |  t  |                     |    
|                    |                   |    |  h  | ip: 192.168.1.200   |    
| ip: 192.168.1.100  |------------------>|    | 0.2 |                     |    
| on eth1            |                   |----+-----+                     |    
|                    |                   |                                |    
+--------------------+                   +--------------------------------+    

Пожалуйста, не спрашивайте меня, почему так. Эта установка предназначена для воспроизведения того же сценария, который наш клиент будет использовать для своего развернутого сервера. Суть в том, что несколько VLAN используются для обеспечения нескольких перекрывающихся виртуальных IP-сетей, а сервер имеет один и тот же IP-адрес для всех этих виртуальных IP-сетей. Сервер может ожидать подключения от клиентов из разных виртуальных сетей с конфликтующими IP-адресами.

Наш сервер отлично работает и принимает соединения. Мы привязываем наш сокет к каждому индивидуальному интерфейсу VLAN. Все нормально работает. Но вот что меня озадачивает. Клиент 2 не может проверить связь с сервером (192.168.1.200), поскольку все ответы ICMP отправляются клиенту 1.

Я взглянул на пакеты tcpdumped. Сервер может без проблем получить ICMP-пакет от клиента 2. Но когда он пытается отправить ответ ICMP, он отправляется клиенту 1. Прежде чем сервер отправит ответ ICMP на адрес 192.168.1.100, он фактически сначала отправил ARP-запрос «who-has 192.168.1.100 tell 192.168. 1.200 "через eth0.1. Таким образом, клиент 1 отправляет ответ ARP, чтобы сообщить серверу, что у него IP 192.168.1.100.

Итак, мне интересно: 1. Почему серверу нужно отправлять ARP-запрос, чтобы спросить, у кого снова 192.168.1.100? Поскольку он уже должен знать, что 192.168.1.100 принадлежит клиенту 2 из первоначального запроса ARP от клиента 2 с вопросом «у кого есть 192.168.1.200», кеш arp на сервере также подтверждает, что сервер знает:

192.168.1.100            ether   f0:92:1c:19:a0:01   C                     eth0.1
192.168.1.100            ether   f0:92:1c:19:d1:c1   C                     eth0.2

Перехваченные tcpdump пакеты также подтверждают это. Смотрите скриншот здесь:

Во-вторых, мне интересно, есть ли способ сказать, отвечать только на запрос ICMP через тот же входящий сетевой интерфейс? Таким образом, даже если есть записи для 192.168.1.100 как на eth0.1, так и на eth0.2, ответ ICMP будет отправлен обратно на vlan 101 правильно.

Я не столько сетевой инженер, что если я сделал какую-либо ошибку или неверное утверждение, пожалуйста, будьте терпеливы и укажите на мои ошибки. Заранее благодарим за любые ответы и помощь.

P.S. Я на самом деле включил arp_ignore. Это настройки моего сервера:

net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0/1.arp_announce = 2
net.ipv4.conf.eth0/1.arp_ignore = 1
net.ipv4.conf.eth0/2.arp_announce = 2
net.ipv4.conf.eth0/2.arp_ignore = 1