... Эталонно влетел в неожиданном месте. Началось всё с того, что в одном из L2-сегментов сети сервера вдруг стали принимать подключения не с первого раза. То есть ломишься ты куда-нибудь по тому же SSH или HTTP, тебе с первой попытки прилетает Connection Refused, а уже со второй-третьей-пятой всё нормально.
Выяснение причины таких чудес заняло довольно много времени. В конце концов виновник был найден. Помимо прочего в этом L2-сегменте был гипервизор на базе ProxMox. И для одной из виртуалок внутри были выставлены вот такие настройки Firewall-а (которые я сам же когда-то и сделал, ха-ха).
Что получалось. После какого-то периода неактивности железный коммутатор "забывает" на каком порту у него "сидит" абонент с тем или иным MAC-адресом. Поэтому когда к такому "неизвестному" серверу прилетает первый SYN-пакет, свитч превращается в хаб и рассылает кадр с ним по всем своим портам.
Виртуальные fwln-интерфейсы ProxMox-а всегда работают в promiscuous-режиме, поэтому хавают такой пакет. Если он не попадает в категорию разрешенных (а он не попадает, потому что изначально предназначался вообще другой машине), то срабатывает правило "Default INPUT Policy = Reject" (на скриншоте подчеркнуто красной линией), и гипервизор посылает в сеть отлуп с TCP RST. Шосукахарактерно, посылает с "чужих" IP и MAC-адресов. То есть снифферы показывают, что TCP Reset прихоит якобы действительно с той самой машины, на которую предпринималась попытка коннекта.
Далее "легальный" сервер шлёт клиенту SYN-ACK, но оный клиента не интересует, т.к. с его точки зрения соединение уже закрыто.
При второй попытке коммутатор уже знает на каком порту у него находится "легальный" сервер, поэтому шлёт кадр с SYN-пакетом прицельно ему и только ему, "левый" гипервизор его не видит, не мешает, соединение устанавливается.
Смешно. Но хрен раскопаешь.
В "обычной" жизни подобного не происходит, потому что редко когда интерфейс переключается в promiscuous. До ядра "чужие" кадры не дойдут. А в случае с ProxMox-ом наоборот: интерфейсы всегда в promiscuous.
Уж не знаю баг это или фича, но поведение как минимум неожиданное. Так-то не предполагаешь побочных спецэффектов от простого переключения Default Policy из DROP в REJECT в контексте одной отдельно взятой виртуалки. А вот поди ж ты. Попробую что ли обсудить этот вопрос на форуме разработчика. Интересно, как это всё должно работать по его задумке.
Всем удобной виртуализации и отсутствия побочных спецэффектов.