В этой статье я приведу пример оптимизации параметров 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=600
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
Чтобы применить изменения в файле /etc/sysctl.conf, выполним команду:
sysctl -p
Еще документация:
https://www.kernel.org/doc/Documentation/networking/nf_conntrack-sysctl.txt
Смотрите также мои статьи:
- Мониторинг nf_conntrack в Zabbix
- Как отключить conntrack в Linux
- Увеличение диапазона портов net.ipv4.ip_local_port_range
- Решение ошибки «nf_conntrack: table full, dropping packet»
- Сообщения net_ratelimit: X callbacks suppressed
- Изменение gc_thresh
- Как обнаружить DDOS атаки
- Скрипт от DDOS