🤢
nf_conntrack とはなんぞ
概要
自社の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
- nf_conntrack関連のファイル
各ファイルの説明はkernelのドキュメントにかかれています
https://github.com/torvalds/linux/blob/master/Documentation/networking/nf_conntrack-sysctl.rst
# 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 の対処方法
- max値を増やせばおk
- その後設定を反映
sudo /sbin/sysctl -p
※ nf_conntrackのオブジェクトごとにカーネル空間のメモリを使用するので、ある程度キャパプラしてから増やしましょう
Discussion