Wi-Fi consomation 이상

Nov 25 2020

요즘 약간의 문제가 발생했습니다. 나도 모르게 Wi-Fi를 많이 사용하고 있습니다. 정말 짜증납니다. 내가 얼마나 많이 사용하는지 모르기 때문에 60 $를 지불해야 할 때마다. 지금 물어보세요, 제가 다운로드 할 수있는 프로그램이 있습니까, 아니면 제가 Wi-Fi를 얼마나 많이 사용하는지 확인하기 위해 할 수있는 프로그램이 있습니까? 예를 들어 하루에 5GB를 사용한다고 가정 해 보겠습니다. 하지만 내 집에서 외롭지 않은 메신저, 나는 여전히 그것을 사용하는 친구, 가족이 있습니다. 결국 나는 Wi-Fi를 다시 채우는 것으로 끝낼 것입니다. 그래서 누군가가 나에게 앱의 이름을 알려줄 수있는 방법이 있나요? 그래서 내가 무료로 다운로드 할 수 있거나 나와 내 가족과 친구들이 사용하는 작은 물기를 세는 작은 프로그램을 다운로드 할 수 있습니까? 그 문제를 해결하는 데 도움이 될 것입니다.

답변

CrazyGoblin Nov 25 2020 at 19:44

vnstat를 설치할 수 있습니다. 나는 그것을 사용했고 다른 사람들이 이미 그것을 당신에게 제안한 것을 봅니다.

PC에 설치하는 것은 매우 간단 sudo apt-get install vnstat합니다. 터미널 에서 일반적인 명령을 사용하여 설치하면됩니다.

그런 다음이 기사를 따를 수 있습니다. https://oastic.com/how-to-monitor-network-traffic-on-ubuntu-using-vnstat/

꽤 쉽습니다. 막히면 알려주세요.

DougSmythies Nov 26 2020 at 21:50

소개 : 이 답변은 WAN (광역 네트워크, AKA 인터넷)과 LAN (근거리 통신망) 간의 모든 트래픽이 서버를 통과하는 라우터 역할을하는 Ubuntu Server에 대한 것입니다. 그것은https://askubuntu.com/questions/951783/why-is-internet-upload-so-high-when-i-dont-actually-upload-much/952037#952037, 그 대답은 일부 WAN 측 통계를 수집하기위한 것이고 이것은 일부 클라이언트 측 통계를 수집하기위한 것입니다.

주의 : 여기에 사용 된 방법은 네트워크 부하에 따라 매우 큰 파일을 다소 빠르게 생성합니다. CPU로드도 때때로 상당 할 수 있습니다. 모든 실사와 충분한 디스크 공간을 진행하십시오.

방법 : tcpdump를 사용하여 모든 패킷 트래픽을 캡처하고 일부 사후 처리를 사용하여 원하는 정보를 추출합니다.

sudo tcpdump -i enp2s0 -Z doug -w 'int-%F-%H-%M-%S.bin' -G 3600 -z ./packet_post_processor3

어디에 :
내 내부 LAN 직면 인터페이스는 enp2s0;
파일 이름에는 자동으로 날짜와 시간이 포함됩니다 (추가 패키지가 필요하지만 기억할 수 없습니다).
한 시간에 한 번씩 파일 교체를 요청합니다.
나는 파일 소유권을 원한다. doug, (일반 사용자 me);
각 파일은 packet_post_processor스크립트에 의해 사후 처리됩니다 (3은이 답변을위한 것입니다).

사후 처리 스크립트 :

#!/bin/dash
#
# packet_post_processor3 Doug Smythies. 2020.11.26
#       Look at client traffic with this version.
#       See also:
#       https://askubuntu.com/questions/1295243/over-wifi-consomation
#
# packet_post_processor2 Doug Smythies. 2017.09.08
#    Edits as required for updated c prgram, and bad sort order.
#    There may be little use in sort by packets count, but for now
#    it remians.
#
# packet_post_processor2 Doug Smythies. 2017.09.01
#    This script will be called from the always running tcpdump.
#    It is called for every binary file rotation.
#    The purpose is to make summary files of things that one
#    may want to investigate in more detail later on.
#
#    This version is for WinEunuuchs2Unix and
# https://askubuntu.com/questions/951783/how-to-find-out-who-is-taking-70-gb-of-data-from-me-each-month
#

#check that the call included the file name, and only the file name, to use.
if [ $# -ne 1 ]
then
  echo "Usage - $0  file-name"
  exit 1
fi

# check that the file actually exists:
if [ ! -f $1 ]
then
  echo "tcpdump binary file $1 does not exist, aborting..."
  exit 1
fi

echo "data extraction 1: All the packets..."
# Note: Using the -e option will ease subsequent bytes per unit time calculations
tcpdump -n -tttt -e -r $1 >all_e.txt

echo "data extraction 2: The client side outgoing normal packets..."
# Note: We might want to check that something important doesn't get missed here.
# Note: replace the fake IP address with your actual client side sub-net IP.
# for smythies.com this is 192.168.111.0/24:
#ver 2
#grep ": XXX\.XXX\.XXX\.XXX\." all_e.txt | grep Flags >outgoing.txt
#ver 3
grep " > 192\.168\.111\." all_e.txt | grep Flags >outgoing.txt

echo "data extraction 3: Make a histogram of the destination IP addresses by packets..."
# Note: use field 13

cut -d" " -f13 outgoing.txt | sed 's/.[^.]*$//' | sort | uniq -c | sort -g >outhisto.txt

# Phase 2: Maximum packet count might not mean maximum byte count, so figure out maximum byte count

echo "data extraction 4: Sort the outgoing file by destination IP address."
LC_ALL=C sort -k 13 <outgoing.txt >outgoing.srt

echo "data extraction 5: Now, calculate bytes per IP and bytes per IP/16 and make sorted historgrams"
# Note: There might be some clever awk or whatever way to do this, but I have a c program.
./tcpdump_bytes outgoing.srt outb.txt out16.txt
sort --general-numeric-sort <outb.txt >$1.txt
sort --general-numeric-sort <out16.txt >$1.16.txt

# Leave the intermediate files, just for now, while we debug.
# However, and for the huge .bin file, only keep it if really needed. Uncomment to delete.
rm $1
#
# packet_post_process. End.

스크립트 내에서 호출 된 c 프로그램 :

/*****************************************************************************
*
* tcpdump_bytes.c 2017.09.08 Smythies
*       By sorting the input file before running this program, it can do bytes
*       per IP all on its own, and in one pass through the file. At this time,
*       it is for outgoing only. A future revision will add command line
*       options for incoming and such.
*       Might as well group by 1st 2 IP address bytes at the same time,
*       i.e. for some (not all) of those multiple IP situations.
*
* tcpdump_bytes.c 2017.09.01 Smythies
*       Count the bytes for all the packets in the passed file.
*       See also tcpdump_extract.c, from which this was taken.
*       This program is very quite, just printing bytes, unless there
*       is some error. The idea is that is part of something bigger and
*       therefore extra verbosity would just get in the way.
*
*       Note: The input tcpdump file needs to have been done
*             with the -e option.
*
*****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LENGTH 2000  /* maximum line length */

void main(int argc, char **argv){

   char in_buffer[MAX_LENGTH];
   char *infile, *outfile1, *outfile2;
   char *index, *index2;
   FILE *inf, *out1, *out2;
   unsigned current_bytes, sip3, sip2, sip1, sip0, sport, dip3, dip2, dip1, dip0, dport;
   unsigned dest_ip, dest_ip_16, dest_ip_old, dest_ip_16_old;
   unsigned num_lines, num_ips, num_16s;
   unsigned long long total_bytes, total_bytes_16;

   switch(argc){
   case 4:
      infile = argv[1];
      outfile1 = argv[2];
      outfile2 = argv[3];
      break;
   default:
      printf("tcpdump_bytes infile outfile1 outfile2\n");
      printf("  parse outgoing bytes per IP out of a sorted tcpdump file where the -e option was used.\n");
      printf("  infile is sorted tcpdump output file; oufile1 is bytes per IP; outfile 2 is bytes per IP/16.\n");
      exit(-1);
   } /* endcase */

   if((inf = fopen(infile, "rt")) == NULL){
      printf("Unable to open input file '%s'\n", infile);
      exit(-1);
   } /* endif */
   if((out1 = fopen(outfile1, "wt")) == NULL){
      printf("Error opening output file '%s'\n", outfile1);
      exit(-1);
   } /* endif */
   if((out2 = fopen(outfile2, "wt")) == NULL){
      printf("Error opening output file '%s'\n", outfile2);
      exit(-1);
   } /* endif */

   total_bytes = 0;
   total_bytes_16 = 0;
   dest_ip_old = 0;
   dest_ip_16_old = 0;
   num_lines = 0;
   num_ips = 0;
   num_16s = 0;

   while((fgets(in_buffer, MAX_LENGTH, inf)) != NULL){       /* do infile line at a time */
      num_lines++;

      if((index = strstr(in_buffer, "), length ")) != NULL){ /* find search string if it is there, then parse the data */
         sscanf(index, "), length %u: %u.%u.%u.%u.%u > %u.%u.%u.%u.%u:",
            &current_bytes,
            &sip3, &sip2, &sip1, &sip0,
            &sport,
            &dip3, &dip2, &dip1, &dip0,
            &dport);
      } else {
         printf("tcpdump_bytes: Got an odd line: %s", in_buffer);
      } /* endif */
      dest_ip_16 = (dip3 << 24) + (dip2 << 16);
      dest_ip = dest_ip_16 + (dip1 << 8) + dip0;
//    printf("debug: B: %u  S: %u.%u.%u.%u.%u  D: %u.%u.%u.%u.%u  %u  %u\n", current_bytes, sip3, sip2, sip1, sip0, sport, dip3, dip2, dip1, dip0, dport, dest_ip, dest_ip_16);

      if(dest_ip != dest_ip_old){
         if(total_bytes != 0){
            fprintf(out1, "%llu %u.%u.%u.%u\n", total_bytes, (dest_ip_old >> 24) & 0xff, (dest_ip_old >> 16) & 0xff, (dest_ip_old >> 8) & 0xff, dest_ip_old & 0xff);
            total_bytes = 0;
         } /* endif */
         dest_ip_old = dest_ip;
         num_ips++;
      } /* endif */
      total_bytes = total_bytes + (unsigned long long) current_bytes;

      if(dest_ip_16 != dest_ip_16_old){
         if(total_bytes_16 != 0){
            fprintf(out2, "%llu %u.%u.0.0/16\n", total_bytes_16, (dest_ip_16_old >> 24) & 0xff, (dest_ip_16_old >> 16) & 0xff);
            total_bytes_16 = 0;
         } /* endif */
         dest_ip_16_old = dest_ip_16;
         num_16s++;
      } /* endif */
      total_bytes_16 = total_bytes_16 + (unsigned long long) current_bytes;
   } /* endwhile */

   /* don't forget to output the last data */
   if(total_bytes != 0){
      fprintf(out1, "%llu %u.%u.%u.%u\n", total_bytes, dip3, dip2, dip1, dip0);
   } else {
      printf("tcpdump_bytes: Something is wrong. Last IP address has no bytes.\n");
   } /* endif */

   if(total_bytes_16 != 0){
      fprintf(out2, "%llu %u.%u.0.0/16\n", total_bytes_16, dip3, dip2);
   } else {
      printf("tcpdump_bytes: Something is wrong. Last IP/16 address has no bytes.\n");
   } /* endif */

   fclose(inf);
   fclose(out1);
   fclose(out2);
   printf("tcpdump_bytes: Done. Processed %d lines and %d IP addresses and %d /16 addresses\n", num_lines, num_ips, num_16s);
} /* endprogram */

사후 처리 스크립트가 수행하는 작업에 대한 간략한 요약 :
먼저 바이너리 tcpdump 파일이 패킷 별 요약 텍스트로 변환됩니다. 예 (내 LAN 서브넷은 192.168.111.0/24이고 라우터는 192.168.111.1) :

2020-11-26 12:16:40.077187 64:1c:ae:dc:c0:d3 > 00:19:b9:0d:af:fa, ethertype IPv4 (0x0800), length 60: 192.168.111.123.36953 > 69.164.31.0.443: Flags [R], seq 4022180665, win 0, length 0
2020-11-26 12:16:40.077210 64:1c:ae:dc:c0:d3 > 00:19:b9:0d:af:fa, ethertype IPv4 (0x0800), length 60: 192.168.111.123.36953 > 69.164.31.0.443: Flags [R], seq 4022180665, win 0, length 0
2020-11-26 12:16:40.077225 64:1c:ae:dc:c0:d3 > 00:19:b9:0d:af:fa, ethertype IPv4 (0x0800), length 60: 192.168.111.123.36953 > 69.164.31.0.443: Flags [R], seq 4022180665, win 0, length 0
2020-11-26 12:16:40.077241 64:1c:ae:dc:c0:d3 > 00:19:b9:0d:af:fa, ethertype IPv4 (0x0800), length 66: 192.168.111.123.39503 > 99.81.137.214.443: Flags [.], ack 909, win 998, options [nop,nop,TS val 117576 ecr 459725584], length 0
2020-11-26 12:16:40.077251 00:19:b9:0d:af:fa > 64:1c:ae:dc:c0:d3, ethertype IPv4 (0x0800), length 504: 192.168.111.1.53 > 192.168.111.123.49124: 20771 5/4/15 A 8.251.162.11, A 8.240.108.139, A 8.240.90.139, A 8.240.93.139, A 8.240.102.11 (462)
2020-11-26 12:16:40.077412 00:19:b9:0d:af:fa > 64:1c:ae:dc:c0:d3, ethertype IPv4 (0x0800), length 500: 192.168.111.1.53 > 192.168.111.123.49124: 8356 5/4/11 AAAA 2001:1900:2352:104f::1, AAAA 2001:1900:23b2:11::1, AAAA 2001:1900:2304:5f06::1, AAAA 2001:1900:23b2:1::1, AAAA 2001:1900:2304:7055::1 (458)
2020-11-26 12:16:40.235369 00:19:b9:0d:af:fa > 64:1c:ae:dc:c0:d3, ethertype ARP (0x0806), length 42: Request who-has 192.168.111.123 tell 192.168.111.1, length 28
2020-11-26 12:16:40.237464 64:1c:ae:dc:c0:d3 > 01:00:5e:00:00:07, ethertype IPv4 (0x0800), length 246: 192.168.111.123.8001 > 224.0.0.7.8001: UDP, length 204
2020-11-26 12:16:40.237479 64:1c:ae:dc:c0:d3 > 00:19:b9:0d:af:fa, ethertype IPv4 (0x0800), length 74: 192.168.111.123.33547 > 8.251.162.11.443: Flags [S], seq 2516382973, win 29200, options [mss 1460,sackOK,TS val 117612 ecr 0,nop,wscale 7], length 0
2020-11-26 12:16:40.237508 64:1c:ae:dc:c0:d3 > 00:19:b9:0d:af:fa, ethertype ARP (0x0806), length 60: Reply 192.168.111.123 is-at 64:1c:ae:dc:c0:d3, length 46
2020-11-26 12:16:40.308884 00:19:b9:0d:af:fa > 64:1c:ae:dc:c0:d3, ethertype IPv4 (0x0800), length 74: 8.251.162.11.443 > 192.168.111.123.33547: Flags [S.], seq 829843053, ack 2516382974, win 65160, options [mss 1460,sackOK,TS val 1958034067 ecr 117612,nop,wscale 7], length 0
2020-11-26 12:16:40.311459 64:1c:ae:dc:c0:d3 > 00:19:b9:0d:af:fa, ethertype IPv4 (0x0800), length 66: 192.168.111.123.33547 > 8.251.162.11.443: Flags [.], ack 1, win 229, options [nop,nop,TS val 117669 ecr 1958034067], length 0
2020-11-26 12:16:40.841355 00:19:b9:0d:af:fa > 00:21:9b:f9:21:26, ethertype IPv4 (0x0800), length 1514: 173.180.45.3.22 > 192.168.111.101.61404: Flags [.], seq 9584:11044, ack 161, win 7733, length 1460
2020-11-26 12:16:40.841375 00:19:b9:0d:af:fa > 00:21:9b:f9:21:26, ethertype IPv4 (0x0800), length 162: 173.180.45.3.22 > 192.168.111.101.61404: Flags [P.], seq 11044:11152, ack 161, win 7733, length 108
2020-11-26 12:16:40.842302 00:21:9b:f9:21:26 > 00:19:b9:0d:af:fa, ethertype IPv4 (0x0800), length 60: 192.168.111.101.61404 > 173.180.45.3.22: Flags [.], ack 11152, win 1026, length 0

ARP 패킷 쌍이 예제에 포함되어 추가 처리에서 제외되는 항목을 표시하기위한 것입니다.
추가 처리에서 제외되는 다른 성가신 패킷 유형이 있습니다. 각 행에 두 개의 길이가 표시됩니다. 첫 번째 길이는 와이어의 바이트이고 두 번째 길이는 페이로드 길이입니다. 우리는 와이어에 바이트를 원하기 때문에 tcpdump와 함께 -e 옵션을 사용합니다.

둘째, ": 192.168.111."을 찾아서 나가는 LAN 패킷을 고유하게 식별 할 수 있으므로 grep을 사용하여 ARP 및 ICMP를 제외한 모든 나가는 패킷을 추출합니다.

셋째, 구분 기호로 공백을 사용하면 필드 13이 대상 IP 주소이므로 복잡한 파이프 명령을 사용하여 대상 IP 주소 패킷을 추출, 계산 및 정렬합니다.

넷째, 대상 IP 주소별로 나가는 패킷을 정렬합니다.
다섯째, c 프로그램을 사용하여 IP 당 바이트와 IP / 16 당 바이트를 계산하고 출력을 히스토그램으로 정렬합니다.

몇 시간의 예 :

doug@DOUG-64:~/tcpdump/per-client-test$ cat int-2020-11-26-10-16-32.bin.txt
16004 192.168.111.18
109288 192.168.111.1
247652 192.168.111.5
319432 192.168.111.19
11535118 192.168.111.101
doug@DOUG-64:~/tcpdump/per-client-test$ cat int-2020-11-26-10-16-32.bin.16.txt
12227494 192.168.0.0/16

2020.11.26 10:16:32부터 11:16:32까지 한 시간 동안 LAN의 다양한 클라이언트에 12,227,494 바이트가 전송되었으며 클라이언트별로 세부적으로 분류되었습니다. 109,288 바이트에서 192.168.111.1까지는 실제로 라우터 자체를 대상으로하는 LAN의 바이트입니다. 시간은 지금까지 클라이언트 192.168.111.101이 지배했습니다.

예 2 :

doug@DOUG-64:~/tcpdump/per-client-test$ cat int-2020-11-26-19-28-43.bin.txt
6605 192.168.111.1
121859 192.168.111.18
213614 192.168.111.20
257793 192.168.111.5
291138 192.168.111.19
2600309 192.168.111.123
7904391 192.168.111.101
2319210919 192.168.111.121
doug@DOUG-64:~/tcpdump/per-client-test$ cat int-2020-11-26-19-28-43.bin.16.txt
2330606628 192.168.0.0/16
doug@DOUG-64:~/tcpdump/per-client-test$ cat int-2020-11-26-20-28-43.bin.txt
4616 192.168.111.1
22196 192.168.111.20
75687 192.168.111.18
257152 192.168.111.5
346799 192.168.111.19
516269 192.168.111.123
8250344 192.168.111.101
2190976161 192.168.111.121
doug@DOUG-64:~/tcpdump/per-client-test$ cat int-2020-11-26-20-28-43.bin.16.txt
2200449224 192.168.0.0/16
doug@DOUG-64:~/tcpdump/per-client-test$ nslookup 192.168.111.121
Server:         127.0.0.1
Address:        127.0.0.1#53

121.111.168.192.in-addr.arpa    name = lg55.smythies.com.

그래서 55 인치 LG 스마트 TV는 오늘 오후 7시 28 분에서 9시 28 분 사이에 인터넷을 많이 사용했습니다. 즉, 넷플릭스 영화. (2.3e9 및 2.2e9 바이트)

문제
. 기본적으로 apparmor는 tcpdump 사후 처리 명령의 실행을 허용하지 않습니다. 더 좋고 안전한 방법이있을 수 있지만 계속 진행할 수 있도록 이렇게했습니다 (복장을 불평 모드로 설정).

doug@DOUG-64:~/tcpdump/per-client-test$ sudo grep tcpdump /sys/kernel/security/apparmor/profiles
/usr/sbin/tcpdump (enforce)
doug@DOUG-64:~/tcpdump/per-client-test$ sudo aa-complain /usr/sbin/tcpdump
Setting /usr/sbin/tcpdump to complain mode.
doug@DOUG-64:~/tcpdump/per-client-test$ sudo grep tcpdump /sys/kernel/security/apparmor/profiles
/usr/sbin/tcpdump (complain)

편집 : 이 클라이언트 요약 도구가 매우 유용하다고 생각합니다.