Я установил оба параметра tcp_tw_recycle / reuse на 1 в моем файле конфигурации.
Каковы последствия этого?
Если tcp-сокет используется повторно, это создает угрозу безопасности? то есть 2 разных соединения, оба потенциально могут отправлять данные?
Подходит ли это для кратковременных соединений с небольшой вероятностью переподключения?
Ответы:
По умолчанию, когда оба
tcp_tw_reuse
иtcp_tw_recycle
отключены, ядро будет гарантировать, что сокеты вTIME_WAIT
состоянии будут оставаться в этом состоянии достаточно долго - достаточно долго, чтобы быть уверенным, что пакеты, принадлежащие будущим соединениям, не будут приняты за поздние пакеты старого соединения.Когда вы включаете
tcp_tw_reuse
, сокеты вTIME_WAIT
состоянии могут использоваться до истечения срока их действия, и ядро будет пытаться убедиться, что нет никаких конфликтов в отношении порядковых номеров TCP. Если вы включитеtcp_timestamps
(иначе говоря, PAWS, для защиты от последовательных номеров), это будет гарантировать, что эти столкновения не произойдут. Однако вам нужно, чтобы временные метки TCP были активированы на обоих концах (по крайней мере, я так понимаю). Смотрите определение tcp_twsk_unique для подробностей.Когда вы включаете
tcp_tw_recycle
, ядро становится намного более агрессивным и делает предположения о временных метках, используемых удаленными хостами. Он будет отслеживать последнюю временную метку, используемую каждым удаленным хостом, имеющим соединение вTIME_WAIT
состоянии), и позволит повторно использовать сокет, если временная метка была правильно увеличена. Однако, если временная метка, используемая хостом, изменится (т. Е. Деформируется во времени),SYN
пакет будет автоматически отброшен, и соединение не будет установлено (вы увидите ошибку, похожую на «время ожидания соединения»). Если вы хотите погрузиться в код ядра, определение tcp_timewait_state_process может быть хорошей отправной точкой.Теперь метки времени никогда не должны возвращаться во времени; если:
TIME_WAIT
сокет, вероятно, истек, так что это не проблема);TIME_WAIT
соединения останутся немного, но другие соединения, вероятно, будут сбиты,TCP RST
и это освободит некоторое пространство);В последнем случае вы можете иметь несколько хостов за одним и тем же IP-адресом, и, следовательно, разные последовательности временных меток (или указанные временные метки рандомизируются при каждом соединении межсетевым экраном). В этом случае некоторые хосты не смогут случайным образом подключиться, поскольку они сопоставлены с портом, для которого
TIME_WAIT
сегмент сервера имеет более новую временную метку. Вот почему в документах говорится, что «устройства NAT или балансировщики нагрузки могут начать отбрасывать кадры из-за настроек».Некоторые люди рекомендуют оставить в
tcp_tw_recycle
покое, но включитьtcp_tw_reuse
и опуститьtcp_timewait_len
. Я согласен :-)источник
Я только что это укусил меня, так что, возможно, кто-то может извлечь выгоду из моей боли и страданий. Во-первых, вовлеченная ссылка с большим количеством информации: http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
В частности:
Я использовал их достаточно успешно, чтобы обеспечить как можно более низкую задержку, соединение haproxy от клиентов к кластеру MySql NDB. Это было в частном облаке, и никакие соединения от любого к любому не имели никакого вида NAT в соединении. Сценарий использования имеет смысл, насколько это возможно, уменьшите время ожидания для клиентов радиуса, попадающих в NDB через haproxy. Так и было.
Я сделал это снова в общедоступной haproxy-системе, балансируя нагрузку веб-трафика, без реального изучения влияния (глупо, правда ?!) и обнаружил после долгих поисков неисправностей и преследования призраков, что:
На стороне клиента они будут видеть периоды времени, когда они больше не будут получать ответы на пакеты SYN, иногда здесь и там, а иногда в течение длительных периодов. Опять случайно.
Короткий рассказ здесь, в моем недавнем, болезненном опыте: оставьте их в покое / отключено на общедоступных серверах, независимо от роли!
источник
От 'man 7 tcp' вы увидите это:
Там не так много помощи. У этого вопроса также есть хорошее понимание:
/programming/6426253/tcp-tw-reuse-vs-tcp-tw-recycle-which-to-use-or-both
Но не конкретная информация о том, почему повторное использование безопаснее, чем переработка. Основной ответ заключается в том, что tcp_tw_reuse позволит использовать один и тот же сокет, если в TIME_WAIT уже есть один с такими же параметрами TCP, и он находится в состоянии, когда больше не ожидается трафик (я считаю, что это, когда FIN был отправлен ). С другой стороны, tcp_tw_recycle будет просто повторно использовать сокеты, находящиеся в TIME_WAIT, с одинаковыми параметрами независимо от состояния, что может привести к путанице с состоянием межсетевых экранов, которые могут ожидать разные пакеты.
tcp_tw_reuse можно сделать выборочно в коде, установив опцию сокета SO_REUSEADDR, задокументированную
man 7 socket
так:источник
SO_REUSEADDR
это связано сtcp_tw_reuse
? Насколько я знаю,SO_REUSEADDR
применяется только тогда, когда вы хотитеbind()
, в то времяtcp_tw_reuse
как ядро будет указывать повторно использовать порт локального сокета вTIME_WAIT
состоянии, если ему необходимо создать новое исходящее соединение.