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

Почему net.ipv4.tcp_rfc1337 не включен по умолчанию?

Параметр tcp_rfc1337, кажется, имеет решение для Убийства ВРЕМЕНИ-ОЖИДАНИЯ.

Первая проблема заключается в том, что старые повторяющиеся данные могут быть ошибочно приняты в новых соединениях, что приведет к повреждению отправленных данных.
Вторая проблема заключается в том, что соединения могут рассинхронизироваться и попасть в цикл ACK из-за того, что старые дублированные пакеты поступают в новые соединения, которые будут десинхронизированы.
Третья и последняя проблема заключается в том, что старые дублированные пакеты могут ошибочно входить в новые установленные соединения и уничтожать новое соединение.

Из того, что я прочитал, для решения проблем настройка игнорировать пакеты RST (сброса), пока сокет находится в состоянии TIME-WAIT.

Итак, почему этот параметр не включен по умолчанию? Какие недостатки у этого использования?

На самом деле я узнал об этой переменной, когда исследовал, как остановить атаки SYN-флуда. Как вы думаете, этот параметр помогает их остановить?

Я согласен с комментарием Грега. RFC 1337 является только информационным RFC и не является частью стандарта TCP. Чтобы гарантировать отсутствие каких-либо неожиданных изменений в производственных сетях, имеет смысл оставить эту функцию отключенной по умолчанию и оставить решение администраторам сети решать, хотят ли они включить ее для тестирования.

Удаление пакетов RST для сокетов в TIME-WAIT не появиться иметь какие-либо негативные последствия, однако, это не значит, что их нет - возможно, это странный крайний случай, который не был полностью исследован.

Интересно, что документация ядра для tcp_rfc1337 кажется неверным:

tcp_rfc1337 - BOOLEAN
    If set, the TCP stack behaves conforming to RFC1337. If unset,
    we are not conforming to RFC, but prevent TCP TIME_WAIT
    assassination.
    Default: 0

Если опция установлена, мы соответствуем RFC 1337 и отбрасываем RST-пакеты, предотвращая TIME-WAIT Assassination. Если параметр не установлен (по умолчанию), мы не соответствуем RFC 1337 и подвержены TIME-WAIT Assassination.

Я нашел исходный код ядра и для меня документ правильный: по умолчанию = 0: kill

if (th->rst) {
    /* This is TIME_WAIT assassination, in two flavors.
     * Oh well... nobody has a sufficient solution to this
     * protocol bug yet.
     */
    if (sysctl_tcp_rfc1337 == 0) {
kill:
        inet_twsk_deschedule_put(tw);
        return TCP_TW_SUCCESS;
    }
}

Значение по умолчанию имеет смысл: RFC является информационным, поэтому вы должны установить этот регулятор (значение = 1) в соответствии с ним.