우리 클러스터에는 syslog에 "nf_conntrack: 테이블이 꽉 찼습니다. 패킷 삭제" 메시지가 많이 표시되는 노드가 있습니다. nf_conntrack_count를 확인했는데 nf_conntrack_max에 대해 바로 실행되고 있었습니다. 테이블을 살펴보면 대부분의 항목이 DNS 요청이라는 것을 알았으므로 이러한 규칙을 "원시" netfilter 테이블에 추가했습니다.
$ sudo iptables -t raw -vnL
Chain PREROUTING (policy ACCEPT 146M packets, 19G bytes)
pkts bytes target prot opt in out source destination
33M 4144M CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53 CT notrack
33M 2805M CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 CT notrack
Chain OUTPUT (policy ACCEPT 73M packets, 8311M bytes)
pkts bytes target prot opt in out source destination
10785 882K CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 CT notrack
0 0 CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53 CT notrack
그 결과 개수는 약 13000 정도가 되었고 nf_conntrack_max는 65535로 설정되었습니다. 그러나 여전히 삭제된 패킷 메시지가 계속 나타납니다. 나머지 패킷의 대부분은 UDP이며 nf_conntrack_udp_timeout을 1초 정도로 낮게 설정하여 nf_conntrack_count를 1000 정도로 남겨 두었습니다. 그러나 여전히 삭제된 압축 메시지가 나타납니다.
여기에서 최대값을 높이면 삭제된 패킷 메시지가 중지되지만 이것이 필요한 이유는 알 수 없습니다.
나는 docker를 실행 중이고 elasticsearch 컨테이너가 있습니다(이 문제는 elasticsearch를 실행하는 노드에서 발생하는 것 같습니다). 관련이 있는지 확실하지 않지만 노드에는 48개의 코어가 있습니다.
$ uname -a
Linux qtausc-pphd0128 3.19.0-26-generic #28~14.04.1-Ubuntu SMP Wed Aug 12 14:09:17 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
그렇다면 개수가 최대값보다 훨씬 작을 때 패킷이 삭제되는 이유는 무엇입니까?
답변1
나는 Squid 시스템에서 얼마 전에 같은 문제를 겪었습니다.
conntrack의 크기를 줄이기 위해 제가 찾은 가장 효과적인 방법 중 하나는 커널의 기본 TCP 시간 초과를 줄이는 것이었습니다.
net.netfilter.nf_conntrack_tcp_timeout_established
기본적으로 432000으로 설정되어 있습니다 . 그렇군요...5일이네요.
값을 설정하려면 다음 명령을 실행할 수 있습니다.
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=X
그리고 해당 변경 사항이 지속되도록 하려면 에 해당 행을 추가해야 합니다 /etc/sysctl.conf
.
해당 값을 600으로 줄인 후 conntrack 수는 며칠 동안 꾸준히 감소했습니다.
나는 값을 얻기 위해 sysctl net.netfilter.nf_conntrack_max
and 를 사용했습니다.sysctl net.netfilter.nf_conntrack_count