다음과 같은 간단한 스크립트를 설정했습니다.
sshpass -p $password ssh -T $username@$ip_address -p 30007 <<- EOF > $save_file.pcap
sh
tcpdump -i eth5.1 -s 0 -n -v -U -w -
EOF
sed -i '1d' $save_file.pcap
이 스크립트의 목적은 출력을 내 로컬 컴퓨터의 파일에 저장하는 동안 원격 장치에서 tcpdump를 실행할 수 있도록 하는 것입니다(원격 장치의 저장 용량은 매우 제한되어 있으므로 이를 통해 많은 캡처를 얻을 수 있으며, 물론 필요에 따라 캡처를 더 빠르게 설정할 수도 있습니다.
heredoc의 목적은 sh
기본적으로 해당 원격 장치에 대한 적절한 셸에 들어가지 않기 때문입니다. 원격 장치에서 명령을 실행하면 sh
tcpdump를 실행할 수 있는 올바른 셸로 이동하게 되며, 이 heredoc는 이 작업을 수행하고 정보를 다시 로컬 파일로 다시 포팅할 수 있는 유일한 방법입니다.
내가 겪고 있는 문제는 스크립트가 스크립트의 tcpdump 부분에 도달하면 터미널에서 파일에서 tcpdump를 실행할 때 볼 것으로 예상되는 것과 같은 다음 출력을 제공한다는 것입니다.
drew@drew-Ubuntu-18:~/Desktop$ ./Script.sh
tcpdump: listening on eth5.1, link-type EN10MB (Ethernet), capture size 65535 bytes
Got 665
물론, 더 많은 패킷이 캡처되어 로컬 파일로 전달되면 "got" 카운터가 증가합니다. 불행하게도 지금까지 이 동작을 중지하고 터미널로 돌아가는 유일한 방법은 CTRL
+ 를 실행하는 것입니다 C
.
여기서 문제는 이것이 원격 시스템의 tcpdump를 중지할 뿐만 아니라 로컬 시스템에서 실행 중인 스크립트도 종료한다는 것입니다.
물론 이는 내 스크립트에서 더 이상 아무것도 실행되지 않으며 sed
여기에 포함된 데이터뿐만 아니라 이 데이터를 사용하여 많은 작업을 수행해야 함을 의미합니다.
저는 다음과 같이 설정해 보았습니다.
tcpdump -i eth5.1 -s 0 -n -v -U -w - &
read -n 1 -s; kill $!
여기서의 사고 과정은 내 원래 tcpdump 정보가 여전히 stdout에 게시되어 있으므로 내 로컬 캡처 파일에 계속 채워져 있다는 것입니다. 그러나 이런 방식으로 캡처를 실행하려고 하면 &
실제로 터미널에 다른 항목을 게시할 수 없는 것 같습니다(항상 너무 많은 쓰레기가 날아다니는지 또는 무엇인지 확실하지 않음). 나는 이것을 로컬에서 시도했지만 stdout에 게시된 원시 tcpdump를 실행하려고 해도 다른 일이 발생하지 않는 것 같습니다.
CTRL
이 정보를 바탕으로 이 시점에서 제가 생각할 수 있는 유일한 것은 +를 사용하여 원격 시스템에서 tcpdump를 끄되 C
스크립트는 계속 실행되도록 하는 방법이 있는지 여부입니다 . 제가 시도해 볼 수 있는 제안이 있나요? 아니면 좀 더 논리적인 해결책이 있을까요?
답변1
원격 캡처 트래픽 스크립트를 일부 개선하는 것이 좋습니다.
스크립트를 방지 CTRC하고 종료 하려면 다음을 수행하세요.C
이는 트랩을 사용하여 잡는 방식으로 수행할 수 있습니다
SIGINT
. 일반적으로 스크립트 시작 부분에 넣습니다. 이 예를 보세요:trap "pkill ssh" INT
분명히 원하는 SSH만 가져오는 필터가 개선될 수 있습니다.
원격 시스템과의 통신 필터링
tcpdump
귀하는 귀하의 시스템이 캡처에 제대로 응답하지 않으며 아마도 반복적인 데이터 캡처로 인해 시스템에 과부하가 걸렸다고 말씀하셨습니다. 수신 대기 중인 인터페이스에 따라 원격 시스템에 대한 모든 연결에서 제어 연결 데이터가 캡처에 추가되어 서비스할 패킷이 더 많이 생성되는 반복적인 상황이 발생할 수 있습니다
tcpdump
.따라서
tcpdump
로컬 컴퓨터와 원격 컴퓨터 간의 통신을 필터링해야 할 수도 있습니다. 다음과 같은 것을 사용하십시오:/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w - "not port 22"
또는:
/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w - "not my_local_host"
이렇게 하면 속도 저하와 불안정성이 완화되어 스크립트 성능이 향상됩니다. 사용법에 대한 이후 내용도 참조하세요
nc
.+를 항상
tcpdump
사용하지 않도록 수신 패킷 수를 제한하십시오 .CTRCC트래픽의 작은 부분만 캡처하려면
tcpdump
캡처되는 패킷 수를 제한해야 합니다tcpdump
.예를 들어, 100개의 패킷을 캡처하고 다음을 반환합니다.
tcpdump -c 100 -w -
항상 +를
tcpdump
사용하지 않도록 시간을 제한하세요 .CTRCC5분(300초)의 트래픽을 캡처하려면
timeout
원격 측에서 이 명령을 사용하십시오. 좋다:ssh "timeout 300 tcpdump -w -"
그 껍질을 버려라
tcpdump
대신 전체 경로를 호출하려면 $PATH가 필요하기 때문에 쉘을 사용하고 있습니다tcpdump
.좋다:
sshpass -p $password ssh -T $username@$ip_address -p 30007 "/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w -"
버퍼링 해제
tcpdump
tcpdump
tcpdump
에 대한 출력이stdout
버퍼링되었습니다. 중단 시 원격 호스트에서 데이터를 더 빠르게 가져오고 데이터 손실을 줄이기 위해 버퍼링을 해제하려면 다음을 사용하세요-l
./usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -l -w -
귀하의 경우에는 작동할 수도 있고 작동하지 않을 수도 있습니다. 몇 가지 테스트를 수행해 보십시오. CTRL-C로 중단하면 확실히 더 많은 데이터가 남게 됩니다.
SSH를 사용하지 않고 트래픽 덤프를 가져옵니다. 대신 사용하십시오
netcat
.자체 네트워크 내에서 캡처하는 등 엄격한 보안 요구 사항이 없고 두 호스트 사이의 포트를 차단하는 방화벽이 없는 경우 해당 SSH를 포기하여
tcpdump
출력을 얻으세요. 이는 계산 비용이 많이 드는 프로토콜이므로 더 많은 원격 트래픽을 캡처해야 하는 경우 방해가 될 수 있습니다. 대신 데이터를nc
가져오는 데 사용하세요.tcpdump
로컬 머신과 동일:
nc -l -p 20000 > capture.dump &
원격 시스템:
ssh remote "/usr/bin/tcpdump -w - | nc IP_local_machine 20000" > /dev/null
그건 포기해
sshpass
인증을 위해 비밀번호 대신 SSH 키를 사용하세요.
마지막으로, 보다 전문적으로 수행한다면 대행사 + 전문 서비스 이용 가능성을 고려해보세요.
당신은 그것을 사용할 수 있습니다
cshark
.트래픽을 캡처하고 분석을 위해 CloudShark에 직접 업로드하세요. CloudShark 서비스 사용:https://www.cloudshark.org또는 자체 CloudShark 어플라이언스.