У нас возникают некоторые странные проблемы, когда внешние серверы пытаются подключиться к нашему веб-сайту через порт 443 (TCP), который является Apache2 + Passenger и приложением Rails. Проблема возникает редко. Я начал исследовать это, включив ведение журнала iptables с помощью iptables -I INPUT -m state --state NEW,INVALID -j LOG --log-prefix "iptables [INPUT]: "
(сделал это также для FORWARD (обычно не используется) и OUTPUT).
Теперь каждое новое соединение регистрируется в системном журнале. Теперь я видел нормальные соединения в этом системном журнале и после этого соединение с Vhost (нормальный рабочий запрос), но иногда (примерно в 1 из 100 соединений) я вижу только новое соединение в журнале iptables, но соединение, похоже, не достигает apache2 ( или экземпляры пассажира) (Нет записи в журнале apache и нет результата от соединения). Делая это с помощью curl, мы получаем тайм-аут или возвращаем пустую строку. Мы только что отправили фрагмент кода запроса curl с включенной отладкой для расширенного ведения журнала того, как выглядит ошибка curl.
Мы используем Debian Squeeze (стабильный), работающий в среде VMWare ESXi с мостовым соединением Ethernet с сетевыми адаптерами E1000 (виртуализированными). Но поскольку пакеты достигают самой VM-OS, я не думаю, что что-то из этого вызывает проблему.
Я также проверил ip_conntrack, который имеет от 40 до 50 подключений, а предел сжатия составляет около 65 КБ, так что проблема не в этом. Также у нас нет сброшенных пакетов на самой сетевой карте.
Версия ядра: Linux servername 2.6.32-5-amd64 # 1 SMP Вс, 23 сентября 10:07:46 UTC 2012 x86_64 GNU / Linux Apache2: Версия сервера: Apache / 2.2.16 (Debian) - Сервер построен: 30 ноября 2012 г. 08:58:38 Пассажир: Phusion Passenger версия 3.0.12 Рубин: RVM 1.17.9 + Ruby 1.9.3-p362
iptables -L
Цепочка INPUT (policy ACCEPT) target prot opt source destination
LOG all - где угодно и где угодно состояние INVALID, NEW префикс предупреждения уровня LOG `iptables [INPUT]: 'Цепочка FORWARD (policy ACCEPT) target prot opt source destination
LOG all - где угодно и где угодно состояние INVALID, NEW LOG level префикс предупреждения `iptables [FORWARD]: 'Цепочка OUTPUT (policy ACCEPT) target prot opt source destination
LOG all - в любом месте в любом месте состояние НЕДЕЙСТВИТЕЛЬНО, префикс предупреждения уровня NEW LOGiptables [OUTPUT]: '
У меня на самом деле нет ответа на этот вопрос, но, возможно, вы могли бы проследить его еще немного. Кажется, проблема возникает в пространстве ядра, сразу после объединения iptables или в пользовательском пространстве, когда или до того, как apache принимает соединение.
Ядро может отбрасывать пакеты само ПОСЛЕ nic и iptables из-за нагрузки, которую требует захват пакетов. Вы когда-нибудь создавали тестовую среду без iptables и определенного количества обращений, которое можно подсчитать в журнале apache?
Если у вас есть некоторый опыт работы с C, вы должны попробовать libpcap, это прекрасная библиотека для плохих и хороших вещей. Вот хорошая статья по этому поводу: http://recursos.aldabaknocking.com/libpcapHakin9LuisMartinGarcia.pdf
Это может показать вам разницу в проходящих и отбрасываемых пакетах.