본 글은 2025년 5월에 작성된 글이며, 현재 시점을 반영하지 않을 수 있습니다.
ServerForge/flows 설치
git clone https://github.com/ServerForge/flows
.env 생성
반드시 clone된 repo 폴더 안에서 생성할 것
GRAFANA_USERNAME="<GRAFANA_ADMIN_USERNAME>"
GRAFANA_PASSWORD="<GRAFANA_ADMIN_PASSWORD>"
pretag.map 설정
덮어쓰기 가능하며, set_label=<CHOICE_YOUR_ROUTER_NAME> ip=<SPLOW_ROUTER_IP> jeq=dir_tag 부분만 맨 위에 삽입 하는 것도 가능
set_label=<CHOICE_YOUR_ROUTER_NAME> ip=<SPLOW_ROUTER_IP> jeq=dir_tag
direction=1 set_tag=1 label=dir_tag
direction=0 set_tag=0
direction=1 set_tag=0 label=dir_tag_rev
direction=0 set_tag=1
sfacctd.conf 설정
덮어쓰기 가능하며, kafka_broker_host, kafka_broker_port 부분만 편집하는 것도 가능
plugins: kafka
aggregate: src_host, dst_host, src_port, dst_port, src_as, dst_as, proto, tag, label
kafka_output: json
kafka_broker_host: kafka
kafka_broker_port: 19092
kafka_topic: pmacct.acct
kafka_refresh_time: 5
kafka_history: 5m
kafka_history_roundoff: m
sfacctd_ext_sampling_rate: 1000
sfacctd_renormalize: true
sfacctd_as: bgp
networks_file_no_lpm: true
pre_tag_map: /etc/pmacct/pretag.map
sfacctd_as: longest
sfacctd_net: longest
networks_file: /etc/pmacct/networks.lst
bgp_daemon: true
bgp_daemon_max_peers: 10
bgp_agent_map: /etc/pmacct/peering_agent.map
peering_agent.map 생성 (선택)
BGP daemon 관련 매핑 테이블, 본인이 AS (BGP 서버) 운영하지 않는 이상 굳이 하지 않아도 됨.
bgp_ip=192.168.1.1 ip=0.0.0.0/0
docker-compose.yaml 생성
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=${GRAFANA_USERNAME}
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
networks:
- monitoring_net
sflow-collector:
image: pmacct/sfacctd:latest
container_name: sflow-collector
depends_on:
- kafka
restart: always
ports:
- "6343:6343/udp"
volumes:
- ./sfacctd.conf:/etc/pmacct/sfacctd.conf:ro
- ./networks.lst:/etc/pmacct/networks.lst:ro
- ./peering_agent.map:/etc/pmacct/peering_agent.map:ro
- ./pretag.map:/etc/pmacct/pretag.map:ro
networks:
- monitoring_net
flow-consumer:
image: serverforge/flow-consumer:v0.0.8-beta
container_name: flow-consumer
depends_on:
- kafka
- zookeeper
network_mode: "service:clickhouse"
restart: always
environment:
- brokers=kafka:19092
- topic=pmacct.acct
- database=dankflows
- policy=365 DAYS
zookeeper:
image: zookeeper
container_name: zookeeper
restart: always
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test: ["CMD-SHELL", "echo ruok | nc -w 2 zookeeper 2181"]
interval: 5s
timeout: 10s
retries: 3
networks:
- monitoring_net
kafka:
image: wurstmeister/kafka
container_name: kafka
hostname: kafka
restart: always
depends_on:
zookeeper:
condition: service_healthy
environment:
- KAFKA_ADVERTISED_LISTENERS=INSIDE://:19092,OUTSIDE://172.17.0.1:9092
- KAFKA_LISTENERS=INSIDE://kafka:19092,OUTSIDE://:9092
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
- KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE
- KAFKA_CREATE_TOPICS=pmacct.acct:3:1
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_LOG_RETENTION_HOURS=1
networks:
- monitoring_net
clickhouse:
image: clickhouse/clickhouse-server
container_name: clickhouse
restart: always
volumes:
- ./clickhouse-data:/var/lib/clickhouse/
- ./no_logging.xml:/etc/clickhouse-server/users.d/no_logging.xml
- ./disable_all_the_logs.xml:/etc/clickhouse-server/config.d/disable_all_the_logs.xml
- ./no_verbose.xml:/etc/clickhouse-server/config.d/no_verbose.xml
networks:
- monitoring_net
volumes:
grafana_data:
networks:
monitoring_net:
driver: bridge
Docker Compose 실행
다음 명령어 실행:
docker compose up -d
Clickhouse User 설정
패스워드 생성
enAg2PuT5TH20GuJqPbdjamWPOh8jzq9adZ32g5s 는 임의로 가정한 패스워드며, 실제로는 반드시 다른 패스워드를 사용할 것. (40자리 이상 권장)
echo -n "enAg2PuT5TH20GuJqPbdjamWPOh8jzq9adZ32g5s" | sha256sum
=> 54b70569ce4160d2a3e4b2a2a15b59e070dd8674a5f8eb4d960d282636fc932b
유저 등록
docker compose exec -it clickhouse clickhouse-client
실행 후, 다음 쿼리문 한줄씩 입력하여 쿼리 실행.
단, <CLICKHOUSE_USERNAME>을 Clickhouse에서 사용할 유저이름으로 대치하여 기입 할 것.
아래 쿼리문에 나와있는 54b70569ce4160d2a3e4b2a2a15b59e070dd8674a5f8eb4d960d282636fc932b 은 임의로 가정한 패스워드의 해시값이며, 실제로는 반드시 다른 패스워드의 해시값을 사용 할 것.
CREATE USER <CLICKHOUSE_USERNAME> IDENTIFIED WITH SHA256_HASH BY '54b70569ce4160d2a3e4b2a2a15b59e070dd8674a5f8eb4d960d282636fc932b' DEFAULT DATABASE dankflows;
GRANT ALL ON dankflows.* TO <CLICKHOUSE_USERNAME>;
SQL 쉘 세션 종료는 exit 명령으로 종료 할 수 있다.
sFlow 주입
Sampling Rate는 1000이 권장되며, :6343에 sFlow 메트릭을 꼽아주면 된다.
Grafana 설정
정상적으로 설정되었다면, :3000으로 Grafana가 호스트 되고 있을 것이다.
이후, 로그인하여 대시보드로 들어가서 다음 절차로 Datasource 추가를 마무리한다.
- Datasource 구성에서 Clickhouse Extension을 설치하고 Prometheus 연결과 동일하게 Datasource를 추가할 수 있다.
- Server address는
clickhouse, Server port는9000이며, Protocol은native로 선택하면 된다. - Username과 Password는 이전 단계에서 준비했던 정보를 넣어주고 Save 하면 된다.
권장 Dashboard
메트릭이 정상적으로 수집되면 다음과 같은 맞춤형 Dashboard를 쓸 수 있다.
https://grafana.com/grafana/dashboards/20502-sflow-analytics/
Dashboard ID는 20502다.