У меня есть эти правила в UFW (по умолчанию запретить):
80 ALLOW 10.0.0.0/8
443 ALLOW 10.0.0.0/8
80 DENY Anywhere
443 DENY Anywhere
Я подключаюсь с машины на 10.0.0.0/8 к Apache, прослушивающему порт 80. Мы заметили, что nginx, запущенный на другой машине (балансировщик нагрузки перед этой машиной apache), иногда выдавал ошибки «время ожидания подключения». Я могу воссоздать тайм-аут, просто запустив цикл for в сценарии bash, который обращается к порту 80 с этой машины nginx. У меня может быть 3 или 4 таймаута в пакете из 1000 тестов.
В / var / log / messages я вижу это по истечении времени ожидания:
1 декабря 01:01:01 webserver.mydomain.com ядро: [UFW BLOCK] IN = eth0 OUT = MAC = 00: 11: 22: 33: 44: 55: 66: 77: 88: 99: aa: bb: cc : dd SRC = 10.0.0.5 DST = 10.0.0.2 LEN = 60 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 16923 DF PROTO = TCP SPT = 60064 DPT = 80 WINDOW = 5792 RES = 0x00 SYN URGP = 0
Почему UFW их блокирует? Если я отключу UFW, эти таймауты подключения полностью исчезнут, и все будет работать должным образом. Другие порты (например, 22) не имеют этой проблемы, я могу запускать скрипты, которые бесконечно работают с ними, без каких-либо проблем, даже при активированном ufw.
Я потратил много времени, пытаясь устранить эту проблему. Участие UFW было симптомом реальной проблемы, а не причиной. Я нашел решение, поэтому не хотел оставлять вопрос без ответа.
Я обнаружил, что по какой-то причине, которую я пока не могу объяснить, на серверах apache за балансировщиком нагрузки были отключены файлы cookie:
# sysctl -a | grep syncookies
net.ipv4.tcp_syncookies = 0
Причина, по которой я не могу это объяснить, заключается в том, что он установлен в 1 в файле Centos6 /etc/sysctl.conf по умолчанию. Это отдельный вопрос, который мне предстоит решить.
Вы можете узнать больше о файлах cookie синхронизации здесь:
http://en.wikipedia.org/wiki/SYN_cookies
Это относительно загруженные серверы, которые обрабатывают большое количество подключений. Мое лучшее предположение состоит в том, что включение UFW (и, следовательно, включение iptables) замедлило работу ровно настолько, чтобы очередь синхронизации заполнилась, и без syncookies в соединениях начали отказываться.