В настоящее время у меня есть лабораторная настройка сети, имитирующая развертывание сети клиента. (По словам клиента, они используют 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