nf_conntrack_count가 nf_conntrack_max보다 훨씬 적은 경우에도 "nf_conntrack: 테이블이 꽉 찼고 패킷 삭제" 발생

nf_conntrack_count가 nf_conntrack_max보다 훨씬 적은 경우에도 "nf_conntrack: 테이블이 꽉 찼고 패킷 삭제" 발생

우리 클러스터에는 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_maxand 를 사용했습니다.sysctl net.netfilter.nf_conntrack_count

관련 정보