====== Sysctl - Настройка сетевых параметров ядра Linux ======
Данными настройками можно увеличить проиводительность системы, а также снизить последствия DDoS-атак и их эффективность.
**Вывести все доступные опции ядра из раздела net:**
# cat /proc/sys/net/ipv4/
**Как внести изменения в ядро на лету:**
# echo "0"> /proc/sys/net/ipv4/ip_forward
# sysctl -w net.ipv4.ip_forward=0
- Из файла,
# sysctl -p /etc/sysctl.conf
**Отобразить текущее значение:**
# cat /proc/sys/net/ipv4/ip_forward
# sysctl net.ipv4.ip_forward
=== rp_filter: ===
* Параметр который включает фильтр обратного пути, проще говоря активируется защита от подмены адресов (спуфинга).
Подробное описание:
По умолчанию он отключен:
# cat /proc/sys/net/ipv4/conf/all/rp_filter
0
Рекомендуется включить в «строгий режим» проверки (значение 2 включает «свободный режим» проверки), причем включить его можно на всех интерфейсах:
# sysctl -w net.ipv4.conf.all.rp_filter=1
Так проверку можно включить на определенном интерфейсе:
# sysctl -w net.ipv4.conf.eth0.rp_filter=1
=== accept_source_route: ===
* Запрет маршрутизации от источников.
Подробное описание:
По умолчанию эта опция отключена:
# cat /proc/sys/net/ipv4/conf/all/accept_source_route
0
Но если она у вас почему-то включена - отключите, желательно на всех интерфейсах:
# sysctl -w net.ipv4.conf.all.accept_source_route=0
# sysctl -w net.ipv4.conf.lo.accept_source_route=0
# sysctl -w net.ipv4.conf.eth0.accept_source_route=0
# sysctl -w net.ipv4.conf.default.accept_source_route=0
=== accept_redirects, secure_redirects, send_redirects: ===
* Этими тремя параметрами мы запрещаем принимать и отправлять ICMP пакеты перенаправления. ICMP-перенаправления могут быть использованы злоумышленником для изменения таблиц маршрутизации.
Подробное описание:
По умолчанию все эти параметры включены:
# cat /proc/sys/net/ipv4/conf/all/accept_redirects
1
# cat /proc/sys/net/ipv4/conf/all/secure_redirects
1
# cat /proc/sys/net/ipv4/conf/all/send_redirects
1
Но, так как наш сервер не маршрутизатор, в них нет необходимости:
# sysctl -w net.ipv4.conf.all.accept_redirects=0
# sysctl -w net.ipv4.conf.all.secure_redirects=0
# sysctl -w net.ipv4.conf.all.send_redirects=0
=== icmp_echo_ignore_broadcasts: ===
* Отключаем ответ на ICMP ECHO запросы, переданные широковещательными пакетами.
По умолчанию включено, т.е. broadcast icmp запросы приходить не будут:
# cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
1
Так и рекомендуется отставить:
# sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
=== icmp_ignore_bogus_error_responses: ===
* Игнорируем ошибочные ICMP запросы.
По умолчанию:
# cat /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
1
Так и рекомендуется отставить:
# sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
=== icmp_echo_ignore_all: ===
* Отключаем ответ на ICMP запросы (сервер не будет пинговаться).
По умолчанию:
# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
На ваше усмотрение, можно отключить:
# sysctl -w net.ipv4.icmp_echo_ignore_all=1
=== tcp_syncookies: ===
* По умолчанию данный параметр обычно включен. Если количество SYN пакетов забивает всю очередь, включается механизм Syn cookies.
Как проверить, включен ли он у нас:
# cat /proc/sys/net/ipv4/tcp_syncookies
1
Если выдает 1, то включен, 0 - значит отключен. Для отключения «на лету» достаточно воспользоваться следующей командой:
# sysctl -w net.ipv4.tcp_syncookies=0
Естественно поставив в конце «1» - механизм будет снова включен.
Подробное описание:
Таким образом, как описано выше, мы получаем неплохую защиту от syn флуда и терпим небольшую нагрузку на ЦП.
//Но согласно [[https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt|описанию]], включать генерацию syncookies на высоконагруженных серверах, для которых этот механизм срабатывает, при большом количестве легальных соединений, не следует. Если в логах есть предупреждения о SYN-флуде, при этом это вполне нормальные соединения, нужно настраивать другие параметры: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.//
=== tcp_max_syn_backlog: ===
* Параметр, который определяет максимальное число запоминаемых запросов на соединение, для которых не было получено подтверждения от подключающегося клиента (полуоткрытых соединений).
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
512
Если на сервере возникают перегрузки, можно попытаться увеличить это значение, например до 4096:
# sysctl -w net.ipv4.tcp_max_syn_backlog=4096
=== tcp_synack_retries: ===
* Время удержания «полуоткрытых» соединений.
Подробное описание:
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_synack_retries
5
Это значение имеет смысл уменьшить, например до 1 (это будет 9 секунд):
# sysctl -w net.ipv4.tcp_synack_retries=1
=== tcp_max_orphans: ===
* Определяет максимальное число «осиротевших» TCP пакетов.
Подробное описание:
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_max_orphans
262144
Рекомендуется установить 65536, а далее увеличивать, по мере необходимости:
# sysctl -w net.ipv4.tcp_max_orphans=65536
=== tcp_fin_timeout: ===
* Время ожидания приема FIN до полного закрытия сокета.
Подробное описание:
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
Рекомендуется поменять на 10 секунд:
# sysctl -w net.ipv4.tcp_fin_timeout=10
=== tcp_keepalive_time: ===
* Проверять TCP-соединения, с помощью которой можно убедиться в том что на той стороне легальная машина, так как она сразу ответит.
Подробное описание:
По умолчанию 2 часа:
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
Рекомендуется каждую минуту:
# sysctl -w net.ipv4.tcp_keepalive_time=60
=== tcp_keepalive_intvl: ===
* Интервал подачи проб.
Подробное описание:
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
Рекомендуется поставить:
# sysctl -w net.ipv4.tcp_keepalive_intvl=15
=== tcp_keepalive_probes: ===
* Количество проверок перед закрытием соединения.
Подробное описание:
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
Рекомендуется поставить:
# sysctrl -w net.ipv4.tcp_keepalive_probes=5
=== netdev_max_backlog: ===
* Параметр определяет максимальное количество пакетов в очереди на обработку, если интерфейс получает пакеты быстрее, чем ядро может их обработать.
По умолчанию:
# cat /proc/sys/net/core/netdev_max_backlog
1000
Рекомендуется так и оставить:
# sysctl -w net.core.netdev_max_backlog=1000
=== somaxconn: ===
* Максимальное число открытых сокетов, ждущих соединения.
По у молчанию:
# cat /proc/sys/net/core/somaxconn
1024
Рекомендуется установить значения в районе 15000-20000:
# sysctl -w net.core.somaxconn=15000
=== tcp_mem: ===
* Векторная (минимум, режим нагрузки, максимум) переменная которая cодержит общие настройки потребления памяти для протокола TCP.
Подробное описание:
Подробное описание: еще одно
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_mem
96552 128739 193104
Можно поставить эти же значения.увеличивать имеет смысл в случае увеличения нагрузки.
=== tcp_rmem: ===
* Векторная (минимум, режим нагрузки, максимум) переменная которая cодержит 3 целых числа, определяющих размер приемного буфера сокетов TCP.
Подробное описание:
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 4119648
Можно поставить эти же значения.увеличивать имеет смысл в случае увеличения нагрузки. В одном из источнике рекомендовали следующие значения:
# sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
=== tcp_wmem: ===
* Векторная (минимум, режим нагрузки, максимум) переменная которая cодержит 3 целых числа, минимальное, принятое по умолчанию и максимальное количество памяти, резервируемой для буферов передачи сокета TCP.
Подробное описание:
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4119648
Можно оставить эти же значения. Увеличивать их имеет смысл в случае увеличения нагрузки. В одном из источнике рекомендовали следующие значения:
# sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
=== rmem_default, wmem_default: ===
* Так же есть «глобальные» параметры размеров буфера, и они не перекрывают значения переменных tcp_rmem и tcp_wmem (читай описание выше):rmem_default - размер буфера приема данных по умолчанию для всех соединений.
* wmem_default - Размер буфера передачи данных по умолчанию для всех соединений.
Их значения по умолчанию:
# cat /proc/sys/net/core/rmem_default
229376
# cat /proc/sys/net/core/wmem_default
229376
Можно оставить эти же значения. Увеличивать их имеет смысл в случае увеличения нагрузки. Например, в одном из источнике рекомендовали следующие значения:
# sysctl -w net.core.rmem_default=65536
# sysctl -w net.core.wmem_default=65536
=== rmem_max, wmem_max: ===
* А эти «глобальные» параметры перекрывают «максимумы» переменных tcp_rmem и tcp_wmem (опять же, читай описание выше)rmem_max - максимальный размер буфера приема данных для всех соединений.
* wmem_max - максимальный размер буфера передачи данных для всех соединений.
Их значения по умолчанию:
# cat /proc/sys/net/core/rmem_max
131071
# cat /proc/sys/net/core/wmem_max
131071
Можно оставить эти же значения. Увеличивать их имеет смысл в случае увеличения нагрузки. Например, в одном из источнике рекомендовали следующие значения:
# sysctl -w net.core.rmem_max=16777216
# sysctl -w net.core.wmem_max=16777216
=== tcp_orphan_retries: ===
* Параметр который определяет число неудачных попыток, после которого уничтожается соединение TCP, закрытое на локальной стороне.
Подробное описание:
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_orphan_retries
0
Рекомендуется уменьшить значение этого параметра, поскольку закрытые соединения могут поглощать достаточно много ресурсов (т.е. оставляем 0):
# sysctl -w net.ipv4.tcp_orphan_retries=0
=== ip_conntrack_max: ===
* Максимальное количество соединений для работы механизма connection tracking (используется, например, iptables).
По умолчанию:
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
65536
При слишком маленьких значениях ядро начинает отвергать входящие подключения с соответствующей записью в системном логе:
# sysctl -w net.ipv4.netfilter.ip_conntrack_max=16777216
=== tcp_timestamps: ===
* Включает [[https://www.ietf.org/rfc/rfc1323.txt|временные метки протокола TCP]], которые позволяют управлять работой протокола в условиях высоких нагрузок (с помощью tcp_congestion_control).
Подробное описание:
По умолчанию метки включены:
# cat /proc/sys/net/ipv4/tcp_timestamps
1
Кстати, лучше отставить его включенным, иначе не будет работать опция tcp_tw_reuse.
# sysctl -w net.ipv4.tcp_timestamps=1
=== tcp_sack: ===
* Разрешаем [[https://www.ibm.com/developerworks/ru/library/l-tcp-sack/|выборочные подтверждения протокола TCP]]. Опция необходима для эффективного использования всей доступной пропускной способности некоторых сетей.
Подробное описание:
По умолчанию опция включена:
# cat /proc/sys/net/ipv4/tcp_sack
1
Рекомендуется включать эту опцию, если вы имеете неустойчивые соединения. Однако, если вы соединены 1.5-метровым кабелем с другой машиной, то в таком случае, для достижения наивысшей скорости обмена, следует эту опцию отключить:
# sysctl -w net.ipv4.tcp_sack=1
=== tcp_congestion_control: ===
* Протокол, используемый для управления нагрузкой в сетях TCP. bic и cubic реализации, используемые по умолчанию, содержат баги в большинстве версий ядра RedHat и ее клонов. Рекомендуется использовать htcp.
Подробное описание:
По умолчанию:
# cat /proc/sys/net/ipv4/tcp_congestion_control
cubic
Для сервера рекомендуется использовать htcp:
# sysctl -w net.ipv4.tcp_congestion_control=htcp
=== tcp_no_metrics_save: ===
* Данная опция запрещает сохранять результаты изменений TCP соединения в кеше при его закрытии.
По умолчанию опция ничего не запрещает:
# cat /proc/sys/net/ipv4/tcp_no_metrics_save
0
Так как это помогает повысить производительность, рекомендуется включить:
# sysctl -w net.ipv4.tcp_no_metrics_save=1
=== net.ipv4.route.flush: ===
* Актуально для ядер 2.4. По странной причине в ядрах 2.4, если в рамках TCP сессии произошел повтор передачи с уменьшенным размером окна, все соединения с данным хостом в следующие 10 минут будут иметь именно этот уменьшенный размер окна. Данная настройка позволяет этого избежать.
Так как в ядре 3.2 она даже не читается, менять ничего не стал.
=== ip_local_port_range: ===
* Опция, которая содержит диапазон локальных портов, доступных для установки исходящих подключений.
Подробное описание:
По умолчанию там такой диапазон:
# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
Для тяжелых проектов диапазон рекомендуется увеличить:
# sysctl -w net.ipv4.ip_local_port_range="1024 65535"
=== tcp_tw_reuse: ===
* Опция позволяющая повторное использование TIME-WAIT сокетов в случаях, если протокол считает это безопасным.
Подробное описание:
По умолчанию отключена:
# cat /proc/sys/net/ipv4/tcp_tw_reuse
0
Лучше включить:
# sysctl -w net.ipv4.tcp_tw_reuse=1
=== tcp_window_scaling: ===
* Опция позволяет динамически изменять размер окна TCP стека.
Подробное описание:
По умолчанию она включена:
# cat /proc/sys/net/ipv4/tcp_window_scaling
1
Лучше так и оставить:
# sysctl -w net.ipv4.tcp_window_scaling=1
=== tcp_rfc1337: ===
* С помощью этой опции мы можем защитить себя от [[https://tools.ietf.org/html/rfc1337|TIME_WAIT]] атак.
Подробное описание:
По умолчанию опция отключена:
# cat /proc/sys/net/ipv4/tcp_rfc1337
0
На сервере она точно не помешает:
# sysctl -w net.ipv4.tcp_rfc1337=1
=== ip_forward: ===
* Данная опция управляет переадресацией пакетов. Если этот параметр выключен, ОС считает себя узлом IP сети и дропает все пакеты, предназначенные не ей. Если параметр включен, то ОС считает себя маршрутизатором и действует в соответствии с RFC1812, в том числе пытается переслать адресованные не ей пакеты в соответствии с таблицей маршрутизации.
По умолчанию переадресация включена:
# cat /proc/sys/net/ipv4/ip_forward
0
Если сервер не является маршрутизатором, то включать эту опцию нет необходимости:
# sysctl -w net.ipv4.ip_forward=0
=== tcp_abort_on_overflow: ===
* Эта переменная заставляет ядро отвергать новые соединения, если их поступает количество, с которым система не в состоянии справиться. Эту переменную следует использовать как крайнюю меру!
По умолчанию она отключена:
# cat /proc/sys/net/ipv4/tcp_abort_on_overflow
0
Если ситуация требует, то ее можно включить:
# sysctl -w net.ipv4.tcp_abort_on_overflow=1