nf_conntrack full로 인한 Packet Drop 대응
안녕하세요, 네이버 클라우드 플랫폼입니다.
네이버 서비스의 다양한 인프라를 운영하다 보면 예상치 못한 트래픽으로 여러 가지 이슈들이 발생하기 마련입니다.
오늘은 대규모 미디어 서비스시 발생할 수 있는
‘nf_conntrack full로 인한 Packet Drop’ 대응 방법을 공유합니다!
배경
서비스에 대규모 트래픽이 발생하여 L4로 묶여있는 특정 서버 그룹의 서버 1대에서 네트워크 순단이 발생, 특정 시스템에 장애를 유발할 수 있는 상황
이슈 원인
nf_conntrack:table full, dropping packet
* conntrack이란?
- iptables의 상태추적 모듈로 NAT 테이블, FTP 등과 관련이 있는 모듈입니다.
- netfilter가 네트워크에서 발생하는 커넥션에 대해 해당 내용들을 기록하고 추적하기 위한 모듈입니다.
nf_conntrack이 활성화되어있을 경우, 커넥션 상태에 대해서 일정 시간(nf_conntrack_tcp_timeout_established : default 432000초(5일))동안 기억하게 됩니다.
일반적으로는 활성화되지 않지만, iptables를 이용한 NAT 테이블 명령이나, iptables의 NAT 기능이 필요한 어플리케이션(ex: docker)이 실행될 경우 활성화됩니다.
nf_conntrack 모듈이 활성화된 상태에서 연결을 기록하는 table의 크기를(default: 65536) 초과할 경우, 그 이후 수신되는 packet들은 drop되게 됩니다.
서버들의 리소스 가용량이 충분하였음에도, 중계 시작 시점 즈음 사용자들의 요청이 몰리며 해당 모듈이 올라간 서버 1대에서 nf_conntrack의 기본 table의 크기를 초과하게 되어 packet이 드랍되었습니다.
확인 방법
- nf_conntrack module 확인
#lsmod | grep nf_conntrack
2. conntrack table 최대 크기 확인
#cat /proc/sys/net/nf_conntrack_max
3. nf_conntrack 현재 접속 카운트
#watch -d cat /proc/sys/net/netfilter/nf_conntrack_count
대응 방안
일반적으로 이를 해결하기 위한 방법으로는 conntrack의 table 최대 값을 수정하는 방법 또는 nf_conntrack(ip_conntrack) 모듈을 unload하는 방법이 있습니다.
1. conntrack table의 최대 값을 수정하는 방법
echo “원하는 최대치 값” > /proc/sys/net/nf_conntrack_max
또는
sysctl.conf의 하단에 net.nf_conntrack_max = 원하는 최대치 값
저장 후 sysctl -p로 적용
2. nf_conntrack 모듈 unload 방법
iptables stop 이후, iptables rule 중에 state 구문이 들어가는 rule을 삭제하고
rmmod nf_conntrack
위와 같은 방법을 통해 시스템 장애를 미리 감지하여 대응할 수 있었고, 해당 서비스를 큰 이슈 없이 평화롭게 운영할 수 있었습니다!