centos 상자에서 tcp 연결을 덤프하고 싶습니다-서버가 특정 IP로 요청을 보내려고하는지 확인하고 싶습니다. 일반적으로 tcpdump는 트릭을 수행하지만 tcpdump는 설치되지 않으며 소프트웨어 설치는 옵션이 아닙니다 (회사 정책 때문에). netstat가 단일 요청을 표시하지 않을까 걱정됩니다.
그래서 내가 가지고있는 다른 옵션이 궁금합니다. 서버에서 루트 액세스 권한이 있습니다.
centos 상자에서 tcp 연결을 덤프하고 싶습니다-서버가 특정 IP로 요청을 보내려고하는지 확인하고 싶습니다. 일반적으로 tcpdump는 트릭을 수행하지만 tcpdump는 설치되지 않으며 소프트웨어 설치는 옵션이 아닙니다 (회사 정책 때문에). netstat가 단일 요청을 표시하지 않을까 걱정됩니다.
그래서 내가 가지고있는 다른 옵션이 궁금합니다. 서버에서 루트 액세스 권한이 있습니다.
답변:
확실히 당신은 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)
일치하는 IP 주소를 제공하는 "GOT TARGET"과 함께 종료됩니다. TCP는 핸드 셰이크 중에 무언가를 다시 보내야하기 때문에 특정 대상 주소에서 무엇이든 잡아야합니다. 프로토콜이 TCP인지 UDP인지는 상관하지 않습니다 (확인하지 않아도됩니다).
대상 및 인터페이스를 변경하는 것을 잊지 마십시오.
socket.error: (1, 'Operation not permitted')
정말 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
입니다. 그렇습니다. 이것들은 소프트웨어이지만 더 필수적인 유틸리티 라고 생각합니다 . 사실, 그들은 문제없이 설치하거나로드 일시적으로 시스템에 제거 될 수있는 유틸리티입니다 (이동식 미디어는 옵션입니다? ... 힌트 )
그러나 요점은 회사 정책에 대한 문제 해결 방법이이 사용 사례에 대한 승인을 얻는 것보다 더 많은 노력이 필요하다는 것입니다.
tcpdump
다른 곳에서 정적으로 링크 된 컴파일을 할 수없고 , / tmp로 복사 한 다음 거기서 실행할 수 있습니까?
카일은 몇 가지 훌륭한 옵션을 제공했습니다. 하나 더 사용하는 것입니다 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