tcpdumpを使用せずにtcp接続をダンプする


17

CentOSボックスでは、TCP接続をダンプするのが好きです。サーバーが特定のIPにリクエストを送信しようとしているかどうかを確認したいと思います。通常、tcpdumpで問題は解決しますが、tcpdumpはインストールされておらず、ソフトウェアのインストールはオプションではありません(会社のポリシーのため)。netstatが単一の要求を表示しないのではないかと思います。

だから、他にどんな選択肢があるのか​​と思っていました。サーバーにrootアクセスがあります。


サーバーにrootアクセスがありますか?
user9517 14年

はい、ルートアクセス権があります。
アイザック14年

11
また、会社のポリシーの修正に取り組む必要があります。それがあなたの仕事をするのを止めると、ポリシーは壊れます。
マイケルハンプトン

1
さて、変更管理は基本的にFDAの要件です。したがって、私はこの人生で何も変更しません:)
アイザック14年

回答:


15

確かにありますpythonか?

from socket import * 
from struct import unpack 
import sys 

INTERFACE = "eth0"
TARGET = "8.8.8.8" 

if __name__ == "__main__": 
  sock = socket(AF_PACKET, SOCK_DGRAM, 0x0800) 
  sock.bind((INTERFACE, 0x0800)) 
  while True: 
    data = sock.recvfrom(1500, 0)[0] 
    ip = inet_ntop(AF_INET, data[12:16]) 
    if ip == TARGET: 
      print "GOT TARGET" 
      sys.exit(1)

これは、「GOT TARGET」で終了し、一致するIPアドレスを返します。TCPはハンドシェイク中に何かを返送する必要があるため、特定のターゲットアドレスからのすべてをキャッチする必要があります。ただし、プロトコルがTCPかUDPかは関係ありません(チェックもしません)。

TARGETとINTERFACEを変更することを忘れないでください。


これをどのように変更して、tcp synパケットもキャッチしますか?ターゲットが到達可能でない場合、試行されたが失敗した接続は表示されないためです。
アイザック14年

3
このスクリプトは新しいソフトウェアではありませんか(システムにインストールされません)?
Vi。

@Viはそのロジックを使用して、すべてのシェルスクリプトが「新しいソフトウェア」であると主張できます。「ソフトウェア」の定義方法によって異なります。
マシューイフェ14年

1
-1申し訳ありませんが、これはひどい解決策です。マシンガンで鶏を殺す(すでに解決策があることをするプログラムを書く)だけでなく、それは無限ループです-不必要にCPUリソースを消費します(Pythonプロセスでstraceを実行します... Control-Cキー!)、ユーザーの質問を適切に解決できません:着信TCP接続と発信TCP接続の両方に「GOT TARGET」に応答します(ユーザーは「要求を送信しようとします...」を要求しました)。最後に、成功すると1(シェルへの失敗を示す)で終了します。
マイクS

1
非常にクールですが、これにはまだ高い権限が必要です。私が得たsocket.error: (1, 'Operation not permitted')
グラントボウマン

17

私は本当にtcpdumpを取得しようとします。そうは言っても、IPに特定の接続が存在するかどうかを確認するいくつかの選択肢は次のとおりです。

痕跡:

[kbrandt@ny-kbrandt01: ~] strace -e trace=network nc 1.2.3.4 1234
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress)

lsof:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11434
[kbrandt@ny-kbrandt01: ~] lsof -p 11434
....
nc      11434 kbrandt    3u  IPv4 4543149      0t0     TCP 10.7.0.78:58886->1.2.3.4:search-agent (SYN_SENT)

netstat:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11486
[kbrandt@ny-kbrandt01: ~] sudo netstat -a -p | grep 11486
tcp        0      1 10.7.0.78:58891             1.2.3.4:search-agent        SYN_SENT    11486/nc

1
それは私が望んでいた種類の答えでした。残念ながらstraceもインストールされていません:/
Isaac 14年

私はlsof
アイザック14年

1
元のポスターは返信を好んだと思いますが、奇妙なことに、彼の質問には本当に答えていません( "... tcp connections-サーバーが特定のIPにリクエストを送信しようとするかどうかを確認したい...)。特定のプロセスのネットワーク接続情報を提供します...多分彼はそれを望んでいますか?あるマシンから次のマシンへのTCP接続に関する情報を探している私のような人にとっては、これはうまくいかないかもしれません。ネットワーク接続に関する情報を収集できるさまざまなシェルコマンドの例
Mike S

15

Iptablesにはデバッグ機能があり、トラフィック分析にも使用できます。

ソリューションは、以下のURLで説明されています。

Iptablesのデバッグルール

また、次のURLを読んで、選択したファイルへのトレース出力のログを設定することも価値があります。

http://backreference.org/2010/06/11/iptables-debugging/

このソリューションはtcpdumpに等しいとは考えませんが、Centosの最小インストールを使用して実行できます。tcpdumpはディスクの使用においてはるかに効率的であるため、ディスクがログでいっぱいにならないように注意する必要があります。不要な場合はログをオフにします。

スクリプトの基本テンプレートとして次を使用できます。

# Logging
log(){
SOURCE=a.b.c.d (IP address)
$IPT -A INPUT   -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "In: "
$IPT -A OUTPUT  -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Out: "
$IPT -A FORWARD -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Fw: "
$IPT -t nat -A POSTROUTING -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Nat: "
}
#log  (remove comment to enable)

trace(){
iptables -t raw -A PREROUTING -p tcp  -j TRACE
iptables -t raw -A OUTPUT     -p tcp  -j TRACE
}
#trace (remove comment to enable)

8

仕事をするために特定のソフトウェアが必要で、許可されていない場合良いビジネスケースを作成していないか、アイデアを適切な人に売っていない、このシステムを制御できていません。 。

この場合に必要なデバッグ/トラブルシューティング情報が必要な場合は、適切なツールを使用します。tcpdumpまたはそうtsharkです。はい、それらはソフトウェアの一部ですが、私はそれらをより重要なユーティリティとみなします。実際、これらは一時的にシステムにインストールまたはロードし、問題なく削除できるユーティリティです(リムーバブルメディアはオプションですか?... ヒント

しかし、ポイントは、会社のポリシーに対するジャンキーな回避策は、おそらくこのユースケースの承認を得るよりも多くの労力を要するということです。


適切なツールを適切な仕事に使用することに完全に同意します。実際、ソフトウェアをインストールできますが、変更管理を使用する必要があるため、プロセスには数日かかります-今すぐダンプが必要だったため、インストールはオプションではありませんでした。まだ考えていないオプションを見落としているのではないかと思っていました。
アイザック14年

:(変更管理についての変更管理プロセスを高速トラックに政治的なゲームをプレイし、ダンプの恩恵を受けるだろうと人々 /パーティーを取得する方法があります。?
ewwhite

1
私は恐れていません-しかし、変更管理とtcpdumpを必要とする顧客なので、彼は事実を受け入れなければなりません。とにかく彼を幸せにしたいと思っていました。
アイザック14年

3
@ewwhite:優れた変更管理ポリシーには、特定の変更またはクラスの変更を完全なプロセスから除外する機能が必要です。この1つはない場合....
スコットパック

2
tcpdump他の場所に静的にリンクされたものをコンパイルして、/ tmpにコピーしてそこから実行することはできませんか?
チェ14年

5

カイルはいくつかの素晴らしいオプションを提供しました。もう1つ使用することiptablesです。

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32
...
[james@server ~]$ sudo iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 105 packets, 35602 bytes)
 pkts bytes target  prot opt in  out  source      destination
   87 33484 LOG     all  --  *   *    0.0.0.0/0   1.2.3.4     LOG flags 0 level 4

これは基本的に会計規則です。トラフィックを明示的に許可または拒否しないため、OUTPUTチェーンのデフォルトポリシーが使用されます(デフォルトはACCEPT)。ただし、一致するパケットがあると、ルールのカウンターが増加します。

-j LOGオプションで、オプションでパケットに関する詳細を記録することもできます。

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG
...
[james@server ~]@ dmesg | grep 1.2.3.4 | tail -1
IN= OUT=eth0 SRC=192.168.1.1 DST=1.2.3.4 LEN=100 TOS=0x10 PREC=0x00 TTL=64 ...

ログはカーネルロギングファシリティに送られるため、Red Hatデリバティブでは/ var / log / messagesに、Debianデリバティブでは/var/log/kern.logに表示されます。またdmesg、示されているように、の出力に表示されます。tcpdumpただし、とは異なり、パケットの完全なコンテンツは記録されず、パケットヘッダーのコンテンツのみが記録されます。


私は自分でiptablesを考えていましたが、インストールされていませんでした:/。とにかく、素敵なソリューション。
アイザック14年

3

あなたのサーバーは特定のIPに接続しているので、あなたもあなたが知っているポートに接続すると思いますか?

いずれにせよ、netstatまたはssあなたが望むことをするように設計されています。どちらのコマンドでも同じことができます。

netstat -n -t | awk '{print $5}' | grep A.B.C.D:n
ss      -n -t | awk '{print $5}' | grep A.B.C.D:n

ここでA.B.C.D、IPv4アドレスをn 表し、サーバーがリモート側で接続しているポート番号を表します。例えば:

ss      -n -t | awk '{print $5}' | grep 10.137.54.22:3389

または、接続が確立されたことを知りたい場合:

ss      -n -t | awk '{print $5}' | grep -q 10.137.54.22:3389 && echo "CONNECTION MADE"

接続しようとしているポート番号がわからない場合、TCPはデータおよびACKパケットの会話の両側でポートを開くため、ジョブはより困難になります。その場合、単にIPアドレスをgrepして、接続が確立されたかどうかを示すことができます。

最後に、これをあなたの監視ツールとして使用するためにあなたの心のコンテンツにループすることができます:

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done

カーネル特権の昇格を必要とせずに監視する優れた方法。
グラントボウマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.