web-dev-qa-db-ja.com

自分のマシンからのすべての発信要求/接続を監視するにはどうすればよいですか?

私のマシンはサーバーなので、サーバーへの接続(たとえば、誰かが私のWebサイトにアクセスしたとき)を無視したいと思います。 onlyサーバーから他の場所への接続/要求が行われるのを見たい。

onlyこれらの発信接続はどのように表示されますか?

編集:私はこれらのタイプのものに新しいです。私がやろうとしていることは、私のWebアプリのデータ以外にサーバーから何かが送信されているかどうかを確認することだけです。たとえば、誰かが私のウェブサイトを訪問した場合、明らかに私のサーバーはクライアントのブラウザにデータを送信します。しかし、私のウェブアプリのフレームワークのどこかに、統計データを知らない他の場所に送信するコードもあるとします。サーバーがデータを送信している場所があれば、それを確認したいのですが。おそらくそうではないかもしれませんが、自分で記述していないphpまたはnodejsフレームワークを使用することにしたとしましょう。あるタイプのデータをどこかに送信する可能性はわずかです。もしそうなら、それは私が見てみたいものです。

80
trusktr

netstatを使用します。例えば

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

すべてのUDP(u)、TCP(t)、およびRAW(w)の発信接続(lまたはaを使用しない)を数値形式(n、長時間実行されるDNSクエリを防ぐ)でリストし、それに関連付けられたプログラム(p)が含まれます。

cオプションを追加して、出力が継続的に更新されるようにすることを検討してください。

83
gertvdijk

すべての接続試行をログに記録するだけの場合は、おそらくLinux(またはシステムの同等のファイアウォールログ機能)のiptablesLOGターゲットが最も簡単です。

接続の継続時間や両方向で交換されるデータ量などの詳細情報が必要な場合は、conntrackd(Linuxの場合)がおそらく最適なオプションです。

ただし、上記の2つはnetfilterを通過するトラフィックのみをログに記録します。これは通常すべてのトラフィックですが、ユーザー空間のIPスタックで生成されたトラフィック(仮想マシンまたはrawソケットを使用するものなど)またはブリッジされたトラフィックは考慮しません。

より一般的なソリューションについては、argusbro-idssancpまたはntopのようなものを調べて、それらが盗聴するトラフィックに基づいてあらゆる種類の情報をログに記録することができますインターフェイス上。

12

iftopntopiptraf、そしてもちろん非常に便利な組み込みnetstat -tupln(サポートされているオプションはOS -依存)、しかし私のユースケースで最も実用的なのはnethogsであることが判明しました-接続を集約します元のアプリによってであり、すべてのノイズが最も少ないです。

経由でインストール可能:

Sudo apt-get install nethogs

ルートとして実行:

Sudo nethogs

目的が、すべてのTCPすべてのアプリによって開始された接続を確認することである場合、次を使用できます。

Sudo tcpdump -i lo -A | grep Host:
11
ccpizza

あなたがやりたいことは、リスニングポートのリストを取得し、他のポートからそれらを削除することですTCP接続、それからすべての発信接続になります。ss(ソケットステータス)コマンド「Local Address:Port」列と「Peer Address:Port」列を出力します。「Peer Address:Port」列ではなく、「Local Address:Port」列からリスニングポートを削除する必要があります。そうしないと、送信接続が失われる可能性があります。 。それを実現するには、grepの ":$ port"文字列の後ろに_\s{2}+_を使用して、 "Local Address:Port"列の後ろにあるスペースに一致させます。その列には2つ以上の空白がありますその後ろに、「Peer Address:Port」に1つのスペースと改行があります(grrr ...改行、IMOだけが必要です。そうすれば、_\s+_ではなく_\s{2}+_を使用できます。)通常、私はss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>のようにssのフィルタリング機能を使用しようとするかもしれませんが、その文字列の長さに制限があるようです。多くのリスニングポート。だから私は同じことをgrepでやろうとしています。私は以下がうまくいくと信じています:

_FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"
_

これは、使用しているssのバージョンによって異なります。古いバージョン(ssユーティリティ、iproute2-ss111117など)の出力形式は異なるため、awkで$ 4ではなく$ 3を使用する必要がある場合があります。 _ss -tln_と_ss -tn state listening_は異なる出力を提供することにも注意してください。これは私には少し直観に反しています。 YMMV。

ホストのIPを知る必要がない、もう少しエレガントなソリューションを見つけました。_ss -tn state established dst :*_はうまく機能し、上記のコマンドラインを変更しました。

7
Dale

tcpdumpを使用すると、特定の基準に基づいてフィルタリングする機能を使用して、特定のインターフェースとの間でやり取りされるすべてのIPトラフィックを確認できます。 tcpdumpは通常、デフォルトでほとんどの* nixシステムにインストールされますが、通常、特定のディストリビューション用にそれを取得するためのポートがどこかにありません。

4
txtechhelp

netstatは適切なオプションです。必要に応じてパラメーターを使用してください(そのmanページを参照)。次に例を示します。

netstat -antup

ここでは、すべての(a)リスニング数値(n)tcp(t)およびudp(u)プロセス(p)を監視できます。

ssコマンドを試すこともできます。参照用:

SS Linux TCP/UDPネットワークおよびソケット情報

2
Kratos

Solarisまたはその派生物を実行している場合は、 conntrack を参照してください。

1
jlliagre