CentOSボックスでは、TCP接続をダンプするのが好きです。サーバーが特定のIPにリクエストを送信しようとしているかどうかを確認したいと思います。通常、tcpdumpで問題は解決しますが、tcpdumpはインストールされておらず、ソフトウェアのインストールはオプションではありません(会社のポリシーのため)。netstatが単一の要求を表示しないのではないかと思います。
だから、他にどんな選択肢があるのかと思っていました。サーバーにrootアクセスがあります。
CentOSボックスでは、TCP接続をダンプするのが好きです。サーバーが特定のIPにリクエストを送信しようとしているかどうかを確認したいと思います。通常、tcpdumpで問題は解決しますが、tcpdumpはインストールされておらず、ソフトウェアのインストールはオプションではありません(会社のポリシーのため)。netstatが単一の要求を表示しないのではないかと思います。
だから、他にどんな選択肢があるのかと思っていました。サーバーにrootアクセスがあります。
回答:
確かにあります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を変更することを忘れないでください。
socket.error: (1, 'Operation not permitted')
私は本当に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
Iptablesにはデバッグ機能があり、トラフィック分析にも使用できます。
ソリューションは、以下のURLで説明されています。
また、次の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)
仕事をするために特定のソフトウェアが必要で、許可されていない場合、良いビジネスケースを作成していないか、アイデアを適切な人に売っていないか、このシステムを制御できていません。 。
この場合に必要なデバッグ/トラブルシューティング情報が必要な場合は、適切なツールを使用します。tcpdump
またはそうtshark
です。はい、それらはソフトウェアの一部ですが、私はそれらをより重要なユーティリティとみなします。実際、これらは一時的にシステムにインストールまたはロードし、問題なく削除できるユーティリティです(リムーバブルメディアはオプションですか?... ヒント)
しかし、ポイントは、会社のポリシーに対するジャンキーな回避策は、おそらくこのユースケースの承認を得るよりも多くの労力を要するということです。
tcpdump
他の場所に静的にリンクされたものをコンパイルして、/ tmpにコピーしてそこから実行することはできませんか?
カイルはいくつかの素晴らしいオプションを提供しました。もう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
ただし、とは異なり、パケットの完全なコンテンツは記録されず、パケットヘッダーのコンテンツのみが記録されます。
あなたのサーバーは特定の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