🤢

nf_conntrack とはなんぞ

2020/11/16に公開

概要

自社のkubernetesクラスタでnf_conntrackの問題をよく聞くようになったので気になって調べた。
iptablesではfiltering処理をする際に、nf_conntrackというオブジェクトを作成する。
カーネル空間に作られるので脳死でmax値を増やすと死ぬ。

調べるきっかけ

ubernetesでは、pod間通信を実現するための一つにiptablesを使用しています。
自社ではそれなりのクラスタ規模になっているので、coreDNSでiptablesのfilteringが処理される際にnf_conntrackのエラーが出ることがありました。

nf_conntrack: table full, dropping packet

nf_conntrack とは

  • Linuxのiptablesでパケットをfilteringする際に生成されるオブジェクト
  • カーネル空間に作成されるので、スワップアウトできない
  • オブジェクトのサイズはカーネルにより異なるが、200 ~ 400 ぐらいらしい

実際に見てみる

環境

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.7 LTS"
  • nf_conntrack オブジェクトサイズ
# grep conntrack /proc/slabinfo | grep -v expect | tr -s " " | cut -d" " -f4
320
# ls /proc/sys/net/netfilter
nf_conntrack_acct                   nf_conntrack_events                        nf_conntrack_sctp_timeout_heartbeat_sent     nf_conntrack_tcp_timeout_max_retrans
nf_conntrack_buckets                nf_conntrack_expect_max                    nf_conntrack_sctp_timeout_shutdown_ack_sent  nf_conntrack_tcp_timeout_syn_recv
nf_conntrack_checksum               nf_conntrack_generic_timeout               nf_conntrack_sctp_timeout_shutdown_recd      nf_conntrack_tcp_timeout_syn_sent
nf_conntrack_count                  nf_conntrack_helper                        nf_conntrack_sctp_timeout_shutdown_sent      nf_conntrack_tcp_timeout_time_wait
nf_conntrack_dccp_loose             nf_conntrack_icmp_timeout                  nf_conntrack_tcp_be_liberal                  nf_conntrack_tcp_timeout_unacknowledged
nf_conntrack_dccp_timeout_closereq  nf_conntrack_log_invalid                   nf_conntrack_tcp_loose                       nf_conntrack_timestamp
nf_conntrack_dccp_timeout_closing   nf_conntrack_max                           nf_conntrack_tcp_max_retrans                 nf_conntrack_udp_timeout
nf_conntrack_dccp_timeout_open      nf_conntrack_sctp_timeout_closed           nf_conntrack_tcp_timeout_close               nf_conntrack_udp_timeout_stream
nf_conntrack_dccp_timeout_partopen  nf_conntrack_sctp_timeout_cookie_echoed    nf_conntrack_tcp_timeout_close_wait          nf_log
nf_conntrack_dccp_timeout_request   nf_conntrack_sctp_timeout_cookie_wait      nf_conntrack_tcp_timeout_established         nf_log_all_netns
nf_conntrack_dccp_timeout_respond   nf_conntrack_sctp_timeout_established      nf_conntrack_tcp_timeout_fin_wait
nf_conntrack_dccp_timeout_timewait  nf_conntrack_sctp_timeout_heartbeat_acked  nf_conntrack_tcp_timeout_last_ack
  • nf_conntrack_count
# cat /proc/sys/net/netfilter/nf_conntrack_count
11817
  • nf_conntrack_max
# cat /proc/sys/net/nf_conntrack_max
262144

nf_conntrack: table full, dropping packet の対処方法

  1. max値を増やせばおk
  2. その後設定を反映
sudo /sbin/sysctl -p

※ nf_conntrackのオブジェクトごとにカーネル空間のメモリを使用するので、ある程度キャパプラしてから増やしましょう

参考

Discussion