【Linux】conntrackコマンド

◾️はじめに

conntrackコマンドってのを覚えたのでメモ。

目次

【1】conntrackコマンド
【2】環境設定
 1)使用可能か確認
 2)インストールする
【3】基本的な使い方
 1)コマンド例
【4】フィルタリング機能
 0)使用上の注意
 1)プロトコルで絞る
 2)TCP状態で絞る
 3)トラッキング状態で絞る

【1】conntrackコマンド

* コネクショントラッキング情報を取得するためのコマンド
 cf. ConnTrack = connection tracking

* Linuxのコネクショントラッキングを監視しているNetFilter経由で実装
 => iptablesも同様なので、密接に関わってくる(iptablesの詳細は以下の関連記事を参照)

iptablesコマンド
https://dk521123.hatenablog.com/entry/2025/03/18/003023

1)tcpdumpコマンドとの違い

関連記事

tcpdumpコマンド 〜 パケットキャプチャ 〜
https://dk521123.hatenablog.com/entry/2017/07/03/233336

で扱ったtcpdumpコマンドとの違いをGoogle先生(AI版)が答えてくれた

# 「生成 AI は試験運用中です。」だそうだが、
# どちらも通信やり取りを取得してくれるものだが、
# 取得の仕方(プロトコル)や意図が違うって理解すればいいのか?

詳細

tcpdumpはネットワーク上のパケットの内容を表示するコマンドで、
conntrackはコネクションの状態をトラッキングするツールです。

tcpdumpについて】

* コンピューターが接続されたネットワーク上のパケットの内容を表示するコマンド
* ネットワーク通信を行うソフトウェアの開発や、
 コンピュータや通信機器の設定の検証に利用される
* パケットキャプチャは、サービスアダプタがバックグラウンドで実行する
* 開始後24時間経過、またはキャプチャデータが1MBに達すると自動停止する
* キャプチャされるパケットの数を制限するには、-c(count)オプションを使用する

【conntrackについて】

* コネクションの接続状態をトラッキングするツール
* アドレスやTCPフラグではなく、コネクションのステートに基づいて
 パケットフィルタをかけることができる
* 例えば、TCP接続の最初のSYNが観測された時、
 そのパケットのステートはNEWと扱われる

【2】環境設定

1)使用可能か確認

# インストールされているか確認
conntrack --version

# firewalldサービスの状態がactiveであることを確認
systemctl is-active firewalld.service

2)インストールする

# yum の場合
$ sudo yum -y install conntrack-tools

# apt の場合
$ sudo apt update
$ sudo apt install conntrack conntrackd

【3】基本的な使い方

* (もちろん設定によるが、デフォルトだと恐らく)
  root権限相当が出ないと実行できない
* 全てのオプションに関しては、以下のサイトを参照。

https://manpages.debian.org/jessie/conntrack/conntrack.8.en.html

Options Explanations
-E リアルタイム表示
-L 管理テーブルのトラッキング情報を表示
-o timestamp 時間表示

1)コマンド例

# -E : リアルタイム表示
conntrack -E

    [NEW] tcp      6 301 ESTABLISHED src=192.168.122.1 dst=192.168.122.216 sport=57780 dport=22 [UNREPLIED] src=192.168.122.216 dst=192.168.122.1 sport=22 dport=57780
 [UPDATE] tcp      6 300 src=192.168.122.1 dst=192.168.122.216 sport=57780 dport=22 src=192.168.122.216 dst=192.168.122.1 sport=22 dport=57780
...

# + file出力
conntrack -E | tee track.log
# teeコマンド に関しては、以下の関連記事を参照の事

teeコマンド
https://dk521123.hatenablog.com/entry/2023/11/08/000000

# -L : 管理テーブルのトラッキング情報を表示
conntrack -L

tcp      6 118 TIME_WAIT src=192.168.1.12 dst=192.168.1.9 sport=3311 dport=5678 src=192.168.1.9 dst=192.168.1.12 sport=5678 dport=3579 [ASSURED] mark=0 use=1
...

【4】フィルタリング機能

使えばすぐ分かるが、めちゃくちゃログが飛んでくるので
絞り込みたい、そんな時のための機能。
 => grepコマンドも併用すれば、ある程度欲しい情報が拾えそう

grep / egrep / fgrepコマンド
https://dk521123.hatenablog.com/entry/2017/08/06/213100

Options Explanations
-p プロトコルで絞る (e.g. -p tcp)
--sport/--dport 送信元・送信先ポート番号で絞る (「0)使用上の注意」参照)
-s 送信元IPアドレスを指定して絞る
--status TCP状態で絞る (e.g. --status ASSURED。「0)使用上の注意」参照)
-e ラッキング状態で絞る

0)使用上の注意

「--sport/--dport <PORT>」や「--status <TCPStatus>」などのいくつかオプションは、
「-p <protocol (e.g. tcp/udp)>」と併用して使う必要がある

 => 単体では使えないものもあるってことも頭の隅に入れといてもらえたら
 => 以下のDebianの公式ドキュメント?を参照

https://manpages.debian.org/jessie/conntrack/conntrack.8.en.html

使用例:--dport / --status

conntrack -E -p tcp --dport 8080 --status TIME_WAIT

1)プロトコルで絞る

# -p <protocol> : プロトコルで絞る
conntrack -E -p tcp

# 他にも「-p udp」「-p icmp」

2)TCP状態で絞る

conntrack -E -p tcp --status LAST_ACK

# -u, --status [ASSURED|SEEN_REPLY|FIXED_TIMEOUT|EXPECTED|UNSET][,...]
# また、上記「0)使用上の注意」も参照

About TCP status

* 以下のサイトの遷移図を含めて、軽く頭に入れておいた方がいいかも

https://qiita.com/mogulla3/items/196124b9fb36578e5c80

TCP status Jp Explanations
SYN_SENT SYN送信済 コネクション要求の送信を終え、応答確認と対応するコネクション要求待
SYN_RECV SYN受信済 同期(SYN)セグメントを受信し、対応する同期(SYN/ACK)セグメントを送って、コネクション応答確認待
ESTABLISHED 確立済 コネクションが開かれ、データ転送が行える状態
FIN_WAIT FIN待機 リモートホストからの終了要求待
CLOSE_WAIT 閉鎖待機 アプリケーションプロセスからのコネクション終了要求待
LAST_ACK 最終ACK リモートホストに送ったコネクション終了要求について、TCPモジュールがその応答確認待
TIME_WAIT 時間待機 コネクション終了要求応答確認をリモートホストが確実に受取るのに必要な時間が経過するまで待機状態
CLOSE 閉鎖 コネクションは全く存在せず、確立段階にも入っていない状態
LISTEN 聴取 リモートホストからのコネクション要求待

3)トラッキング状態で絞る

conntrack -E -p tcp -e NEW

# -e, --event-mask [ALL|NEW|UPDATES|DESTROY][,...]
Status Explanations
NEW 管理テーブルにトラッキング情報が初めて登録された場合
UPDATES 管理テーブルのトラッキング情報が更新された場合
UNREPLIED 一方向にしか通信がない場合(e.g. udp
ASSURED 双方向に通信が発生した場合
DESTROY 管理テーブルからトラッキング情報が消去された場合

参考文献

https://hana-shin.hatenablog.com/entry/2022/06/21/215757
https://turgenev.hatenablog.com/entry/2024/03/03/171152

 関連記事

ネットワーク系コマンド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2016/07/27/214633
ネットワーク系コマンド ~ firewall編 ~
https://dk521123.hatenablog.com/entry/2025/03/17/005508
iptablesコマンド
https://dk521123.hatenablog.com/entry/2025/03/18/003023
tcpdumpコマンド 〜 パケットキャプチャ 〜
https://dk521123.hatenablog.com/entry/2017/07/03/233336
Wireshark ~パケットキャプチャ~
https://dk521123.hatenablog.com/entry/2013/04/18/234813
grep / egrep / fgrepコマンド
https://dk521123.hatenablog.com/entry/2017/08/06/213100
teeコマンド
https://dk521123.hatenablog.com/entry/2023/11/08/000000
外部サイトに繋がらなかった場合のトラブルシュート
https://dk521123.hatenablog.com/entry/2017/10/13/231826
ファイルの内容を表示するコマンド
https://dk521123.hatenablog.com/entry/2016/08/08/235934
ファイル内容を操作するコマンド
https://dk521123.hatenablog.com/entry/2023/07/26/000000
パフォーマンスに関わるコマンド
https://dk521123.hatenablog.com/entry/2015/02/21/112554
バックグラウンド関連のコマンド
https://dk521123.hatenablog.com/entry/2020/01/30/000000
定期実行するためのコマンド
https://dk521123.hatenablog.com/entry/2017/12/31/000300
ログバックアップを考える & 簡易スクリプトの作成
https://dk521123.hatenablog.com/entry/2015/04/29/161341
時間/日付/タイムゾーン関連のコマンド
https://dk521123.hatenablog.com/entry/2018/02/05/215000