В этой статье я приведу пример оптимизации параметров nf_conntrack для высоконагруженного NAT сервера.
Сначала посмотрим текущее и максимальное количество отслеживаемых соединений (максимальное обычно 524288):
/sbin/sysctl net.netfilter.nf_conntrack_count /sbin/sysctl net.netfilter.nf_conntrack_max
Увеличим максимальное значение и hashsize (у меня обычно hashsize=nf_conntrack_max/8):
/sbin/sysctl -w net.netfilter.nf_conntrack_max=4194304 echo "524288" > /sys/module/nf_conntrack/parameters/hashsize
Чтобы изменение не сбросилось после перезапуска системы, укажем в /etc/sysctl.conf:
net.netfilter.nf_conntrack_max = 4194304
А также hashsize в /etc/rc.local:
echo "524288" > /sys/module/nf_conntrack/parameters/hashsize
Теперь посмотрим текущие значения timeout:
sysctl -a | grep conntrack | grep timeout
По умолчанию обычно такие значения:
net.netfilter.nf_conntrack_generic_timeout = 600 net.netfilter.nf_conntrack_icmp_timeout = 30 net.netfilter.nf_conntrack_tcp_timeout_close = 10 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_established = 432000 # 5days net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30 net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300 net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60 net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300 net.netfilter.nf_conntrack_udp_timeout = 30 net.netfilter.nf_conntrack_udp_timeout_stream = 180
На высоконагруженных серверах желательно немного уменьшить значения timeout, особенно при DDOS атаках, либо отключить nf_conntrack если он не нужен и сервер не используется для NAT, например изменим некоторые timeout до таких значений (закомментированные строки я оставил без изменения):
net.netfilter.nf_conntrack_generic_timeout=60 net.netfilter.nf_conntrack_icmp_timeout=10 #net.netfilter.nf_conntrack_tcp_timeout_close=10 net.netfilter.nf_conntrack_tcp_timeout_close_wait=20 net.netfilter.nf_conntrack_tcp_timeout_established=1800 net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30 #net.netfilter.nf_conntrack_tcp_timeout_last_ack=30 #net.netfilter.nf_conntrack_tcp_timeout_max_retrans=300 net.netfilter.nf_conntrack_tcp_timeout_syn_recv=30 net.netfilter.nf_conntrack_tcp_timeout_syn_sent=60 net.netfilter.nf_conntrack_tcp_timeout_time_wait=60 #net.netfilter.nf_conntrack_tcp_timeout_unacknowledged=300 #net.netfilter.nf_conntrack_udp_timeout=30 net.netfilter.nf_conntrack_udp_timeout_stream=60
Еще документация:
https://www.kernel.org/doc/Documentation/networking/nf_conntrack-sysctl.txt
Смотрите также мои статьи:
Мониторинг nf_conntrack в Zabbix
Решение ошибки «nf_conntrack: table full, dropping packet»
Изменение gc_thresh
Как обнаружить DDOS атаки
Скрипт от DDOS