web-dev-qa-db-ja.com

tcpdumpなしでtcp接続をダンプする

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

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

17
Isaac

確かに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を変更することを忘れないでください。

15
Matthew Ife

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

strace:

[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
17
Kyle Brandt

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)
15
John Auld

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

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

しかし、要点は、企業のポリシーに対する厄介な回避策は、おそらくこの使用例の承認を得るよりも多くの努力を要するということです。

8
ewwhite

カイルはいくつかの素晴らしいオプションを提供しました。もう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とは異なり、パケットの完全な内容は記録されず、パケットヘッダーの内容のみが記録されます。

5

サーバーが特定の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
3
Mike S