CentOSボックスでは、TCP接続をダンプしたい-サーバーが特定のIPにリクエストを送信しようとしたかどうかを確認したい。通常、tcpdumpでうまくいきますが、tcpdumpがインストールされておらず、ソフトウェアのインストールはオプションではありません(会社のポリシーのため)。 netstatが1つの要求を表示しないと思います。
だから私は他にどんな選択肢があるのかと思っていました。サーバーには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を変更することを忘れないでください。
私は本当に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
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
です。はい、それらはソフトウェアの一部ですが、私はそれらをもっと重要なユーティリティと見なします。実際、これらはシステムに一時的にインストールまたはロードされ、問題なく削除されるユーティリティです(リムーバブルメディアはオプションですか?...hint)
しかし、要点は、企業のポリシーに対する厄介な回避策は、おそらくこの使用例の承認を得るよりも多くの努力を要するということです。
カイルはいくつかの素晴らしいオプションを提供しました。もう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