blueflux at koffein.net
Copyright (C) 2002 Oskar Andreasson
kis_an at mail.ru
Последнюю версию документа можно получить по адресу: http://ipsysctl-tutorial.frozentux.net/ .
Допускается копирование, распространение и/или модификация данного документа или его части, в соответствии с соглашениями, принятыми в GNU Free Documentation License, версии 1.1. Неизменяемыми разделами являются раздел "Введение" и все подразделы этого раздела, а так же разделы, начинающиеся словами "Original Author: Oskar Andreasson", Копия GNU Free Documentation License включена в данный документ и находится в секции "GNU Free Documentation License".
Все сценарии в данном руководстве подпадают под действие GNU General Public License. Они являются свободно распространяемыми и могут копироваться, распространяться и/или модифицироваться в соответствии с условиями GNU General Public License версии 2, опубликованной Free Software Foundation.
Сценарии распространяются в надежде на то, что они будут полезны вам, но БЕЗ КАКИХ ЛИБО ГАРАНТИЙ. За дополнительной информацией обращайтесь к тексту GNU General Public License.
С данным документом должна распространяться копия GNU General Public License, в секции "GNU General Public License"; в случае ее отсутствия вы можете сообщить по адресу Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Этот документ посвящается всем, кто помог мне в работе над ошибками в ранних версиях этого руководства и тем, кто продолжает помогать. И каждому, кто пользуется свободными продуктами, выходящими под Свободными Лицензиями.
Кроме того, я хочу посвятить этот документ моей семье, за то, что она проявляла понимание, когда я этого не заслуживал, за то, что выколачивала дурь из моей головы, когда я этого заслуживал и просто за то, что все члены семьи обладают хорошим чувством юмора.
Я приступил к работе над этим документом в надежде на то, что он поможет вам понять настройки IP (от англ. Internet Protocol -- Межсетевой Протокол, прим. перев), предоставляемые ядром Linux 2.4. Этим руководством я надеюсь дать необходимые знания, которые помогут вам изменять настройки ядра "на лету". Часть настроек может быть использована для увеличения производительности, а так же для повышения уровня безопасности. В этом документе не будут обсуждаться все возможности, которые заключает в себе механизм управления системой -- sysctl, здесь мы сосредоточим все свое внимание на управлении сетевой подсистемой. Надеюсь, что этот документ заполнит собою недостаток документации по данной теме. На самом деле едва ли существует достаточно хорошая документация, которая детально описывала бы всю структуру ipsysctl, исключение составляет лишь файл ip-sysctl.txt, входящий в комплект документации, сопровождающей исходные тексты ядра, но она очень и очень кратко поясняет возможные настройки, которые могли бы быть использованы.
Я полагаю, что может существовать литература, которая содержит описание отдельных настроек, однако вам едва ли удастся найти подробное и связное их описания. Если вы нашли этот документ достаточно полезным или просто интересным -- не стесняйтесь, передавайте, помогайте в изучении, переводите на другие языки, вобщем все, что вы сочтете необходимым. Единственная просьба -- присылайте свои замечания, чтобы в документе не было ошибок или неточностей из-за изменений в ядре и пр. Если вам встретится новая команда sysctl, которая не упоминается здесь -- сообщите мне и я постараюсь добавить ее описание как можно быстрее.
Этот документ предназначен для всех, кто стремится расширить свои познания как операционной системы Linux в целом, так и TCP/IP в частности. Для понимания этого документа вы должны обладать хорошими знаниями о TCP/IP, вы должны знать -- что такое заголовок пакета и из каких частей он состоит. Вам так же понадобится понимание принципов маршрутизации и основы построения сетей на базе TCP/IP.
Этот документ не предназначен для новичков в Linux, но едва ли это будет серьезным ограничением, если вы испытываете определенные потребности в изучении приводимого здесь материала. Одно лишь замечание -- перед внесением изменений в настройки убедитесь на 100% в том, что достаточно четко представляете себе, что именно вы делаете, поскольку некоторые изменения могут привести к весьма неожиданным результатам.
Этот документ рекомендуется всем, кто интересуется компьютерами и компьютерными сетями. Здесь вы найдете основые сведения о различных переменных, доступных через интерфейс ipsysctl, это поможет вам продвинуться вперед в понимании того, для чего предназначена каждая из них.
Этот документ может читаться в любом, удобном для вас порядке. Если вас интересуют лишь отдельные разделы -- читайте их. Если ранее вы никогда не сталкивались с sysctl -- прочитайте первую главу, а затем можете перейти к изучению интересующих вас разделов. Если вас обуревает желание прочитать документ от начала до конца -- читайте так. Если вы предпочитаете читать, начиная с конца -- читайте так. Если вам нравится читать в зашифрованном виде -- я не вижу причин, чтобы не делать этого!
Все, что я хочу сказать -- читайте те разделы, которые представляют для вас интерес. Если что-то для вас окажется непонятным -- прочитайте соответствующие разделы или в этом документе или где либо еще. Я не буду указывать вам -- как читать этот документ, ибо каждый из вас уже имеет некоторые познания и сам сможет решить -- что ему необходимо.
В данном документе используются следующие соглашения по выделению информации различного рода:
Команды, вводимые пользователем, и вывод, получаемый в результате работы команд, отображаются моноширинным шрифтом, кроме того, ввод пользователя отображается жирным шрифтом:
[blueflux@work1 neigh]$ ls default eth0 lo [blueflux@work1 neigh]$
Все команды и имена программ отображаются жирным шрифтом .
Все упоминания об аппаратном обеспечении, а так же о внутренних механизмах ядра или абстрактных понятиях системы (например: петлевой (loopback) интерфейс), отображаются курсивом.
Вывод на экран выделяется таким образом.
Имена файлов и пути к файлам отображаются таким образом: /usr/local/bin/iptables.
Это руководство базируется на описании, содержащемся в /usr/src/linux/Documentation/networking/ip-sysctl.txt. Прежде чем продолжить, я хотел бы поблагодарить людей, которые нашли время для его написания. Все, кто будет читать оба этих документа с легкостью обнаружат, что оба они имеют одинаковую структуру.
Я хотел бы выразить свою признательность всем разработчикам, учавствовавшим в работе над реализацией стека протоколов TCP/IP, которая заняла значительное время. Я надеюсь, что смогу внести свой вклад в сообщество Linux этим руководством, облегчая труд тех, кому оно необходимо.
Я так же хотел бы поблагодарить Fabrice Marie за неоценимую помощь со стандартизацией и за подсказки, когда у меня что-то не получалось. Огромное спасибо всем участникам из списка рассылки netfilter mailing list за помощь при разрешении некоторых вопросов. Огромное спасибо всем участникам проекта linuxsecurity за их терпение, проявленное при выслушивании моих напыщеных речей, а затем и оправданий за срыв сроков публикации.
Хочу выразить огромную благодарность каждому, кто оказал мне посильную помощь.
Файловая система /proc -- это виртуальная файловая система, которой не существует в действительности, иначе как в "голове" ядра. Файловая системв /proc -- это особенность ядра Linux. Она может присутствовать и в других операционных системах, но с иной функциональностью и другим предназначением.
Под термином "Виртуальные файловые системы" подразумеваются такие файловые системы, которые не имеют образа на жестком диске, в отличие от обычных файловых систем. Ничто из того, что вы делаете в виртуальной файловой системе не приводит к изменению содержимого на магнитных носителях -- только в оперативной памяти. Виртуальные файловые системы создаются ядром "на лету", в процессе загрузки и изменяются только тогда, когда вы входите в них или выполняете какие либо операции в их пределах.
![]() |
Виртуальная файловая система может иметь различные предназначения. Она может использоваться как простой RAM-диск, куда могут помещаться файлы на временное хранение. На бездисковых станциях Amiga она используется при копировании файлов с дискеты на дискету. Сначала файл(ы) копируется в память, затем в дисковод вставляется другая дискета и файл(ы) копируется на нее. Однако, эти файлы пропадут как только компьютер будет выключен или перезагружен. |
Виртуальная файловая система /proc содержит большое количество информации, собранной из ядра во время исполнения и модифицируется всякий раз, когда вы пытаетесь просмотреть ее. Вся информация отображается как обычная файловая система -- вы можете просматривать файлы, путешествовать по дереву каталогов и т.п., то есть все то, что вы можете делать и в обычной файловой системе. Однако, большинство файлов в файловой системе /proc доступны только для чтения, т.е. не могут быть изменены. Эти файлы предназначены лишь для того, чтобы предоставить необходимую вам информацию.
Одним из каталогов, доступных на чтение-запись, является каталог /proc/sys. Все переменные ("файлы"), расположенные в этом каталоге и его подкаталогах доступны как для чтения, так и для записи.
В этом документе рассматривается Internet Protocol версии 4 (IPv4). Соответсвующий ему раздел находится в каталоге /proc/sys/net/ipv4. Здесь находятся все настройки стека IPv4, включая TCP, UDP, ICMP и ARP.
Файловая система /proc содержит несколько основных каталогов и файлов, которые я опишу прежде чем перейти к рассмотрению стека ipv4.
Прежде всего следует упомянуть о том, что эта файловая система содержит огромное количество нумерованных каталогов. Каждый из этих нумерованных каталогов имеет непосредственное отношение к тому или иному активному процессу в системе. Когда запускается новый процесс -- для него создается новый каталог и все данные, касающиеся этого процесса помещаются в данный каталог, сюда помещается командная строка, которой был запущен процесс, ссылка на "текущий рабочий каталог" (cwd), переменные окружения, ссылка на исполняемый файл и т.п..
Кроме того, здесь находится довольно много других файлов и каталогов. Ниже приводится полный список:
[blueflux@work1 ]$ ls -l /proc total 0 .... -r--r--r-- 1 root root 0 Sep 19 18:09 apm dr-xr-xr-x 4 root root 0 Sep 19 10:52 bus -r--r--r-- 1 root root 0 Sep 19 18:09 cmdline -r--r--r-- 1 root root 0 Sep 19 18:09 cpuinfo -r--r--r-- 1 root root 0 Sep 19 18:09 devices -r--r--r-- 1 root root 0 Sep 19 18:09 dma dr-xr-xr-x 4 root root 0 Sep 19 18:09 driver -r--r--r-- 1 root root 0 Sep 19 18:09 execdomains -r--r--r-- 1 root root 0 Sep 19 18:09 fb -r--r--r-- 1 root root 0 Sep 19 18:09 filesystems dr-xr-xr-x 2 root root 0 Sep 19 18:09 fs dr-xr-xr-x 4 root root 0 Sep 19 18:09 ide -r--r--r-- 1 root root 0 Sep 19 18:09 interrupts -r--r--r-- 1 root root 0 Sep 19 18:09 iomem -r--r--r-- 1 root root 0 Sep 19 18:09 ioports dr-xr-xr-x 18 root root 0 Sep 19 18:09 irq -r-------- 1 root root 268374016 Sep 19 18:09 kcore -r-------- 1 root root 0 Sep 19 10:52 kmsg -r--r--r-- 1 root root 0 Sep 19 18:09 ksyms -r--r--r-- 1 root root 0 Sep 19 18:09 loadavg -r--r--r-- 1 root root 0 Sep 19 18:09 locks -r--r--r-- 1 root root 0 Sep 19 18:09 mdstat -r--r--r-- 1 root root 0 Sep 19 18:09 meminfo -r--r--r-- 1 root root 0 Sep 19 18:09 misc -r--r--r-- 1 root root 0 Sep 19 18:09 modules lrwxrwxrwx 1 root root 11 Sep 19 18:09 mounts -> self/mounts -rw-r--r-- 1 root root 208 Sep 19 11:02 mtrr dr-xr-xr-x 3 root root 0 Sep 19 18:09 net dr-xr-xr-x 2 root root 0 Sep 19 18:09 nv -r--r--r-- 1 root root 0 Sep 19 18:09 partitions -r--r--r-- 1 root root 0 Sep 19 18:09 pci dr-xr-xr-x 3 root root 0 Sep 19 18:09 scsi lrwxrwxrwx 1 root root 64 Sep 19 12:01 self -> 2864 -rw-r--r-- 1 root root 0 Sep 19 18:09 slabinfo -r--r--r-- 1 root root 0 Sep 19 18:09 stat -r--r--r-- 1 root root 0 Sep 19 18:09 swaps dr-xr-xr-x 10 root root 0 Sep 19 14:39 sys dr-xr-xr-x 2 root root 0 Sep 19 18:09 sysvipc dr-xr-xr-x 4 root root 0 Sep 19 18:09 tty -r--r--r-- 1 root root 0 Sep 19 18:09 uptime -r--r--r-- 1 root root 0 Sep 19 18:09 version [blueflux@work1 proc]$
Большая часть информации находится в формате, удобном для восприятия. Однако есть файлы, к которым не следует "прикасаться", например: kcore. Этот файл хранит отладочную информацию ядра. Если попробовать просмотреть его от начала до конца (хотя бы с помощью команды cat), то это может привести к зависанию и краху системы. В некоторых случаях, попытка скопировать kcore в обычный файл может привести к заполнению всего свободного пространства, имеющегося на заданном разделе жесткого диска. Это еще раз напоминает нам о том, что нужно быть очень и очень осторожными. В большинстве своем содержимое файловой системы /proc безопасно для просмотра, исключение составляют лишь некоторые файлы. Вот краткое описание некоторых переменных (файлов), находящихся в корне файловой системы /proc, содержащих важную информацию:
cmdline - Командная строка, переданная ядру во время загрузки.
cpuinfo - Информация о Центральном Процессорном Устройстве (CPU), известные баги, флаги и пр.
dma - Информация о доступных каналах DMA и драйверах, использующих их.
filesystems - Краткая информация о файловых системах, поддерживаемых ядром.
interrupts - Краткий список всех IRQ, данные о количестве прерываний, поступивших по каждому из них и драйверы, обслуживающие эти IRQ.
iomem - Карта памяти.
ioports - Карта портов ввода-вывода.
kcore - Полный дамп памяти. Не пытайтесь копировать это файл, это может подвесить вашу систему. Используется в целях отладки.
kmsg - Сообщения, переданные ядром, не может и не должен читаться пользователями, поскольку содержит жизненно важную информацию. В основном используется в отладочных целях.
ksyms - Таблица символов ядра, которая используется, в основном, для отладки.
loadavg - Содержит величину средней нагрузки за последние 1, 5 и 15 минут.
meminfo - Информация об использовании памяти.
modules - Информация о всех загруженных модулях ядра.
mounts - Ссылка на другой файл в файловой системе /proc, который содержит информацию обо всех смонтированных файловых системах.
partitions - Информация обо всех разделах на всех устройствах в системе.
pci - Информация обо всех PCI устройствах в системе, включая AGP и встроенные устройства, подключенные к шине PCI.
swaps - Информация о всех смонтированных swap-разделах.
uptime - uptime системы -- время в секундах, прошедшее с момента последней перезагрузки.
version - Версия ядра, включая дату сборки и версию компилятора.
Список основных каталогов:
bus - Информация обо всех аппаратных шинах, таких как USB, PCI и ISA.
ide - Информация обо всех шинах IDE в системе и IDE-устройствах.
net - Некоторая базовая информация и статистика сетевой подсистемы.
scsi - Информация о SCSI шинах в системе и SCSI-устройствах.
sys - Набор переменных, которые могут быть изменены. Сюда входит раздел /proc/sys/net/ipv4, который будет обсуждаться ниже.
Как видите -- в файловой системе /proc имеются, буквально, сотни файлов, содержащих важную информацию. Мы не рассмотрели и половины от их общего количества. Как я уже упоминал -- мы будем расматривать только раздел настроек и переменных ipv4, доступных через интерфейс sysctl.
Информация в переменные ipsysctl может заноситься двумя способами, которые обусловливают два совершенно различных метода. Первый из них -- с помощью команды sysctl, которая имеется в большинстве современных дистрибутивов. Второй способ -- посредством файловой системы /proc, которая должна иметься в любом дистрибутиве Linux, в котором ядро собрано с поддержкой этой файловой системы.
Управляться с командой sysctl немного сложнее, чем с файловой системой /proc. Как уже упоминалось ранее, при работе с командой sysctl вам нужно немножко больше, чем просто ядро. Однако sysctl предлагает лучший вариант внесения большого количества изменений. В этом случае все необходимые настройки могут быть записаны в конфигурационный файл и затем внесены в систему единственным вызовом команды sysctl. Другими словами, sysctl предлагает более гибкий способ настройки системы.
Файловая система /proc предоставляет более простой способ изменения настроек. Поэкспериментировав с настройками и выяснив их необходимый объем, мы можем записать эти настройки в файл sysctl.conf и затем воспроизводить их командой sysctl в момент загрузки системы. Конечно, можно написать сценарий на языке командной оболочки, который будет выполнять необходимые настройки через интерфейс файловой системы /proc, но такой сценарий уступает в читабельности конфигурационному файлу, передаваемому sysctl. Поэтому, если вы планируете выполнять достаточно большой объем настроек ipsysctl, то лучше будет обратиться к помощи команды sysctl.
Программа sysctl может использоваться для изменения единичной переменной или большого набора переменных (с помощью конфигурационного файла) из командной строки. Но прежде всего, с помощью этой команды можно получить список всех возможных переменных:
sysctl -a
Эта команда выведет список всех переменных, в котором имена переменных отделены символом "=" от их значений. Для вывода списка переменных можно использовать ключи -a и -A. Ключ -a приводит к выводу списка переменных, отделенных от их значений символом "=", а ключ -A -- выводит список в табличной форме (как описывается в man sysctl), но на сегодняшний день эта особенность (имеется ввиду -- вывод в табличной форме) еще не реализована, надеюсь в будущем этот недостаток будет исправлен.
Как вы можете заметить, значительная часть переменных не имеет отношения к ipsysctl. Также, наверняка от вас не ускользнула и нотация переменных (стиль записи). В ipsysctl разделитель"/" заменен на символ "." (точка). Однако sysctl корректно воспримет и разделитель "/", так что с этой стороны проблем возникать не должно. Если вам нужно просмотреть отдельную переменную, то указать это можно следующим образом:
sysctl net.ipv4.tcp_sack
Для записи значения в переменную следует воспользоваться ключом -w, за которым следуют имя переменной и новое значение, отделенной от имени знаком "=", т.е. примерно так:
sysctl -w net.ipv4.tcp_sack=0
Эта команда запишет в переменную tcp_sack value значение 0 и выведет ее на экран в качестве подтверждения. Вобщем ничего особенного. Для того, чтобы внести изменения, находящиеся в конфигурационном файле (который мы обсуждали выше), следует воспользоваться ключом -p, примерно так:
sysctl -p
Эта команда внесет все изменения, которые содержатся в файле /etc/sysctl.conf. Если возникнет потребность в использовании другого имени файла, то нужно указать этот файл в командной строке:
sysctl -p /etc/testsysctl.conf
Этой командой все необходимые настройки будут взяты не из файла по-умолчанию /etc/sysctl.conf, а из указанного в командной строке -- /etc/testsysctl.conf. Формат конфигурационного файла sysctl.conf очень прост. Прежде всего -- строки, начинающиеся символом ";" или "#", являются комментариями. Все командные строки начинаются с пути к переменной, включая имя самой переменной, далее следуют символ "=" и значение, которое должно быть записано в переменную. Путь к переменной указывается относительно /proc/sys. Ниже приводится пример файла sysctl.conf:
# Это комментарий net.ipv4.ip_forward = 0 net.ipv4.conf.all.rp_filter = 1 kernel.sysrq = 0
В этом файле в переменную net.ipv4.ip_forward записывается 0, т.е. отключается форвардинг (передача транзитных пакетов) между сетевыми интерфейсами. Если вам необходимо разделять единственное подключение к Internet между несколькими компьютерами, то в эту переменную нужно записать 1. Затем в переменную net.ipv4.conf.all.rp_filter записывается 1, включая тем самым, политику фильтрации маршрутов. Эта переменная сообщает ядру о необходимости фильтрации пакетов по их исходящему адресу.
И наконец, посредством записи значения 0 в переменную kernel.sysrq (которая собственно не имеет никакого отношения к сетевой подсистеме), отключается комбинация клавиш sysrq, которая используется при крахе системы. Эта строка добавлена лишь с цель продемонстрировать, что можно изменять и другие переменные, не являющиеся частью ipsysctl.
Интерфейс файловой системы /proc предоставляет простой доступ к переменным ipsysctl, однако, он более подходит для экспериментов с настройками, либо когда команда sysctl отсутствует в системе. Очень удобно пользоваться файловой системой /proc в отдельных случаях, когда переменная не должна включаться до определенного момента во время загрузки. Например, было бы просто замечательно, если бы переменная ip_forward включалась уже после того, как будет запущен брандмауэр.
Все что вам необходимо, чтобы пользоваться таким методом чтения-записи переменных -- это команды cat и echo. Очень трудно поверить в то, что у вас нет какой либо из них. Практически невозможно установить систему так, чтобы в ней не было этих команд.
Прежде всего, вам нужно запомнить, что все переменные, которые могут быть использованы или изменены, находятся в каталоге /proc/sys/. Все переменные, которые описываются в данном руководстве, находятся в каталоге /proc/sys/net/ipv4. В общем, для начала вам следует набирать команду
cd /proc/sys/net/ipv4
Чтобы просмотреть список доступных переменных, следует выполнить команду
ls
Проще говоря -- вы все это уже должны знать! Если это не так, то вы взялись читать не то руководство! Чтобы посмотреть значение конкретной переменной, выполните команду cat ip_forward. На мониторе это будет выглядеть примерно так:
[blueflux@work1 ipv4]$ cat ip_forward 0 [blueflux@work1 ipv4]$
Как вы можете убедиться, значения переменных могут быть прочитаны любым, кто имеет доступ к системе. Это может показаться вам проблемой с точки зрения безопасности, поскольку любой, имеющий доступ к системе сможет выяснить все настройки системы.
![]() |
К сожалению невозможно ограничить права доступа к файловой системе /proc. Дело в том, что все права на доступ жестко "зашиты" в нее, а потому "вручную" они не изменяются. Если вы очень, ОЧЕНЬ захотите изменить права доступа, то вы сможете сделать это внеся изменения в исходный текст программ, которые находятся в каталоге linux/fs/proc. |
Для записи значения в переменную воспользуйтесь командой echo. Обычно, команда echo используется для вывода на экран, но мы можем перенаправить вывод и в файл. Для случая bash это может выглядеть примерно так:
[root@work1 ipv4]# echo "1" > ip_forward [root@work1 ipv4]#
Как вы уже наверняка заметили, на сей раз мы находимся в каталоге, где лежит файл (переменная) ip_forward, поэтому не был указан полный путь к переменной. Операции записи доступны только если у вас есть права суперпользователя root. Под простым пользователем попытка записи в переменную будет выглядеть примерно так:
[blueflux@work1 ipv4]$ echo "1" > ip_forward bash: ip_forward: Permission denied [blueflux@work1 ipv4]$
Обратите внимание на то, что все команды из примеров запускаются в соответствующем каталоге. По этой причине не указывается полный путь к переменным.
В этой главе будут рассмотрены все переменные IPv4, которые доступны через интерфейс sysctl или /proc. Здесь вы найдете описание каждой переменной, за что она отвечает, значение по-умолчанию и, если это возможно, набор допустимых значений. Мы не будем углубляться в дискуссию -- почему та или иная переменная должна быть изменена, если на это не будет особых причин. Структура этой главы отражает структуру каталога ipv4
Это список всех переменных, доступных в ядре 2.4.x, которые отвечают за настройку IP. Это довольно большой список. Вам наверняка потребуется изменить некоторые из них под свои условия, а другие такого изменения не требуют. Большинство из переменных имеют достаточно приемлемые значения по-умолчанию, однако, некоторые действительно требуют дополнительной подстройки.
Устанавливает значение по-умолчанию для величины Time To Live исходящих пакетов. Это число определяет продолжительность "жизни" пакета в Internet. Каждый раз, когда пакет попадает на очередной роутер, брандмауэр и т.п., величина TTL пакета уменьшается на 1.
Значение по-умолчанию -- 64. Это достаточно приемлемое значение. Очень трудно представить себе ситуацию, когда это число оказалось бы недостаточным. Переменная принимает целое число без знака в диапазоне от 0 до 255 включительно, однако, значение 255 слишком велико, а если поставить 0 -- то вы вообще лишитесь выхода в сеть. Число 64 достаточно хорошее, если вы не пытаетесь установить соединение с компьютером, отстоящим от вас на значительном растоянии, измеряемом в "переходах" (hops). Тогда этой вличины TTL может и не хватить. Однако, я в своей практике еще не встречался с компьютерами, отстоящими от меня более чем на 30 "переходов" (hops) и я не думаю, что вам придется увеличивать значение этой переменной.
Увеличение TTL пакета до 255 может иметь свои негативные последствия. Если представить себе, что где-то произошел сбой в 2-х маршрутизаторах и пакет "зациклился" между ними, тогда пакет начнет "бегать" туда-сюда между маршрутизаторами, поглощая пропускную способность канала, до тех пор, пока TTL пакета не истечет. Как правило, величину TTL не устанавливают больше 100.
Переменная используется для разрешения некоторых проблем, связанных с динамической адресацией. Позволяет демону diald одновременно устанавливать соединение и изменять исходящий адрес в пакетах (и сокетах для локальных процессов). Эта возможность была реализованв для поддержки TCP по коммутируемым соединениям и соединениям с маскарадингом (masqueradig). Эта опция позволяет "маскарадить" исходящий адрес пакета при изменении динамического IP-адреса.
В переменную можно записать одно из 3-х значений: 0, 1 или 2.
0 -- опция выключена, это значение по-умолчанию.
1 -- опция включена.
Любое другое значение, отличающееся от 0 и 1 подразумевает включение этой опции в "многословном" (verbose) режиме, что приводит к записи в системный журнал отладочных сообщений.
Что происходит, если изменяется адрес исходящего интерфейса при включенной опции ip_dynaddr:
Исходящий адрес пакета и сокета изменяется ПРИ ПОВТОРНОЙ ПЕРЕДАЧЕ, когда он находится в состоянии SYN_SENT. Это касается локальных процессов.
Для транзитных пакетов -- исходящий адрес пакета изменяется на выходе, когда внутренний хост выполняет ПОВТОРНУЮ ПЕРЕДАЧУ, пока не будет принят внешний пакет.
Эта опция особенно полезна для случаев автодозвона, когда в момент установления связи исходящий адрес еще не известен. Любой запрос на соединение заставляет diald "поднять" исходящий интерфейс, после чего пакеты отправляются через него. Это означает, что нет необходимости сначала выдавать запрос который "поднимет" исходящий интерфейс, а затем выдавать "реальный" запрос на соединение, вместо этого мы просто устанавливаем соединение.
Включает/отключает функцию форвардинга (передачу транзитных пакетов между сетевыми интерфейсами), которая позволяет компьютеру выступать в роли брандмауэра или маршрутизатора. Эта переменная очень важна для Network Address Translation (Трансляция Сетевых Адресов), брандмауэров, маршрутизаторов и всего того, что должно передавать пакеты между сетями.
Это булева переменная. Или, другими словами, она может принимать два значения -- 0 или 1. Значение по-умолчанию -- 0, "запрещено". То есть 0 означает запрет форвардинга, а 1 -- разрешает его.
Замечу, что это очень специфичная переменная, поскольку изменение ее влечет за собой установку всех настроек в значения по-умолчанию (я, у себя в системе на ядре 2.4.20, не заметил этой особенности. прим. перев.). Полный список этих значений вы найдете в RFC1122 для хостов и RFC1812 для роутеров.
Содержит два целых числа, которые определяют диапазон локальных портов, которые используются в клиентских соединениях, т.е. для исходящих соединений, которые связывают нашу систему с некоторым узлом сети, где мы выступаем в качестве клиента. Первое число задает нижнюю границу диапазона, второе -- верхнюю.
Значения по-умолчанию зависят от имеющегося объема ОЗУ. Если установлено более чем 128 Мб, то нижняя граница будет 32768, а верхняя -- 61000. При меньшем объеме ОЗУ нижняя граница будет 1024 а верхняя -- 4999 или даже меньше.
Этот диапазон определяет количество активных соединений, которые могут быть запущены одновременно, с другой системой, которая не поддерживает TCP-расширение timestamp.
Диапазона 1024-4999 вполне достаточно для установки до 2000 соединений в секунду с системами, не поддерживающими timestamp. Проще говоря, этого вполне достаточно для большинства применений.
Переменная ip_no_pmtu_disc запрещает поиск PMTU (от англ. Path Maximum Transfer Unit -- Максимальный Размер Пакета для выбранного Пути). Для большинства случаев лучше установить в эту переменную значение FALSE, или 0 (т.е. система будет пытаться определить максимальный размер пакета, при котором не потребуется выполнять их фрагментацию, для передачи на заданный хост). Но иногда, в отдельных случаях, такое поведение системы может приводить к "срывам" соединений. Если у вас возникают такие проблемы, то вам следует попробовать отключить эту опцию (т.е. записать в переменную число 1) и установить нужное значение MTU.
Хочу обратить ваше внимание на то, что MTU и PMTU -- это не одно и то же! MTU -- (от англ. Maximum Transfer Unit -- максимальный размер пакета) определяет максимальный размер пакета для наших сетевых интерфейсов, но не для сетевых интерфейсов на другом конце. PMTU -- опция, которая заставляет систему вычислять максимальный размер пакета, при котором не потребуется фрагментация пакетов, для маршрута к заданному хосту, включая все промежуточные переходы.
Значение по-умолчанию -- FALSE (0), т.е. функция определения разрешена. Если записать число 1 в эту переменную, то функция определения PMTU будет запрещена. Переменная ip_no_pmtu_disc может принимать значение 0 или 1.
Установка этой переменной позволяет отдельным локальным процессам выступать от имени внешнего (чужого) IP адреса. Это может оказаться полезным в некоторых случаях, когда необходимо "прослушивать" внешние (чужие) IP адреса, например -- сниффинг чужого траффика. Однако, эта опция может оказывать отрицательное влияние на работоспособность отдельных приложений.
Эта переменная может иметь два значения -- 0 или 1. Если установлено значение 0, то опция отключена, 1 -- включена. Значение по-умолчанию -- 0.
Переменная задает максимальный объем памяти, выделяемый под очередь фрагментированных пакетов. Когда длина очереди достигает этого порога, то обработчик фрагментов будет отвергать все фрагментированные пакеты до тех пор, пока длина очереди не уменьшится до значения переменной ipfrag_low_thresh. Это означает, что все отвергнутые фрагментированные пакеты должны быть повторно переданы узлом-отправителем.
Пакеты фрагментируются в том случае, если их размер слишком велик, чтобы быть переданными по данному каналу. Узел-отправитель, в этом случае, "режет" пакеты на более мелкие части и затем передает их одну за другой. На узле-получателе эти фрагменты опять собираются в полноценный пакет. Примечательно, что идея фрагментации пакетов, сама по себе, вещь замечательная, но, к сожалению, может быть использована в весьма неблаговидных целях.
Переменная содержит целое число в диапазоне 0 .. 2147483647 и означает верхний порог длины очереди фрагментов в байтах. Значение по-умолчанию -- 262144 байт, или 256 Кб. Этого количества, как правило, вполне достаточно даже для самых крайних случаев.
Эта переменная очень тесно связана с переменной ipfrag_high_thresh. Она устанавливает нижний порог, при достижении которого опять разрешается прием фрагментов в очередь. Обработчик фрагментов имеет свою очередь, в которой находятся фрагментированные пакеты, ожидающие сборки. Когда длина очереди достигает верхнего порога (ipfrag_high_thresh), то прием фрагментов в очередь приостанавливается до тех пор, пока длина очереди не уменьшится до величины ipfrag_low_thresh. Это предохраняет систему от "затопления" фрагментированными пакетами и, тем самым, является, в своем роде, защитой от некоторых видов DoS-атак.
Переменная содержит целое число в диапазоне 0 .. 2147483647 и означает нижний порог длины очереди фрагментов в байтах, по достижении которого, фрагментированные пакеты снова будут приниматься в очередь. Значение по-умолчанию -- 196608 байт, или 192 Кб. Это число обязательно должно быть меньше, чем ipfrag_high_thresh.
Эта переменная определяет максимальное время "хранения" фрагментов в секундах. Это относится только к тем фрагментам, которые пока невозможно собрать, поскольку собранные пакеты к этому сроку скорее всего уже будут переданы дальше (на следующий уровень или в сеть).
Переменная принимает целое значение и определяет предельное время хранения фрагментов в секундах. Если записать туда число 5, то это будет означать 5 секунд.
Под термином "inet peer storage" понимается "хранилище" информации, имеющей отношение к определенными узлами сети. Однако, сюда помещаются только те данные, которые предполагают длительное хранение и данные, не связанные с маршрутизацией. Это означает, что она содержит информацию только о поле ID следующего исходящего пакета. В этом разделе есть несколько переменных, которые управляют поведением хранения этой информации, главным образом, переменные управляют периодичностью "сборки мусора" и сроком хранения данных.
Переменная inet_peer_gc_maxtime определяет частоту "сборки мусора" при незначительном объеме данных. Эта переменная имеет то же предназначение, что и inet_peer_gc_mintime, только выбор, какой переменной пользоваться, производится в зависимости от величины нагрузки на систему. Значение переменной измеряется в так называемых "тиках" (jiffies), понятие "тика" подробно объясняется в приложении A.
Переменная принимает целое число, измеряемое в "тиках". Значение по-умолчанию -- 120 "тиков", чего вполне достаточно для большинства серверов и рабочих станций.
Переменная inet_peer_gc_mintime устанавливает минимальное время между проходами "сборщика мусора" при значительном объеме данных, хранящихся в "inet peer storage". Когда система находится под тяжелыми нагрузками и появляется множество факторов, ограничивающих размер пула памяти, то частота "сборки мусора" определяется этой переменной. Значение переменной измеряется в так называемых "тиках" (jiffies), понятие "тика" подробно объясняется в приложении A.
Переменная принимает целое число, измеряемое в "тиках". Значение по-умолчанию -- 10 "тиков", чего вполне достаточно для большинства серверов и рабочих станций.
Это максимальное время хранения записей. При незначительных нагрузках на систему неиспользуемые записи будут удаляться через данный промежуток времени.
Значение переменной измеряется в так называемых "тиках" (jiffies), понятие "тика" подробно объясняется в приложении A.
Переменная определяет минимальное время хранения данных в "inet peer storage". Это время должно быть достаточно большим, чтобы перекрыть время сборки фрагментов на противоположной стороне. Минимальное время хранения является гарантией того, что размер пула будет меньше чем величина inet_peer_threshold.
Значение переменной измеряется в так называемых "тиках" (jiffies), понятие "тика" подробно объясняется в приложении A.
Эта переменная хранит приблизительный размер памяти для "inet peer storage". Когда размер пула достигает этой величины, то "сборщик мусора" переводится в более агрессивный режим работы -- с периодом прохода inet_peer_gc_mintime. Кроме того, этот порог влияет на срок хранения записей. Чем выше этот порог, тем больше срок хранения.
Эта переменная принимает целое число, значание по-умолчанию -- 65664 байт.
Здесь будут кратко рассмотрены переменные, ответственные за настройку TCP. Обычно эти параметры не требуют дополнительной настройки, поскольку имеют вполне разумные установки по-умолчанию и, скорее всего, вам едва ли придется менять здесь что-либо, так утверждают вполне авторитетные разработчики! Здесь в основном приводятся описания из их уст, для тех, кому это интересно.
Эта переменная заставляет ядро отвергать новые соединения, если их поступает такое количество, что система не в состоянии справиться с таким потоком. Что это означает? Допустим, что на систему обрушивается шквал запросов на соединение, тогда они могут быть просто отвергнуты, если переменная будет включена, поскольку система не в состоянии обработать их все. Если переменная не установлена, то система будет пытаться обслужить все запросы.
Переменная может иметь два значение -- 0(выключено) или 1(включено). Значение по-умолчанию -- 0. Включение этой опции следует расценивать как крайнюю меру. Перед этим необходимо попытаться поднять производительность сервисов.
Эта переменная влияет на вычисление объема памяти в буфере сокета, выделяемой под размер TCP-окна и под буфер приложения. Если величина tcp_adv_win_scale отрицательная, то для вычисления размера используется следующее выражение:
Где bytes -- это размер окна в байтах. Если величина tcp_adv_win_scale положительная, то для определения размера используется следующее выражение:
Переменная принимает целое значение. Значение по-умолчанию -- 2, т.е. под буфер приложения отводится 1/4 часть объема, определяемого переменной tcp_rmem.
Эта переменная определяет количество байт, резервируемых под TCP-окно в приемном буфере сокета. Выражение, согласно которому делается расчет, выглядит следующим образом:
Как видно из выражения -- чем больше значение переменной, тем меньше будет размер буфера окна. Исключение составляет значение 0. В этом случае резервирование не производится. Значение по-умолчанию -- 31. Не изменяйте эту переменную, если вы не уверены в том, что делаете.
Эта опция необходима для выполнения передачи дублирующих SACK-пакетов (от англ. Selective ACKnowledgement -- Выборочное Подтверждение Приема, прим. перев.). Техника выборочного подтверждения кратко описана в разделе, посвященном переменной tcp_sack. Детальное описание можно найти в RFC 2883. Здесь подробно описываются действия по обработке ситуаций, когда получен дубликат пакета, пришедшего ранее, или когда пакеты поступают не в той очередности. D-SACK -- это расширение стандарта SACK и используется для уведомления хоста-отправителя о том, что пакет был получен дважды (т.е. продублирован). Эту информацию хост-отправитель может использовать для корректировки сетевых настроек и т.п.. Эта опция гарантирует 100%-ную обратную совместимость с устаревшими реализациями TCP, если в них техника SACK не реализована каким-либо нестандартным образом. Но это чрезвычайно редкий случай, а посему -- у вас едва ли будут возникать проблемы с этим.
Переменная может иметь два состояния -- 1 (включено) и 0 (выключено). Значение по-умолчанию -- 1 (включено). И, само собой разумеется, установка этой переменной имеет смысл только если включена переменная tcp_sack, поскольку tcp_dsack очень тесно связана с ней. В большинстве случаев разумным будет оставить переменную включенной.
Переменная tcp_ecn отвечает за работу Explicit Congestion Notification (Явное Уведомление о Перегруженности) в TCP-соединениях. Используется для уведомления о возникновении "затора" на маршруте к заданному хосту или сети. Может использоваться для извещения хоста-отправителя о необходимости снизить скорость передачи пакетов через конкретный маршрутизатор или брандмауэр. Explicit Congestion Notification (ECN) детально описано в RFC 3168 - The Addition of Explicit Congestion Notification (ECN) to IP. Дополнительную информацию о ECN вы найдете в RFC 2884 - Performance Evaluation of Explicit Congestion Notification (ECN) in IP Networks.
Коротко: этот документ подробно описывает как должно передаваться уведомление о перегруженности хосту-отправителю, который, в свою очередь, может выбрать другой маршрут или начать снижать скорость передачи до тех пор, пока к нему не перестанут поступать ECN-пакеты.
![]() |
В Интернете еще встречаются маршрутизаторы и брандмауэры, которые не пропускают пакеты с установленным флагом ECN и, если вам не повезет, то вы можете столкнуться с ними. При возникновении проблем с прохождением ECN -- попробуйте отключить эту опцию. Если вам встретится подобный маршрутизатор, то можете попробовать вступить в контакт с администратором и предупредить его об имеющихся проблемах. Подробное описание проблемы и общий список аппаратуры, являющейся причиной этой неприятности, вы найдете в приложении Ссылки в пункте ECN-under-Linux Unofficial Vendor Support Page. |
Переменная может иметь два состояния -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 0 (выключено).
Переменная tcp_fack ответственна за систему Forward Acknowledgement (Упреждающее Подтверждение) в Linux. Forward Acknowledgement -- это специальный алгоритм, который работает поверх SACK, и предназначен для контроля "заторов".
Главная идея алгоритма FACK состоит в отслеживании наибольшего номера выборочно подтвержденной последовательности как признака того, что все предыдущие не подтвержденные (выборочно) сегменты были потеряны. Это позволяет оптимизировать восстановление потерь. Однако, этот алгоритм становится неработоспособным в случае неупорядоченного потока данных, тогда он (алгоритм) автоматически отключается для данного конкретного соединения.
Изначально алгоритм FACK был разработан Мэттью Матисом (Matthew Mathis) с соавторами. Документ, описывающий алгоритм, можно найти на http://www.psc.edu/~mathis/.
Переменная может принимать два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 1 (включено). Эта опция используется только тогда, когда включена переменная tcp_sack.
Переменная задает максимальное время пребывания сокета в состоянии FIN-WAIT-2. Используется в тех случаях, когда другая сторона по тем или иным причинам не закрыла соединение со своей стороны. Каждый сокет занимает в памяти порядка 1.5 Кб, что может привести к значительным утечкам памяти в некоторых случаях.
Переменная принимает целое число. Значение по-умолчанию -- 60 секунд. В ядрах серии 2.2 это значение было равно 180 секундам, но было уменьшено, поскольку иногда возникали проблемы, связанные с нехваткой памяти, на web-серверах, которые, как правило, обслуживают огромное количество подключений.
За дополнительной информацией -- обращайтесь к описанию переменных tcp_max_orphans и tcp_orphan_retries.
Переменная определяет интервал проверки "жизнеспособность" сокета. Это значение учитывается при подсчете времени, которое должно пройти перед тем как соединение будет разорвано.
Переменная принимает целое число. Значение по-умолчанию -- 75 секунд. Это достаточно высокое значение, чтобы рассматривать его как нормальное. Значения переменных tcp_keepalive_probes и tcp_keepalive_intvl могут использоваться для определения времени, через которое соединение будет разорвано.
Со значениями по-умолчанию (9 попыток с интервалом 75 секунд) это займет примерно 11 минут. Попытки определения "жизнеспособности", в свою очередь, начнутся через 2 часа после того, как через данное соединение проследовал последний пакет.
Переменная определяет количество попыток проверки "жизнеспособности" прежде, чем будет принято решении о разрыве соединения.
Переменная принимает целое число, которое не следует устанавливать больше 50-ти. Значение по-умолчанию -- 9. Это означает, что будет выполнено 9 попыток проверки соединения, чтобы убедиться в том, что соединение разорвано.
Переменная определяет как часто следует проверять соединение, если оно давно не используется. Значение переменной имеет смысл только для тех сокетов, которые были созданы с флагом SO_KEEPALIVE.
Переменная принимает целое число секунд. Значение по-умолчанию -- 7200 секунд, или 2 часа. Не уменьшайте это число без необходимости, поскольку это может привести к увеличению излишнего трафика.
Переменная задает максимальное число "осиротевших" (не связанных ни с одним процессом) сокетов. Если это число будет превышено, то такие соединения разрываются, а в системный журнал пишется предупреждение.
Это ограничение существует исключительно ради предотвращения простейших разновидностей DoS-атак. Вообще вы не должны полагаться на эту переменную! Не рекомендуется уменьшать это число. Сетевая среда может потребовать увеличение этого порога, однако, такое увеличение может привести к необходимости увеличения объема ОЗУ в системе. Прежде чем поднимать этот предел -- попробуйте перенастроить сетевые сервисы на более агрессивное поведение по отношению к "осиротевшим" сокетам.
Переменная принимает целое число. Значение по-умолчанию -- 8192, однако оно очень сильно зависит от объема памяти в системе. Каждый "осиротевший" сокет "съедает" примерно 64 Кб памяти, которая не может быть сброшена в своп (swap).
![]() |
При возникновении проблем, связанных с этим ограничением -- в системный журнал будет записано сообщение, подобное этому: TCP: too many of orphaned sockets Это может служить поводом к тому, чтобы пересмотреть значения переменных tcp_fin_timeout или tcp_orphans_retries. |
Переменная определяет максимальное время хранения SYN-запросов в памяти до момента получения третьего, завершающего установление соединения, пакета. Эта опция работает только тогда, когда включена переменная tcp_syncookies. Если сервер испытывает серьезные нагрузки, то можно попробовать немного увеличить этот параметр.
Переменная принимает целое число. Значение по-умолчанию зависит от количества памяти, имеющейся в системе. Если объем памяти менее 128 Мб, то значение по-умолчанию равно 128, если больше, то значение по-умолчанию равно 1024.
![]() |
Если вы увеличиваете эту переменную до величины более чем 1024, то было бы неплохо изменить величину TCP_SYNQ_HSIZE и пересобрать ядро. TCP_SYNQ_HSIZE находится в файле linux/include/tcp.h. Эта величина рассчитывается по формуле: TCP_SYNQ_HSIZE*16 <= tcp_max_syn_backlog |
Максимальное число сокетов, находящихся в состоянии TIME-WAIT одновременно. При превышении этого порога -- "лишний" сокет разрушается и пишется сообщение в системный журнал. Цель этой переменной -- предотвращение простейших разновидностей DoS-атак.
Переменная принимает целое число. Значение по-умолчанию -- 180000. На первый взгляд может показаться, что это очень много, но на самом деле это не так. Если у вас начинают возникать ошибки, связанные с этим параметром, то попробуйте увеличить его.
![]() |
Вам не следует уменьшать значение этой переменной. Вместо этого, если начали поступать сообщения в системный журнал, ее следует увеличить, однако, это может потребовать наращивания памяти в системе. |
В этой переменной задаются 3 значения, определяющие объем памяти, который может быть использован стеком TCP. Значения измеряются в страницах памяти. Размер одной страницы зависит от аппаратуры и конфигурации ядра. Для архитектуры i386 размер одной страницы составляет 4Кб, или 4096 байт. Некоторые, более новые аппаратные реализации, имеют размер страницы равный 16, 32 или даже 64 Кб. Все три значения по-умолчанию рассчитываются во время загрузки.
Первое число задает нижний порог. Ниже этого порога, стек TCP вообще никак не беспокоится об управлении памятью, используемой различными TCP сокетами.
Когда объем используемой памяти достигает второго предела (числа), то TCP начинает более энергично "расталкивать" память, стремясь освободить ее как можно быстрее. Этот процесс продолжается до тех пор, пока объем использумой памяти не достигнет нижнего предела.
И последнее число -- максимальный объем памяти, который может использоваться для нужд TCP. Если используемый объем памяти достигнет этого порога, то TCP просто начинает "терять"пакеты и соединения до тех пор, пока объем используемой памяти не уменьшится.
![]() |
Эта переменная может позволить несколько увеличить пропускную способность на "толстых" каналах, если должным образом настроить переменные tcp_mem, tcp_rmem и tcp_wmem. Впрочем, переменная tcp_rmem не требует особо пристального внимания, поскольку серия ядер 2.4 имеет достаточно хорошие настройки этой переменний, а вот на другие две следует взглянуть поближе. Дополнительную информацию об этом вы найдете в руководстве TCP Tuning Guide. |
Количество попыток закрыть соединение перед тем как оно будет разорвано принудительно. Если вы администрируете http-сервер, который испытывает большие нагрузки, то стоит подумать об уменьшении этого значения.
Переменная принимает целое число. Значение по-умолчанию -- 7, что соответствует, примерно, от 50 секунд до 16 минут, в зависимости от внличины Retransmission Timeout (RTO -- Таймаут для Повторной Передачи. прим. перев.). Детальное описание RTO вы найдете в разделе "3.7. Data Communication" RFC 793 - Transmission Control Protocol.
Кроме того, посмотрите описание переменной tcp_max_orphans.
Максимальное количество пакетов, пришедших в потоке не по-порядку, прежде чем будет сделано предположение о том, что пакет был потерян где-то на маршруте. Когда делается такое предположение, то стек TCP переходит обратно в режим "slow start" (медленный старт), поскольку пакет действительно мог быть утерян из-за перегруженности сети. Кроме того, стек TCP откажется от дальнейшего использования алгоритма FACK при обмене с этим хостом.
Переменная принимает целое число. Значение по-умолчанию -- 3. Это достаточно хорошее значение и не следует его изменять. Если этот параметр уменьшить, то это может значительно ухудшить работу сетевой подсистемы особенно, если пакеты часто переупорядочиваются.
Включает/выключает эмуляцию ошибки протокола TCP, делая возможным сетевое взаимодействие с некоторыми устройствами, в которых реализация стека TCP имеет эту ошибку. Без ее эмуляции было бы невозможным работать с отдельными моделями принтеров. Ошибка заключается в отправке полноразмерных пакетов при повторной передаче.
Переменная может принимать два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 1 (включено). Эмуляция ошибки никак не повредит взаимодействию с другими узлами сети, но при этом позволит общаться с устройствами, имеющими ошибку в реализации стека TCP. Вообще эта опция совершенно безопасна, однако, если в журнал пишутся непонятные сообщения -- можете попробовать отключить ее.
Максимальное количество попыток повторной передачи пакетов по установленному соединению прежде, чем сообщение об ошибке будет передано сетевому уровню, в результате чего может быть выбран другой маршрут для отправки последующих пакетов. Минимальное значение этого параметра определяется в RFC ???? и равно 3. Это число является значением по-умолчанию, что соответствует интервалу времени от 3 секунд до 8 минут, в зависимости от величины Retransmission timeout (RTO). Детальное описание RTO вы найдете в разделе "3.7. Data Communication" RFC 793 - Transmission Control Protocol.
Переменная принимает целое число. Значение по-умолчанию -- 3. Стандарты определяют диапазон изменения этого параметра от 3 до 100.
Максимальное количество попыток повторной передачи пакетов, до того как соединение будет считаться разорванным. Это ограничение определено в RFC 1122 и равно 100, но обычно его уменьшают.
Переменная принимает целое число. Значение по-умолчанию -- 15, что соответствует примерно 13-30 минутам в зависимости от величины Retransmission timeout (RTO). При желании можете попробовать уменьшить этот параметр.
Переменная tcp_rfc1337 является реализацией решения проблемы, описываемой в RFC 1337 - TIME-WAIT Assassination Hazards in TCP. Проблема связана с "устаревшими" дубликатами пакетов, которые могут вносить помехи во вновь устанавливаемые соединения и порождать три различные проблемы. Первая -- "устаревший" дубликат пакета с данными может быть ошибочно воспринят в новом соединении, что приведет к передаче неверных данных. Вторая -- соединение может быть десинхронизировано и "уйти" в ACK-цикл из-за "устаревших" дубликатов, которые порождают новые соединения (здесь автор имеет ввиду "устаревшие" дубликаты SYN-пакетов, прим. перев.). И третья, и последняя проблема -- "устаревшие" дубликаты могут "проникнуть" в недавно созданное соединение и ошибочно уничтожить его.
Согласно упомянутому RFC существуют три возможных решения, однако, одно из них решает эту проблему лишь частично, второе требует внесения значительных изменений в протокол TCP.
Окончательное решение состоит в том, что RST-пакеты должны просто игнорироваться, пока сокет находится в состоянии TIME_WAIT. Вместе с установкой параметра Maximum Segment Life (MSL -- максимальное время жизни сегмента) равным 2 мин. такой подход решает все три проблемы, описанные в RFC 1337.
Переменная содержит три числа, которые используются при управлении размерами приемных буферов.
Первое число -- минимальный размер приемного буфера, который выделяется для каждого сокета. Этот размер буфера выделяется всегда, даже при очень высоких нагрузках на систему. Значение по-умолчанию -- 4096 байт, или 4 Кб. В предыдущих версиях ядра Linux это значение было 8192 байт. Это достаточно большой размер и не следует увеличивать его, иначе, при "взрывных" нагрузках на сеть, вы можете столкнуть с очень серьезными проблемами.
Второе число -- размер приемного буфера по-умолчанию, который выделяется для каждого сокета. Это значение перекрывает значение переменной /proc/sys/net/core/rmem_default, которая используется другими протоколами. Значение по-умолчанию -- 87380 байт, или 85 Кб. Совместно с переменными tcp_adv_win_scale и tcp_app_win эта переменная используется при расчете размера TCP-окна. Это значение используется при незначительных нагрузках. Как и в случае с первым значением -- не следует без особой нужды изменять этот параметр.
![]() |
Эта переменная может дать некоторый прирост производительности на "толстых" каналах, если достаточно корректно используется вместе с переменными tcp_mem и tcp_wmem. tcp_rmem не требует вмешательства извне, поскольку ядра серии 2.4 достаточно хорошо настраивают ее автоматически, а вот на tcp_mem и tcp_wmem можно взглянуть попристальнее. Дополнительную информацию, по настройке переменных, вы найдете в TCP Tuning Guide. |
Третье, и последнее, число -- максимально возможный размер приемного буфера, который может быть размещен для каждого сокета. Этот параметр перекрывается переменной /proc/sys/net/core/rmem_max, если значение в ipv4 оказывается больше. Перед изменением этого параметра -- вам следует сначала взглянуть на значение /proc/sys/net/core/rmem_max. Значение по-умолчанию -- удвоенное значение второго параметра, т.е. -- 87380 * 2 bytes, или 174760 байт (170 Кб). Как правило этот параметр не нуждается в корректировке.
Разрешает Selective Acknowledgements (SACK -- Выборочное Подтверждение), детальное описание вы найдете в RFC 2883 - An Extension to Selective Acknowledgement (SACK) Option for TCP и RFC 2883 - An Extension to Selective Acknowledgement (SACK) Option for TCP.
Если эта переменная включена (установлена 1), то в TCP-заголовке будет устанавливаться SACK-флаг при передаче SYN-пакета, сообщая тем самым удаленному хосту, что наша система в состоянии обрабатывать SACK, на что удаленный хост может ответить ACK-пакетом с установленным флагом SACK. Этот режим выборочно подтверждает каждый сегмент в TCP-окне. Это особенно полезно на неустойчивых соединениях, поскольку позволяет производить повторную передачу лишь отдельных, не подтвержденных фрагментов, а не всего TCP-окна, как это диктуется более старыми стандартами. Если какой либо сегмент TCP-окна был "утерян", то приемная сторона не пришлет на него SACK-подтверждение о приеме. Отправитель, поняв это, повторит передачу "потерявшихся" сегментов. Избыточные данные сохраняются в TCP-заголовке, 40 байт на сегмент. Подтверждение каждого сегмента -- это два 32-битных беззнаковых целых числа, таким образом в заголовке может разместиться подтверждение 4-х сегментов. Однако, как правило, совместно с опцией SACK используется опция timestamp, которая занимает 10 байт и поэтому в одном пакете может быть подтверждено не более 3 сегментов.
Рекомендуется включать эту опцию, если вы имеете неустойчивые соединения. Однако, если вы соединены 1.5-метровым кабелем с другой машиной, то в таком случае, для достижения наивысшей скорости обмена, следует эту опцию отключить. Обычно эта опция не нужна, но лучше ее включить. Она обеспечивает 100% обратную совместимость, т.е. вы не должны испытывать никаких проблем при соединении с хостами, которые эту опцию не поддерживают.
В переменную могут быть записаны два числа -- 0 (выключено) и 1 (включено). Значение по-умолчанию --1 (включено).
Разрешает/запрещает соответствие стандарту RFC 1122. Поведение по-умолчанию соответствует стандарту использования флага URG -- BSD 4.2, описанному в RFC 793. Если эта переменная включена, то возможны сбои при работе с отдельными узлами Интернета, точнее -- с узлами, которые придерживаются стандарта BSD 4.2. За дополнительной информацией обращайтесь к RFC 1122 - Requirements for Internet Hosts -- Communication Layers секция "4.2.2.4 Urgent Pointer: RFC 793 Section 3.1 explanation", где имеется ссылка на RFC 793 - Transmission Control Protocol.
Переменная принимает два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 0 (выключено).
Количество попыток передачи SYN-пакета при установлении нового соединения.
Переменная принимает целое число, которое не должно устанавливаться больше чем 255, поскольку каждая повторная попытка отнимает значительное время. На каждую попытку отводится примерно 30-40 секунд. Значение по-умолчанию -- 5, что соответствует, примерно, 180 секундам.
Количество попыток передачи SYN,ACK-пакета в ответ на SYN-запрос. Другими словами -- максимальное число попыток установить пассивное TCP-соединение, инициированное другим хостом.
Переменная принимает целое число, которое не должно устанавливаться больше чем 255 по тем же причинам, что и в случае с переменной tcp_syn_retries. Значение по-умолчанию -- 5.
Разрешает/запрещает передачу так называемых syncookies вызывающему хосту в случае переполнения очереди SYN-пакетов для заданного сокета. Когда в систему поступает слишком много запросов на соединение, то очередь может переполниться и тогда запускается передача syncookies в ответ на каждый SYN-запрос.
Эта переменная используется для предотвращения syn-flood атак. Переменная может принимать два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 0 (выключено).
Эта функция будет работать только в том случае, если ядро собрано с опцией CONFIG_SYN_COOKIES. (прим. перев.)
![]() |
В прошлом было много дискуссий по поводу проблем и недостатков, связанных с syncookies. Лично я рассматриваю эту возможность как достаточно удобную и безопасную. Однако, в некоторых случаях, использование этой опции может представлять некоторую угрозу, см. ниже. Опция tcp_syncookies подразумевает, что на системах с высокой нагрузкой новые соединения будут устаналиваться без таких "фишек", как ECN и SACK. Если передача syncookies срабатывет при невысоких нагрузках, то вам следует подкорректировать параметр, задающий длину очереди. Не следует использовать эту возможность на системах с высокой нагрузкой. Если в системный журнал поступают предупреждения о syn flood для вполне законных соединений, то можете попробовать подстроить переменные tcp_max_syn_backlog, tcp_synack_retries и tcp_abort_on_overflow. |
Разрешает/запрещает использование временных меток (timestamps), в соответствии с RFC 1323. Если коротко, то это расширение TCP используется для расчета Round Trip Measurement (определение времени возврата) лучшим способом, нежели метод Retransmission timeout (RTO). Эта опция должна сохранять обратную совместимость в большинстве случаев, так что лучше оставить ее включенной, особенно если вы работаете в высокоскоростной сети (например LAN или 10mb Интернет). В случае низкоскоростного оединения (скажем модемное) -- вы прекрасно обойдетесь и без этой опции, и будет даже лучше, если вы ее отключите.
Переменная может принимать два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 1 (включено).
Более подробную информацию вы найдете в секции 4 документа RFC 1323 - TCP Extensions for High Performance.
Разрешает/запрещает быструю утилизацию сокетов, находящихся в состоянии TIME-WAIT. Если вы не уверены в своих действиях, то вам лучше не трогать эту переменную.
Переменная принимает целое число (а не булевское -- из моего опыта и моего понимания исходных текстов ядра следует, что описание переменной в linux/Documentation/ip-sysctl.txt содержит ошибку, если я не ошибаюсь). Значение по-умолчанию -- 0.
![]() |
Не изменяйте эту переменную, если вы не уверены в своих действиях или не получили совет от опытных экспертов по ядру. |
Разрешает/запрещает масштабирование TCP-окна, как определено в RFC 1323. В этом документе описано как производится масштабирование TCP-окна при передаче по Large Fat Pipes (LFP -- "толстый" канал). При передаче TCP-пакетов по "толстым" каналам возникают существенные потери пропускной способности из-за того, что они не загружены полностью во время ожидания подтверждения о приеме предыдущего TCP-окна. Основная проблема состоит в том, что окно не может иметь размер больше, чем 2**16 байт (65 Кб). Разрешая масштабирование TCP-окна мы, тем самым, можем увеличить его размер и таким образом уменьшить потери пропускной способности.
Переменная может принимать два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 1 (включено).
Дополнительную информацию по этой теме вы найдете в RFC 1323 - TCP Extensions for High Performance.
Переменная содержит три числа, которые используются при управлении размерами буферов передачи, выделяемых для каждого сокета. Каждое из значений используется при определенных условиях.
Первое значение -- минимальный размер буфера передачи для каждого сокета. Системой гарантируется выделение этого пространства при открытии сокета. Обычно это значение равно 4096 байт.
Второе значение -- размер передающего буфера по-умолчанию. При попытке увеличить размер буфера передачи больше этого ограничения, приложение может столкнуться с "нежеланием" системы выделения большего объема памяти при тяжелых нагрузках. Это может даже привести к потере пакетов при очень высоких нагрузках. Значение по-умолчанию -- 16384 байт, или 16 Кб. Будет неразумным попытаться увеличить это значение. Этот параметр перекрывается переменной /proc/sys/net/core/wmem_default, которая используется другими протоколами и, как правило, tcp_wmem должна быть меньше чем /proc/sys/net/core/wmem_default.
Третье значение -- максимальный размер буфера передачи для отдельного сокета. По-умолчанию -- 131072 байт, или 128 Кб. Это достаточно разумное значение и в большинстве случаев вам едва ли придется корректировать его. Однако, если вам придется его увеличивать -- помните о существовании переменной /proc/sys/net/core/wmem_max, которая должна быть всегда больше чем tcp_wmem.
![]() |
Эта переменная может дать некоторый прирост производительности на "толстых" каналах, если достаточно корректно используется вместе с переменными tcp_mem и tcp_rmem. tcp_wmem дает наибольший прирост производительности из этих трех переменных. Замечу при этом, что вы практически не получите никакого выигрыша в сетях со скоростью передачи менее 1 Гб. Дополнительную информацию, по настройке переменных, вы найдете в TCP Tuning Guide. |
Эти переменные управляют поведением протокола ICMP. Они достаточно просты и их понимание не должно вызывать затруднений, которые могут возникнуть при изучении TCP-переменных. Главным образом они отвечают за реакцию ядра на различные типы ICMP-сообщений.
Переменная может принимать два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 0 (выключено). Если в переменную записана 1, то ядро просто игнорирует все ICMP Echo запросы и тогда никто не сможет ping-нуть вашу машину, чтобы проверить ее наличие в сети, что само по себе не есть хорошо. Однако, у каждого из нас может быть свое собственное мнение по поводу этой опции. С одной стороны -- окружающие лишены возможности проверить ваше присутствие в сети, с другой -- существует масса приложений, которые используют ICMP Echo запросы далеко не в благовидных целях. Вобщем все как всегда -- что-то плохо, а что-то хорошо.
Эта переменная очень близка по смыслу к icmp_echo_ignore_all, только в данном случае будут игнорироваться ICMP сообщения, отправленные на широковещательный или групповой адрес. Вполне очевидно, почему полезно включить этот параметр -- защита от smurf атак.
Переменная может принимать два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 0 (выключено).
Отдельные маршрутизаторы, вопреки стандартам, описанным в RFC 1122, отправляют фиктивные ответы в широковещательном диапазоне. Обычно эти ошибки заносятся в системный журнал. Если вы не желаете регистрировать их, то включите этот параметр и тем самым сбережете некоторый объем дискового пространства в своей системе.
Переменная может принимать два значения -- 0 (выключено) и 1 (включено). Значение по-умолчанию -- 0 (выключено).
Максимальная частота генерации ICMP-пакетов с типом, указанным в icmp_ratemask (см. icmp_ratemask). Это значение задается в "тиках" и устанавливает временной интервал между ICMP-посылками. Таким образом, значение 0 означает отсутствие ограничений. Обычно 1 "тик" равен 0.01 секунды, так значение 1 в этой переменной ограничивает скорость передачи не более 100 посылок в секунду, а значение 100 -- не более 1 посылки в секунду.
Значение по-умолчанию -- 100, что означает не более 1 ICMP посылки за интервал в 100 "тиков".
Маска ICMP типов, на которые накладывается ограничение по частоте генерации переменной icmp_ratelimit. Каждый из ICMP типов маскируется своим битом.
icmp_ratemask -- это битовая маска, где каждый ICMP тип представлен своим битом. Соответствие между символическим названием ICMP типа и его порядковым номером вы найдете в заголовочном файле netinet/ip_icmp.h (обычно это /usr/include/netinet/ip_icmp.h). За дополнительной информацией обращайтесь к RFC 792 - Internet Control Message Protocol. Математически маска определяется так:
где n принимает значения всех типов ICMP, которые должны б