問題 在系統日誌中(/var/log/messages),有時會看到大面積的下麵的報錯: nf_conntrack: table full, dropping packet 這說明系統接到了大量的連接請求,但是系統的連接跟蹤表已經滿了,無法再記錄新的連接了。這時候,系統會丟棄新的連接請求。 在 Ce ...
問題
在系統日誌中(/var/log/messages),有時會看到大面積的下麵的報錯:
nf_conntrack: table full, dropping packet
這說明系統接到了大量的連接請求,但是系統的連接跟蹤表已經滿了,無法再記錄新的連接了。這時候,系統會丟棄新的連接請求。
在 CentOS 下,預設的連接跟蹤表大小是 65536,可以通過下麵的命令查看:
cat /proc/sys/net/netfilter/nf_conntrack_max
如果流量比較小,這個值是沒問題的,但如果流量巨大,這個值可能就有點太小了。
解決方法
顯然,調大最大值的限制就可以了。不過更大的限制意味著可以承接更多連接,意味著要耗費更多資源,這點要註意。
查看當前有多少活躍連接:
cat /proc/sys/net/netfilter/nf_conntrack_count
如果這個值跟上面介紹的 nf_conntrack_max 已經很接近了,就說明快滿了,需要調大 nf_conntrack_max。可以使用下麵的命令臨時調大:
echo 524288 > /proc/sys/net/netfilter/nf_conntrack_max
如果不想每次重啟都要重新設置,可以修改 /etc/sysctl.conf,加入下麵的配置:
net.netfilter.nf_conntrack_max = 524288
為了緩解大量連接的問題,您可能還需要考慮減少伺服器等待連接關閉/超時的時間。在 /etc/sysctl.conf 中加入下麵的配置:
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 60
如何監控
平時使用 categraf(https://github.com/flashcatcloud/categraf) 監控就可以了,categraf 提供了 input.conntrack 採集插件,可以採集 conntrack 的信息,建議採集配置如下:
conf/input.conntrack/conntrack.toml:
files = [
"ip_conntrack_count",
"ip_conntrack_max",
"nf_conntrack_count",
"nf_conntrack_max"
]
dirs = [
"/proc/sys/net/ipv4/netfilter",
"/proc/sys/net/netfilter"
]
# ignore errors
quiet = true
完事配置一個類似下麵的監控規則即可:
conntrack_ip_conntrack_count / ip_conntrack_max > 0.8
另一個監控方案,是直接監控系統日誌,算是一個兜底監控方案,可以採用 catpaw 來監控,catpaw 提供了 journaltail 採集插件,可以讀取近期系統日誌,grep 關鍵字,如果出現異常關鍵字就告警,配置如下:
conf.d/p.journaltail/journaltail.toml:
[[instances]]
# journalctl -S -${time_span}
time_span = "1m"
# relationship: or
keywords = ["Out of memory", "nf_conntrack: table full, dropping packets"]
# check rule name
check = "Critical System Errors"
# # gather interval
interval = "30s"
[instances.alerting]
## Enable alerting or not
enabled = true
## Same functionality as Prometheus keyword 'for'
for_duration = 0
## Minimum interval duration between notifications
repeat_interval = "5m"
## Maximum number of notifications
repeat_number = 3
## Whether notify recovery event
recovery_notification = true
## Choice: Critical, Warning, Info
default_severity = "Warning"
catpaw 的入門使用,可以參考文章:《太捲了,史上最簡單的監控系統 catpaw 簡介》