Grafana + InfluxDB로 패킷 흐름 그래프

5250 단어 grafanainfluxdb
Raw Socket을 이용해 MAC/IP/Port 마다 카운트한 결과를 5분마다 집계한 결과를 InfluxDB 경유로 Grafana로 그래프화해 보았습니다.

네트워크는 이런 느낌
Internet -----------+
                    |
              [Gateway Router]
    ここを監視---->  ||
           [L2SW (NetGear GS108E)]
               |           |
      --+------+           +---------+
        |                  |         |
    [監視ポート]          [無線AP]   [有線LAN]

라우터에 직접 연결된 L2 스위치로 라우터의 포트를 미러링하여 캡처 용 포트를 작성하고 그 포트를 Raw Socket으로 모니터링하고 있습니다.


  • 대상 MAC 주소는 라우터이고 대상 IP는 라우터 이외의 패킷이 업로드됩니다.
  • 소스 MAC 주소는 라우터, 소스 IP는 라우터 이외의 패킷은 다운로드

  • 로 각각 그래프로하고 있습니다.
    엄밀하게 Upload/Download 를 낼 필요가 있는 경우는 snmp 등을 사용해 인터페이스의 패킷 카운터를 취득하는 편이 확실합니다.



    MAC 주소를 취득하고 있으므로 MAC 마다 얼마나 통신하고 있는지를 확인할 수 있습니다.
    여기도 대상 MAC, 소스 MAC로 구분하여 Upload/Download를 낼 수 있습니다



    Grafana 그래프는 그래프 아래에 있는 분류명을 선택하면 개별 그래프를 표시할 수 있습니다.

    준비



    1. Ubuntu에 필요한 패키지를 설치합니다.


    sudo apt install influxdb grafana libevent-dev
    

    InfluxDB는 tag가 지원되어야 하므로 0.9 이상이 필요합니다.
    //tag를 사용하지 않으면 쓸 형식이 좋지 않기 때문에 그대로 쓰면 의도하지 않은 값이 쓰여지는 것 같습니다.

    2. 미러링 포트를 모니터링하여 MAC 주소별로 계산할 수 있는 데몬을 준비합니다.


    % sudo pktcaptd
    % sudo pktcaptdctl dump
    {
        "interface" : "enp13s0f0",
        "flows" : [
            {
                "count":276,
                "size" :107596,
                "src_mac" : "00:E0:4D:10:8C:0C",
                "dst_mac" : "DC:53:60:03:DD:4C",
                "src_ip4" : "192.168.1.100",
                "dst_ip4" : "192.168.0.38",
                "l4proto" : "tcp",
                "src_port" : 22,
                "dst_port" : 59144
            },
            {
                "count":390,
                "size" :34856,
                "src_mac" : "DC:53:60:03:DD:4C",
                "dst_mac" : "00:E0:4D:10:8C:0C",
                "src_ip4" : "192.168.0.38",
                "dst_ip4" : "192.168.1.100",
                "l4proto" : "tcp",
                "src_port" : 59144,
                "dst_port" : 22
            }
        ],
        "total_flow" : 60
    }
    

    UNIX 도메인 소켓에 커멘드를 기입하면(자) JSON 형식으로 출력되므로 그것을 그대로 Ruby 로 처리할 수도 있습니다

    3. InfluxDB 설정



    ぃ tp // 코 m / 아이 r과 ぃ / / ms / 806 0 bfb, c 115b3
    참고로 패킷 흐름 JSON을 저장하는 데이터베이스를 제공합니다.

    4. InfluxDB에 JSON을 입력



    Ruby를 사용하여 JSON을 읽고 InfluxDB에 씁니다.
    Ruby에서 InfluxDB 데이터베이스를 만지기 위해 influxdb-ruby 모듈을 설치하십시오.
    sudo gem install influxdb
    

    influxdb-ruby 사용법
    require 'influxdb'
    
    DBNAME  ='pktcaptd0' #XXX set database name
    DBSERVER="127.0.0.1" #XXX set database server address (default: localhost)
    USERNAME="pktcaptd0" #XXX set user name of the database
    PASSWORD="pktcaptd0" #XXX set password of the database
    
    auth = {
      :username => USERNAME,
      :password => PASSWORD,
      :host     => DBSERVER,
      :port     => 8086,
      :time_precision => "s"
    }
    
    influxdb = InfluxDB::Client.new(DBNAME, auth)
    values={:point_1 => 100, :point2 => 200}
    tags={:type => "dummy"}
    data={:values=values, :tags=tags}
    influxdb.write_point('mesurement', data)
    
    

    pktcaptd에서 influxdb로 데이터를 쓰는 스크립트 가 있기 때문에 이것을 cron 등으로 정기적으로 실행한다.

    데이터가 기록되었는지 여부는 InfluxDB에 직접 액세스하여 확인합니다.
    직접 액세스 할 때 기본값은 8083 포트에 http로 액세스
    CentOS + InfluxDB v1.11의 조합으로 8083은 기본적으로 사용할 수 없으므로
    /etc/influxdb/influxdb.conf를보고 8083에서 검색을 수행하고 근처에있는 enabled를 true로 설정하십시오.
    [admin]
      enabled = true
      bind-address = ":8083"
    

    액세스하면 오른쪽 상단의 데이터베이스를 작성한 데이터베이스 이름으로 변경하십시오.
    select * from 'mesurement'
    

    에서 검색
    검색 결과를 좁히려면 where 사용
    select * from 'mesurement' where src_ip4 = '192.168.1.100' and dst_ip4 = '192.168.0.38'
    

    시간으로 좁히고 싶을 때는 time 변수를 사용할 수 있다
    select * from 'mesurement' where time > '2017/01/01' and time < '2017/01/05'
    

    4. Grafana로 표시



    환경에 따라서는 아이콘이 보이지 않는 일이 있기 때문에 마음의 눈으로 커서를 움직여 포인터가 바뀐 부분에서 클릭한다

    좋은 웹페이지 즐겨찾기