Grafana로 NetFlow v9 트래픽 분석
완제품 이미지
Grafana를 통한 NetFlow 트래픽 시각화 대시보드
목적
NetFlow v9를 지원하는 무료 시각화 소프트웨어 가 적고, 상용 소프트웨어는 고가이기 때문에, 부담없이 가시화할 수 있는 구조를 만들 수 없을까 생각하고 있었는데, NetOpsCoding #3 툴을 응용하면 만들 수 있을까라고 생각해 보았습니다.
건설
NetFlow 내보내기 (라우터) 준비, 구축
Cisco ASR1001을 사용해 보았습니다.
NetFlow v9를 지원하는 무료 시각화 소프트웨어 가 적고, 상용 소프트웨어는 고가이기 때문에, 부담없이 가시화할 수 있는 구조를 만들 수 없을까 생각하고 있었는데, NetOpsCoding #3 툴을 응용하면 만들 수 있을까라고 생각해 보았습니다.
건설
NetFlow 내보내기 (라우터) 준비, 구축
Cisco ASR1001을 사용해 보았습니다.
Cisco AVC (Application Visibility and Control)라는 기능으로 트래픽을 애플리케이션 식별하는 필드를 NetFlow v9 템플릿에 올려 보았습니다.
설정은 이런 느낌입니다.
플로우 레코드 정보와 템플릿 출력을 확인.
#show flow monitor monitor-avc-monitoring cache format table
IPV4 SRC ADDR IPV4 DST ADDR APP NAME trns src port trns dst port intf input intf output bytes pkts time first time last ip prot
=============== =============== ================================ ============= ============= ==================== ==================== ========== ========== ============ ============ =======
X.X.X.X X.X.X.X layer7 twitter 52441 443 Gi0/0/1 Gi0/0/0 4898 37 11:43:44.132 11:43:51.553 6
X.X.X.X X.X.X.X layer7 facebook 443 52321 Gi0/0/0 Gi0/0/1 112313 130 11:43:27.969 11:43:52.749 6
X.X.X.X X.X.X.X layer7 skype 51200 443 Gi0/0/1 Gi0/0/0 793 3 11:43:27.383 11:43:31.048 6
X.X.X.X X.X.X.X layer7 ssl 443 51467 Gi0/0/0 Gi0/0/1 15644 12 11:43:33.639 11:43:33.789 6
X.X.X.X X.X.X.X port telnet 23 52400 Gi0/0/0 Gi0/0/1 8269 11 11:43:36.925 11:43:55.947 6
X.X.X.X X.X.X.X layer7 google-services 443 52469 Gi0/0/0 Gi0/0/1 712 9 11:43:49.134 11:43:49.351 6
#show flow exporter exporter-avc-monitoring templates
Flow Exporter exporter-avc-monitoring:
Client: Flow Monitor monitor-avc-monitoring
Exporter Format: NetFlow Version 9
Template ID : 274
Source ID : 256
Record Size : 41
Template layout
_____________________________________________________________________
| Field | Type | Offset | Size |
---------------------------------------------------------------------
| ipv4 source address | 8 | 0 | 4 |
| ipv4 destination address | 12 | 4 | 4 |
| ip protocol | 4 | 8 | 1 |
| transport source-port | 7 | 9 | 2 |
| transport destination-port | 11 | 11 | 2 |
| interface input snmp | 10 | 13 | 4 |
| application id | 95 | 17 | 4 |
| interface output snmp | 14 | 21 | 4 |
| counter bytes | 1 | 25 | 4 |
| counter packets | 2 | 29 | 4 |
| timestamp sys-uptime first | 22 | 33 | 4 |
| timestamp sys-uptime last | 21 | 37 | 4 |
---------------------------------------------------------------------
NetFlow 수집기 (가시화 도구) 준비, 구축
DockerHub의 이미지를 사용하여 Fluentd와 InfluxDB, Grafana를 준비합니다.
사용한 OS, 도구는 다음과 같습니다.
Ubuntu/Docker 준비
Docker를 설치합니다. Ubuntu atp docker.io 패키지를 설치합니다.
$ sudo apt install docker.io
Fluentd 준비
라우터에서 NetFlow 데이터를 수신하고 InfluxDB에 저장하는 Fluentd를 설치합니다.
fluent-plugin-influxdb, fluent-plugin-netflow 양쪽 플러그인에 대응한 Docker Image가 없었기 때문에, fluent project의 Fluentd Docker Image (fluent/fluentd)를 clone 해 커스터마이즈 해 build 했습니다.
$ git clone https://github.com/fluent/fluentd-docker-image.git
$ cd fluentd-docker-image/
Dockerfile.
$ diff -uw Dockerfile.orig Dockerfile
--- Dockerfile.orig 2016-08-25 11:03:39.264019589 +0900
+++ Dockerfile 2016-08-25 11:02:59.523127344 +0900
@@ -14,6 +14,8 @@
echo 'gem: --no-document' >> /etc/gemrc && \
gem install oj && \
gem install fluentd -v 0.12.28 && \
+ gem install fluent-plugin-influxdb && \
+ gem install fluent-plugin-netflow && \
apk del build-base ruby-dev && \
rm -rf /tmp/* /var/tmp/* /var/cache/apk/* /usr/lib/ruby/gems/*/cache/*.gem
fluent.conf
<source>
type netflow
tag netflow
bind 172.17.0.3
port 9996
</source>
<match netflow>
type influxdb
host influxdb
port 8086
dbname netflow9
time_precision s
tag_keys ["app_id", "first_switched", "last_switched", "flowset_id", "host", "input_snmp", "output_snmp", "ipv4_src_addr", "ipv4_dst_addr", "l4_src_port", "l4_dst_port", "protocol", "version", "ip_dscp", "ip_frag_offset", "ip_frag_flags", "icmp_ipv4_type", "icmp_ipv4_code", "tcp_ack_num", "tcp_header_len", "tcp_flags" ]
</match>
<match **>
type stdout
</match>
$ cd ..
$ sudo docker build -t fluentd-netflow:fluentd fluentd-docker-image
InfluxDB 준비
$ sudo docker pull influxdb
Grafana 준비
$ sudo docker pull grafana/grafana
Docker 이미지 시작
InfluxDB 시작, InfluxDB 설치, Fluentd, Grafana 시작을 차례로 수행합니다.
$ sudo docker run -d --name=influxdb -p 8083:8083 -p 8086:8086 -v $HOME/influxdb:/var/lib/influxdb influxdb
$ influx
> create database netflow9
> create retention policy netflow on netflow9 duration 8w replication 1 default
$ sudo docker run -d --name=fluentd --link influxdb:influxdb -p 24224:24224 -p 9996:9996/udp -v $HOME/fluentd/:/var/lib/fluentd fluentd-netflow:fluentd
$ sudo docker run -d --name=grafana --link influxdb:influxdb -p 3000:3000 -v $HOME/grafana/:/var/lib/grafana grafana/grafana
데이터 확인
다음과 같은 명령으로 레코드가 출력되면 NetFlow 레코드의 DB 쓰기가 성공하고 있습니다.
$ influx
> use netflow9
> select * from netflow where time > now() - 3m
Grafana 설정
Grafana의 설정은 Grafana와 InfluxDB에서 네트워크 리소스 시각화 의 기사가 참고가 됩니다.
Grafana의 Graph 설정의 Metrics 항목에 설정하는 내용은 다음을 참고하십시오.
インターフェースから入ってくるトラフィック
SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND $timeFilter GROUP BY time(30s) fill(0)
インターフェースから入ってくるTCPトラフィック
SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND "protocol" = '6' AND $timeFilter GROUP BY time(30s) fill(0)
インターフェースから入ってくるトラフィックのうちCisco AVCでTwitterと識別されるトラフィック
SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND "app_id" = '218104325' AND $timeFilter GROUP BY time(30s) fill(0)
완성
여러 가지 시도해보십시오.
코멘트 등 환영합니다.
참고 자료
Reference
이 문제에 관하여(Grafana로 NetFlow v9 트래픽 분석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ishizaghi/items/b0ecd9fa50e503362165텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)