tcpdump없이 tcp 연결 덤프


17

centos 상자에서 tcp 연결을 덤프하고 싶습니다-서버가 특정 IP로 요청을 보내려고하는지 확인하고 싶습니다. 일반적으로 tcpdump는 트릭을 수행하지만 tcpdump는 설치되지 않으며 소프트웨어 설치는 옵션이 아닙니다 (회사 정책 때문에). netstat가 단일 요청을 표시하지 않을까 걱정됩니다.

그래서 내가 가지고있는 다른 옵션이 궁금합니다. 서버에서 루트 액세스 권한이 있습니다.


서버에서 루트 액세스 권한이 있습니까?
user9517 2016 년

예, 루트 액세스 권한이 있습니다.
Isaac Isaac

11
회사 정책을 수정하는 작업도해야합니다. 업무 수행을 중단하면 정책이 위반됩니다.
Michael Hampton

1
글쎄, 변경 통제는 기본적으로 FDA의 요구 사항입니다-그래서 나는이 인생에서 아무것도 바꿀 것이 없습니다 :)
Isaac

답변:


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)

일치하는 IP 주소를 제공하는 "GOT TARGET"과 함께 종료됩니다. TCP는 핸드 셰이크 중에 무언가를 다시 보내야하기 때문에 특정 대상 주소에서 무엇이든 잡아야합니다. 프로토콜이 TCP인지 UDP인지는 상관하지 않습니다 (확인하지 않아도됩니다).

대상 및 인터페이스를 변경하는 것을 잊지 마십시오.


tcp syn 패킷을 잡기 위해 어떻게 이것을 수정 하시겠습니까? 대상에 도달 할 수없는 경우 시도했지만 실패한 연결이 표시되지 않습니다.
Isaac

3
이 스크립트는 새로운 소프트웨어가 아니므로 시스템에 설치되지 않아야합니까?
Vi.

이러한 논리를 가진 @Vi는 모든 쉘 스크립트가 '새로운 소프트웨어'라고 주장 할 수 있습니다. '소프트웨어'를 정의하는 방법에 따라 다릅니다.
Matthew Ife

1
-1 죄송합니다. 이것은 끔찍한 해결책입니다. 기관총으로 닭을 죽일뿐만 아니라 (이미 해결책이있는 프로그램을 작성하는) 무한 루프가 불필요하게 CPU 리소스를 소비합니다 (파이썬 프로세스에서 strace를 실행하십시오 ... Control-C 키!), 사용자의 질문을 제대로 해결하지 못함 : 수신 및 발신 TCP 연결 모두에 대해 "GOT TARGET"으로 응답합니다 (사용자는 "요청을 보내려고합니다 ..."). 마지막으로 성공하면 1 (쉘 실패를 나타냄)로 종료됩니다.
Mike S

1
매우 시원하지만 여전히 높은 권한이 필요합니다. 나는 얻었다socket.error: (1, 'Operation not permitted')
Grant Bowman

17

정말 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

1
그것이 내가 바라는 일종의 대답이었습니다. 불행히도 strace도 설치되지 않았습니다 : /
Isaac

나는 lsof를하려고합니다
이삭

1
원래 포스터가 답장을 좋아 한 것 같지만 이상하게도 그의 질문에 대답하지는 않습니다 ( "... tcp 연결-서버가 특정 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입니다. 그렇습니다. 이것들은 소프트웨어이지만 더 필수적인 유틸리티 라고 생각합니다 . 사실, 그들은 문제없이 설치하거나로드 일시적으로 시스템에 제거 될 수있는 유틸리티입니다 (이동식 미디어는 옵션입니다? ... 힌트 )

그러나 요점은 회사 정책에 대한 문제 해결 방법이이 사용 사례에 대한 승인을 얻는 것보다 더 많은 노력이 필요하다는 것입니다.


올바른 업무에 적합한 도구를 사용하는 데 전적으로 동의합니다. 실제로 소프트웨어를 설치할 수 있지만 변경 제어를 사용해야하므로 프로세스에 며칠이 걸립니다. 지금 덤프가 필요했기 때문에 설치가 옵션이 아니 었습니다. 내가 생각하지 않은 몇 가지 옵션을 간과했는지 궁금합니다.
Isaac Isaac

:( 변경 관리에 대해. 정치 게임을하고 덤프로부터 혜택을받는 사람 / 당사자가 변경 관리 프로세스를 신속하게 추적 할 수있는 방법이 있습니까?
ewwhite

1
나는 두려워하지 않지만 변경 관리와 tcpdump를 필요로하는 고객이기 때문에 사실을 받아 들여야합니다. 어쨌든 그를 행복하게 해주길 바랐습니다.
Isaac Isaac

3
@ewwhite : 모든 훌륭한 변경 관리 정책은 특정 또는 클래스의 변경이 전체 프로세스를 거치지 않도록 면제 할 수 있어야합니다. 그렇지 않다면 ...
Scott Pack

2
tcpdump다른 곳에서 정적으로 링크 된 컴파일을 할 수없고 , / tmp로 복사 한 다음 거기서 실행할 수 있습니까?
che

5

카일은 몇 가지 훌륭한 옵션을 제공했습니다. 하나 더 사용하는 것입니다 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를 스스로 생각하고 있었지만 설치되지 않았습니다 : /. 어쨌든, 좋은 해결책.
Isaac Isaac

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.DIPv4 주소를 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.