Linux ベースのルーター (Debian ディストリビューション) に多数の NIC があるとします。特定の NIC のオープン接続の数を出力するにはどうすればよいでしょうか? (回避策は許容される回答です)
答え1
オプション1
netstat | awk '$4 ~ /xxx.xxx.xxx.xxx/ { ++count } END { print count }'
どこxxx.xxx.xxx.xxxNIC の IP アドレスです。
netstat
開いている接続をすべて見つけますawk
NICのIPアドレスと一致する$4
awk
4列目を見ることになる{ ++count } END { print count }
awk
一致が見つかるたびにカウントアップするように指示します。完了したら、最終カウントを出力します。
オプション2
netstat | grep xxx.xxx.xxx.xxx -c
どこxxx.xxx.xxx.xxxNIC の IP アドレスです。
netstat
開いている接続をすべて見つけますgrep
NICのIPアドレスと一致する-c
grep
一致した数を印刷するのではなく、カウントするように要求します。
オプション 1 には、どこでもなくローカル アドレス フィールドのみに一致するという利点があります。オプション 2 では、リモート アドレスがローカルホストを指すオープン接続がある場合、カウントが 2 倍になる可能性があります。
答え2
できません。基本的な IP ルーターは、IP 層のみを参照して、ステートレスにデータグラムを転送するだけです。エンドポイントではない接続については何も知りません。
SPI ファイアウォールや NAT ゲートウェイの場合は話が別です。
答え3
ルーターは接続を追跡しません。ファイアウォールに問い合わせる必要があります。
Linux ファイアウォールはステートフルな「接続」追跡をサポートしていますが、必ずしもデフォルトでアクティブになっているわけではありません。もし次のいずれかに該当します:
-m state
またはを使用するiptablesルール-m conntrack
、- または、 を使用するnftablesルール
ct state
、 - またはiptables/nftables NATテーブル内の任意のルール(例:nat/preroutingチェーン)
ファイアウォールの conntrack システムはアクティブであり、次のコマンドを使用してその「状態テーブル」を確認できます。
conntrack -L
ただし、これはファイアウォール (ルータではない) によって実行されるため、状態は特定のインターフェースとは関係がなく、L3/L4 アドレス指定のみを考慮します。