답변:
응용 프로그램이 특정 UDP 또는 TCP 포트 번호 나 특정 IP 주소로 패킷을 보내고있을 수 있습니다.
따라서 TCPdump와 같은 것을 사용하여 해당 트래픽을 캡처 할 수 있습니다.
TCPdump는 당신이 원하는 실시간 통계를 제공하지 않지만 당신은 그것을 출력하는 것을 무언가에게 공급할 수 있습니다 (나중에이 답변을 나중에 답변으로 업데이트하려고 노력할 것입니다).
최신 정보:
$ sudo tcpdump -i eth1 -l -e -n | ./netbps
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:36:53 2143.33 Bps
11:37:03 1995.99 Bps
11:37:13 2008.35 Bps
11:37:23 1999.97 Bps
11:37:33 2083.32 Bps
131 packets captured
131 packets received by filter
0 packets dropped by kernel
Ctrl + C를 눌러 1 분 후에 중단했습니다.
당신은 끝에 적절한 필터 식을 추가해야 할 것입니다 tcpdump
만 응용 프로그램에 의해 생성 된 트래픽을 포함하는 명령 (예를 들어 port 123
)
프로그램 netbps
은 이렇습니다 :
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;
my $reporting_interval = 10.0; # seconds
my $bytes_this_interval = 0;
my $start_time = [Time::HiRes::gettimeofday()];
STDOUT->autoflush(1);
while (<>) {
if (/ length (\d+):/) {
$bytes_this_interval += $1;
my $elapsed_seconds = Time::HiRes::tv_interval($start_time);
if ($elapsed_seconds > $reporting_interval) {
my $bps = $bytes_this_interval / $elapsed_seconds;
printf "%02d:%02d:%02d %10.2f Bps\n", (localtime())[2,1,0],$bps;
$start_time = [Time::HiRes::gettimeofday()];
$bytes_this_interval = 0;
}
}
}
그것은 단지 예일뿐입니다.
vnstat -tr
동일한 폴더에서 아래와 같이 사용법 :
인터페이스 당 패커를 확인하려면 ./netpps.sh eth0
인터페이스 당 속도를 확인하려면 ./netspeed.sh eth0
파일 이름으로 인터페이스 netpps.sh 에서 초당 패킷 측정
#!/bin/bash
INTERVAL="1" # update interval in seconds
if [ -z "$1" ]; then
echo
echo usage: $0 [network-interface]
echo
echo e.g. $0 eth0
echo
echo shows packets-per-second
exit
fi
IF=$1
while true
do
R1=`cat /sys/class/net/$1/statistics/rx_packets`
T1=`cat /sys/class/net/$1/statistics/tx_packets`
sleep $INTERVAL
R2=`cat /sys/class/net/$1/statistics/rx_packets`
T2=`cat /sys/class/net/$1/statistics/tx_packets`
TXPPS=`expr $T2 - $T1`
RXPPS=`expr $R2 - $R1`
echo "TX $1: $TXPPS pkts/s RX $1: $RXPPS pkts/s"
done
파일 이름으로 인터페이스 netspeed.sh 에서 네트워크 대역폭 측정
#!/bin/bash
INTERVAL="1" # update interval in seconds
if [ -z "$1" ]; then
echo
echo usage: $0 [network-interface]
echo
echo e.g. $0 eth0
echo
exit
fi
IF=$1
while true
do
R1=`cat /sys/class/net/$1/statistics/rx_bytes`
T1=`cat /sys/class/net/$1/statistics/tx_bytes`
sleep $INTERVAL
R2=`cat /sys/class/net/$1/statistics/rx_bytes`
T2=`cat /sys/class/net/$1/statistics/tx_bytes`
TBPS=`expr $T2 - $T1`
RBPS=`expr $R2 - $R1`
TKBPS=`expr $TBPS / 1024`
RKBPS=`expr $RBPS / 1024`
echo "TX $1: $TKBPS kB/s RX $1: $RKBPS kB/s"
done
자세한 내용은이 사이트를 참조하십시오 http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html
연속 로깅을 위해 사용하기 쉽고 출력을 제어하고 파일로 리디렉션하기가 가장 쉽습니다.
ifstat
아마도 대부분의 Linux 배포판과 함께 제공되며 Mac에서 brew와 함께 설치할 수 있습니다
proc 인터페이스를 사용하여 필요한 정보를 얻을 수 있다고 생각합니다. rt_traf.sh라는 작은 쉘 스크립트를 작성했습니다.
#!/bin/bash
cat /proc/$1/net/netstat | grep 'IpExt: ' | tail -n 1 | awk '{ print $8 "\t" $9 }'
입력 및 출력 옥텟이 탭으로 구분되어 인쇄됩니다. 옥텟에 8을 곱하면 비트 / 초를 제공 한 다음 10 ^ 6으로 나누면 초당 메가 비트가 제공됩니다. 물론 이것을 원하는 방식으로 출력을 형식화하기 위해 쉘 스크립트에 추가 할 수 있습니다. 응용 프로그램의 PID를 사용하여 이것을 호출 할 수 ./rt_traf.sh <PID>
있으므로 시작 이후 응용 프로그램을 즉시 읽을 수 있습니다. 초당 실시간 통계를 보려면 watch 명령에서 쉘 스크립트를 래핑 할 수 있습니다.
watch -n 1 ./rt_traf.sh <PID>
이 -n
파라미터는 10 분의 1 초까지 조정할 수 있습니다. 시간이 지남에 따라 계산을 수행하려면 다음과 같이하십시오.
PID=<PID>; START=`./rt_traf.sh $PID`;IN_START=`echo $START | awk '{ print $1 }'`; OUT_START=`echo $START | awk '{ print $2 }'`; sleep 10; END=`./rt_traf.sh $PID`; IN_END=`echo $END | awk '{ print $1 }'`; OUT_END=`echo $END | awk '{ print $2 }'`; IN_BPS=`echo "scale=2; (($IN_START-$IN_END)/10)/8" | bc`; OUT_BPS=`echo "scale=2; (($OUT_START-$OUT_END)/10)/8" | bc`; echo "In: " $IN_BPS "Bits/second"; echo "Out: " $OUT_BPS "Bits/second"
다시 수학은 필요한 크기 / 시간에 맞게 조정할 수 있습니다. 가장 우아하거나 수축 포장 된 솔루션은 아니지만 핀치 방식으로 작동해야합니다.
/proc/<pid>/net/netstat
와 같은 데이터를 반환합니다 proc/net/netstat
. 모든 프로세스에 대해 동일한 데이터를 얻습니다.
나는 perl이 제대로 작동하지 않는 오래된 시스템에서 얼마나 많은 mysql 트래픽이 들어오고 나가는 지 측정해야했기 때문에 tcpdump가 보는 총 트래픽을 측정하는 동일한 목표를 달성하는 몇 줄의 awk를 작성하는 것에 저항 할 수 없었습니다.
# tcpdump -l -e -n port 3306 | \
awk '{
t=substr($1, 0, 8);
n=substr($9, 0, length($9)-1);
if(t != pt){
print t, sum;
sum = 0;
} else {
sum += n
}
pt=t;
}'
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:41:54
14:41:55 466905
14:41:56 765220
14:41:57 741511
14:41:58 688219
14:41:59 492322
14:42:00 800087
14:42:01 1248608
14:42:02 1276476
14:42:03 755586
14:42:04 1029453
14:42:05 818298
^C32515 packets captured
32633 packets received by filter
107 packets dropped by kernel
그리고 하나의 라이너를 더 좋아한다면 여기에 하나가 있습니다.
tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;}else{sum+=n}pt=t;}'
else
문은 라인이 생략됩니다 그렇지 않으면 제거해야하며, sum
정확하지 않을 것입니다. tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;};sum+=n;pt=t;}
xtables를 사용하는 방화벽 규칙과 아래 수정 사항을 사용하여 애플리케이션별로 수행 할 수 있습니다.
이것은 "응용 프로그램 별"질문에 대한 답변이 아니라 "인터페이스 당"질문에 대한 답변입니다.
아래는 Ubiquiti 및 OpenWRT 호환 라우터와 같은 대부분의 임베디드 Linux 라우터에서 작동하며 / proc / net / dev에서 세부 정보를 가져 오는 스크립트입니다.
(패킷 등으로 쉽게 변경 가능)
#!/bin/sh
SLP=1 # output / sleep interval
DEVICE=$1
IS_GOOD=0
for GOOD_DEVICE in `grep \: /proc/net/dev | awk -F: '{print $1}'`; do
if [ "$DEVICE" = $GOOD_DEVICE ]; then
IS_GOOD=1
break
fi
done
if [ $IS_GOOD -eq 0 ]; then
echo "Device not found. Should be one of these:"
grep ":" /proc/net/dev | awk -F: '{print $1}' | sed s@\ @@g
exit 1
fi
while true; do
LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED1=`echo $LINE | awk '{print $1}'`
TRANSMITTED1=`echo $LINE | awk '{print $9}'`
TOTAL=$(($RECEIVED1+$TRANSMITTED1))
sleep $SLP
LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED2=`echo $LINE | awk '{print $1}'`
TRANSMITTED2=`echo $LINE | awk '{print $9}'`
SPEED=$((($RECEIVED2+$TRANSMITTED2-$TOTAL)/$SLP))
INSPEED=$((($RECEIVED2-$RECEIVED1)/$SLP))
OUTSPEED=$((($TRANSMITTED2-$TRANSMITTED1)/$SLP))
printf "In: %12i KB/s | Out: %12i KB/s | Total: %12i KB/s\n" $(($INSPEED/1024)) $(($OUTSPEED/1024)) $((($INSPEED+$OUTSPEED)/1024)) ;
done;
위의 내용을 클립 보드에 복사 한 다음 라우터의 터미널 세션에서 복사하십시오.
$ cat > /tmp/n.sh
그런 다음 Ctrl + V (또는 마우스 오른쪽 버튼 클릭 / 붙여 넣기)
그런 다음 : Ctrl + D
$ chmod +x /tmp/n.sh
$ /tmp/n.sh eth0
메모장에 붙여 넣은 다음 편집해야 할 경우 위의 과정을 반복하면됩니다. 모든 내장 라우터에 편집기가있는 것은 아닙니다! 상단의 #에서 완료까지 모든 것을 복사해야합니다. 바닥에.
위의 netpps 예제는 훌륭한 BTW이지만 모든 장치에 / sys 파일 시스템이 마운트되어있는 것은 아닙니다. / bin / bash를 / bin / sh로 또는 그 반대로 변경해야 할 수도 있습니다.
출처 : https://gist.github.com/dagelf/ab2bad26ce96fa8d79b0834cd8cab549