✏️ 개요
컴퓨터 네트워크는 물리적 연결부터 모바일 및 웹 애플리케이션에 이르기까지 모든 계층을 포괄한다.
이러한 다양한 네트워크 유형은 사용자들 간의 연결망을 형성하며, 복잡한 구조를 가진다.
GraphDB는 이러한 컴퓨터 네트워크를 모델링, 저장, 질의하는데 자연스럽고 직관적인 방법을 제공한다.
GraphDB는 다음과 같은 용도로 활용될 수 있다 :
- 구성 관리 : 장비, 애플리케이션, 서비스 간의 관계 및 설정 관리
- 영향 분석 : 장애나 변경이 다른 구성요소에 어떤 영향을 미치는지 파악
- 네트워크 계획 및 설계 : 신규 네트워크 구성, 확장, 최적화 방안 수립
- 보안 및 하드닝 : 취약점 분석, 접근 제어 최적화
- 침입 탐지 : 비정상적 흐름이나 연결 탐지
- 트래픽 분석 : 흐름과 병목 지점 식별
- 사용자 행동 분석: 애플리케이션 및 네트워크 상의 사용자 행위 분석
데이터 구성을 살펴보면
CALL db.schema.visualization()
계층별 구성 설명
1. 데이터센터 DataCenter
▪️ 10.x.x.x/8 IP 범위를 사용
▪️ Egress Router를 통해 interconnect와 연결
2. Zone
▪️ 각 Zone은 10.zone.*/16 IP를사용
▪️ 각 Zone은 전용 라우터로 백본과 연결됨
3. Rack
▪️ Zone 내에는 여러 랙이 존재
▪️ 각 랙은 자체 Switch를 통해 Zone 라우터에 연결됨
4. 서버
▪️ 각 랙은 여러 종류의 서버 보유
▪️ 서버의 NW interface는 랙의 스위치와 연결됨
▪️ IP 범위 : 10.zone.rack.*/24
5. 운영체제 / 가상화 환경
▪️ 실제 OS 또는 가상화 매니저(VM Manager)가 구동됨
▪️ 가상머신 위에 하나의 애플리케이션이 구동됨
6. 애플리케이션 -> 포트
▪️ 각 애플리케이션은 외부 인터페이스의 여러 포트를 사용함
✏️ Network Exploration
📌 DataCenter and Zones
이 섹션에서는 DataCenter, 그에 연결된 Router, Interface, Network 등 데이터센터 내부 구성 요소를 그래프 쿼리로 탐색한다.
1. 데이터 센터 및 라우터 조회
MATCH network = (dc: DataCenter {name:"DC1", location: "Iceland, Rekjavik"})
-[:CONTAINS]->(:Router)
-[:ROUTES]->(:Interface)
RETURN network;
지정한 데이터센트가 보유(Contains)한 라우터를 따라가고, 그 라우터가 라이팅(routes)하는 인터페이스까지 탐색하는 쿼리다.
전체 경로 network를 반환!
2. 각 Zone의 네트워크 연결
MATCH (dc:DataCenter {name:"DC1"})-[:CONTAINS]->(re:Router:Egress)-[:ROUTES]->(rei:Interface)
MATCH (nr:Network:Zone)<-[:CONNECTS]-(rei)
MATCH (dc)-[:CONTAINS]->(r:Router)-[:ROUTES]->(ri:Interface)-[:CONNECTS]->(nr)
RETURN *;
여기서 (re:Router:Egress) 와 같은 처음보는 표현이 나와 찾아보니,
Router이면서 Egress 라벨을 가진 노드를 찾을 때 쓰는 표현이라고 한다!
위 구문은, DC1 내 Egress Router가 인터페이스를 통해 특정 Zone 네트워크(nr)에 연결되는 패턴을 탐색하고 있다.
각 Zone은 10.zone.*/16 형식의 독립 네트워크를 가지고,
그 외에도 DcC1에 포함된 일반 Router들까지 포함해 전체 Zone 구성을 파악한다.
3. DataCenter로부터 3단계 거리의 모든 Network 시각화
MATCH path = (dc: DataCenter)-[*3]-(:Network)
RETURN path;
4. Zone별 라우터 및 인터페이스 주소 정보 수집
MATCH (r:Router)-[:ROUTES]->(ri:Interface)-[:CONNECTS]->(nr:Network)
WHERE r.zone IS NOT NULL
RETURN nr.ip as network_ip, ri.ip as router_if_ip, r.name as router, r.zone as zone;
라우터 → 인터페이스 → 네트워크의 연결 구조를 따라 각 zone에 할당된 ip 정보, 라우터 이름, 인터페이스 주소를 정리한 표 반환
📌 Racks
각각의 zone은 10개의 racks를 가지고 있고, 각각은 고유의 switch와 10.zone.rack.*/24형태의 IP를 가진 서브넷으로 구성되어있다.
- 랙 탐색 쿼리
MATCH (dc:DataCenter {name:"DC1"})
-[:CONTAINS]->(rack:Rack)
-[:HOLDS]->(s:Switch)
-[:ROUTES]->(si:Interface)
<-[:ROUTES]-(nr:Network:Zone)
RETURN *;
DataCenter -> Rack -> Switch -> Interface -> Zone 네트워크
각 컴포넌트가 어떤 방식으로 연결되어 있는지 추적 가능
- 네트워크 전체 시각화 (6단계 거리까지)
MATCH network = (dc:DataCenter)-[*6]-(:Rack)
RETURN network;
📌 Network Connectivity
현재 상태 : 최단 경로 기반 연결 확인
MATCH path = allShortestPath((rack:Rack)-[:HOLDS|ROUTES|CONNECTS*]-(router:Router:Egress))
RETURN length(path) AS hops, count(*) AS count;
모든 랙(Rack)에서 Egress Router까지의 최단 경로 수와 경로 길이(hops 수)를 계산
✨ 여러 라벨을 가지는 노드
GraphDB에서는 하나의 노드가 다양한 역할이나 타입을 가질 수 있도록 여러 개의 라벨을 동시에 부여할 수 있다.
하지만 왜 이렇게 여러 라벨을 부여하는 것일까?
1. 상속 관계처럼 세부 타입 표현
(:Device:Router)
(:Device:Switch)
(:Device:Firewall)
Device는 공통 상위 개념이고, Router와 Switch는 하위 유형으로 표현 가능하다!
2. 역할별 다중 분류
(:Person:Employee)
(:Person:Customer)
Person은 기본 개념이고, Employee와 Customer는 역할에 해당한다.
🔹 케이블 장애 시뮬레이션 : 첫 번째 스위치 연결 제거
MATCH (:Interface {ip:"10.1.1.254"})<-[rel:ROUTES]-(:Network)
DELETE rel
IP가 10.1.1.254인 인터페이스와 네트워크 간의 ROUTES 관계를 제거하여
해당 스위치의 케이블이 끊어졌다고 가정한 것!
▶ 결과 : 연결 감소
MATCH path = allShortestPath((rack:Rack)-[:HOLDS|ROUTES|CONNECTS*]-(router:Router:Egress))
RETURN length(path) AS hops, count(*) AS count;
위 구문으로 결과를 확인해보면 경로 수가 40에서 39로 감소해있을 것이다.
해당 랙의 모든 서버가 Egress Router로부터 격리된 것이다.
🔻 problem : 특정 랙의 연결 상태를 확인하면 결과가 없다. 완전 단절된 것!!
MATCH connection = allShortestPaths((rack:Rack {name:"DC1-RCK-1-1"})-[:HOLDS|ROUTES|CONNECTS*]-(router:Router:Egress))
RETURN connection;
결과가 null이 나올 것이다,,
▶ 해결 방법 : 네트워크 연결 redundancy 추가!
🔹 모든 스위치의 인터페이스를 모든 Zone 네트워크에 연결 :
//모든 Zone 네트워크 찾기
MATCH (nr:Network:Zone)
//스위치와 그 인터페이스 찾기
MATCH (s:Switch)-[:ROUTES]->(si:Interface)
//아직 연결되지 않은 경우 연결 생성
MERGE (si)<-[:ROUTES]-(nr);
이로써 하나의 네트워크 장애가 발생해도 3개 대체 경로가 유지된다.
🔹 중복 연결 후 전체 경로 상태 확인
다시 경로 상태를 확인해보면, 총 160개 경로로 모든 랙이 여러 경로로 연결된 것을 확인할 수 있을 것이다.
🔹 다시 첫 번째 케이블 제거
MATCH (:Interface {ip:"10.1.1.254"})<-[rel:ROUTES]-(:Network)
WITH rel LIMIT 1
DELETE rel
하지만 이번에는 대체 경로로 여전히 연결이 유지된 것을 확인할 수 있다!
MATCH path = allShortestPaths((rack:Rack {zone:1, rack:1})-[:HOLDS|ROUTES|CONNECTS*]-(router:Router:Egress))
RETURN path;
zone:1, rack:1 위치의 랙은 여전히 Egress Router와 연결 가능하다.
경로가 존재하므로, 연결 끊김 방지에 성공한 것!
📌 Machine Types
각 머신 타입은 CPU / RAM / 디스크 용량을 보유하고 있다.
각 Rack에는 200대의 머신, 총 4 Zone x 10 Racks x 200대 = 8,000대가 있고
성능이 낮은 머신일수록 수량이 많음을 확인할 수 있다 → 비용 효율성 기반!
MATCH (r:Rack)-[:HOLDS]->(m:Machine)-[:Type]->(type:Type)
RETURN properties(type) as type, count(*) as c
ORDER BY c DESC;
name | CPU | RAM | DISK | 수량 |
xs-1/1/1 | 1 | 1 | 1GB | 2080 |
s-2/4/5 | 2 | 4 | 5GB | 3760 |
m-4/16/25 | 4 | 16 | 25GB | 1360 |
l-8/64/125 | 8 | 64 | 125GB | 520 |
xl-16/256/625 | 16 | 256 | 625GB | 200 |
xxl-32/1024/3125 | 32 | 1024 | 3125GB | 80 |
전체 리소스를 총합해보면
MATCH (m:Machine)-[:TYPE]->(type:Type)
RETURN count(*) as count, sum(type.cpu) as cpus, sum(type.ram) as ram, sum(type.disk) as disk;
총 머신 | CPU 합계 | RAM 합계 | DISK 합계 |
8000 | 24,960 | 205,280GB | 494,880GB |
🔹 Rack 내 개별 조회 및 시각화
MATCH (r:Rack {name:"DC1-RCK-2-1"})-[:HOLDS]->(m:Machine),
(m)-[:ROUTES]->(i:Interface)-[:CONNECTS]->(si)<-[:ROUTES]-(s:Switch),
(m)-[:TYPE]->(type:Type)
RETURN *
또는 통계 요약:
MATCH (r:Rack {name:"DC1-RCK-2-1"})-[:HOLDS]->(m:Machine),
...
RETURN r.name, si.ip, properties(type), count(m), min(i.ip), max(i.ip)
🔹 소프트웨어 모델링 (OS, 애플리케이션, 서비스)
- 구성요소 : OS / Application / Service로 구분
MATCH (o:OS:Software)-[:VERSION]->(v)
OPTIONAL MATCH (v)<-[:PREVIOUS]-(vnext)
RETURN o.name, v.name, vnext.name
- 다른 소프트웨어 확인
MATCH (s:Software) WHERE NOT s:OS
OPTIONAL MATCH (s)-[:VERSION]->(v)
OPTIONAL MATCH (s)-[:DEPENDS_ON]->(dv)<-[:VERSION]-(d)
RETURN s.name, collect(v.name), dependencies, s.ports;
🔹 머신에서 실행 중인 소프트웨어 확인
MATCH (m:Machine) WHERE (m)-[:RUNS]->() AND rand() < 0.05 WITH m LIMIT 1
MATCH (m)-[r:RUNS]->(p:Process)-[i:INSTANCE]->(sv)
OPTIONAL MATCH (sv)<-[v:VERSION]-(sw)
RETURN *
🔹 소프트웨어 의존성 분석
MATCH (s)-[:DEPENDS_ON]->(nv:Version)<-[:VERSION]-(n:Software:Service {name:"neo4j"})
MATCH (s)<-[:INSTANCE]-(sp)<-[:RUNS]-(sm:Machine)
MATCH (sp)-[DEPENDS_ON]->(np)-[:INSTANCE]->(nv)
MATCH (np)<-[:RUNS]-(nm:Machine)
RETURN sm, sp, s, nv, np, nm
🔹구성 관리 (Configuration Management) 및 CMDB 시나리오
▪️ OS 버전 업데이트 대상 식별
MATCH (os:OS:Software)-[:VERSION]->(newVersion)
WHERE os.name = 'Debian' and newVersion.name = '8-Jessie'
MATCH (m:Machine)-[:RUNS]->(op:OS:Process)-[:INSTANCE]->(currentVersion)
WHERE (currentVersion)<-[:PREVIOUS*]-(newVersion)
// 업데이트 요청 생성
CREATE (m)-[:UPDATE_TO {ts:timestamp()}]->(newVersion)
▪️ 업데이트 대상 머신 조회
MATCH (r:Rack)-[:HOLDS]->(m:Machine)-[:UPDATE_TO]->(vNew:Version)<-[:VERSION]-(os:OS:Software)
MATCH (m)-[:RUNS]->(:OS:Process)-[:INSTANCE]->(vCurr)
WHERE vCurr <> vNew
RETURN r.name, m.name, os.name, vCurr.name, vNew.name
▪️ 실제 업데이트시, OS 인스턴스 교체
MATCH (m:Machine)-[:UPDATE_TO]->(vNew:Version)<-[:VERSION]-(os:OS:Software)
MATCH (m)-[:RUNS]->(op:OS:Process)-[:INSTANCE]->(vCurr)
WHERE vCurr <> vNew
CREATE (m)-[:RUNS]->(opNew:OS:Process)-[:INSTANCE]->(vNew)
DETACH DELETE op;
▪️ 완료된 업데이트 요청 제거
MATCH (m:Machine)-[update:UPDATE_TO]->(v:Version)<-[:VERSION]-(os:OS:Software)
WHERE (m)-[:RUNS]->(:OS:Process)-[:INSTANCE]->(v)
DELETE update;
🔹 실시간 네트워크 모니터링의 필요성
▶ 목적
- 원활한 운영 유지: 장애 예방, 병목 탐지, 유지보수 계획
- 보안 감시: 공격/위협 감지, 방화벽 규칙 위반 탐지
- 구성 변경 추적: 장비 및 서비스 상태 실시간 동기화
▶ 정보 수집 방식
- 네트워크 트래픽 분석 + 포트 스캔
- 서버 에이전트가 상태를 보고 → 중앙 DB or 그래프 갱신
▪️실시간 연결 추적 : 연결 이벤트 처리 흐름
- 시나리오 : 랜덤 머신 간 연결 이벤트 생성
MATCH (m:Machine)
WITH collect(m) as machines, size(machines) as len
UNWIND range(1,10) as idx
WITH machines[toInteger(rand()*len)] as source, machines[toInteger(rand()*len)] as target
MATCH (source)-[:ROUTES]->(si:Interface)-[:EXPOSES]->(sp:Port)<-[:LISTENS]-(sourceAppProcess)-[:INSTANCE]->(sourceApp)
MATCH (target)-[:ROUTES]->(ti:Interface)-[:EXPOSES]->(tp:Port)<-[:LISTENS]-(targetAppProcess)-[:INSTANCE]->(targetApp)
RETURN {
id: randomUUID(),
type: "OpenConnection",
source: {ip: si.ip, port: sp.port},
target: {ip: ti.ip, port: tp.port},
connection: {
source: sourceApp.name,
target: targetApp.name,
user: "user" + toString(toInteger(rand()*1000)) + "@" + source.name,
time: timestamp(),
packets: 1,
mtu: 1500
}
} as event
- 연결 이벤트를 그래프에 반영
UNWIND $events AS event
WITH event WHERE event.type = 'OpenConnection'
MERGE (si:Interface {ip:event.source.ip})
MERGE (si)-[:OPENS]->(sp:Port {port: event.source.port})
MERGE (ti:Interface {ip:event.target.ip})
MERGE (ti)-[:LISTENS]->(tp:Port {port:event.target.port})
CREATE (sp)<-[:FROM]-(c:Connection {id:event.id})–[:TO]->(tp)
SET c += event.connection
MERGE (si)-[cstats:CONNECTIONS]->(ti)
SET si.count = coalesce(si.count,0) + 1
SET si.packets = coalesce(si.packets,0) + event.packets
SET si.volume = coalesce(si.volume,0) + event.packets * event.mtu
▪️ 연결 기록 시각화 및 분석
- 시간별 연결량 분석
MATCH (si:Interface)-[:OPENS]->(sp:Port)<-[:FROM]-(c:Connection)–[:TO]->(tp:Port)<-[:LISTENS]-(ti:Interface)
WHERE c.type = 'OpenConnection'
RETURN
si.ip as source,
ti.ip as target,
apoc.date.format(c.time,'ms','yyyy-MM-dd HH') as hour,
count(distinct c) as count
ORDER BY hour ASC, count DESC
LIMIT 100;
▪️IT 자산 및 상태 데이터 활용 사례
예시
- 상시 감시: 공격, 비정상 흐름, DMZ 위반 등
- 대시보드: 리소스 소비 요약
- 조치 기록: 장애 조치, 패치, 업데이트
- 감사/법적 요건 대응: M&A 시 실시간 인벤토리 제공
▪️ 모니터링 Use Cases
- 소프트웨어 인스턴스 별 런타임 측정
MATCH (v)<-[:INSTANCE]-(sp:Process)<-[:RUNS]-(sm:Machine)
MATCH (s:Software)-[:VERSION]->(v:Version)
WITH s.name as software, v.name as version, timestamp() - sp.startTime as runtime
RETURN software, version, count(*) as instances, { min: min(runtime), max: max(runtime), avg:avg(runtime) } as runtime
- 인터페이스 간 트래픽 분석
MATCH path = (source:Interface)-[con:CONNECTIONS]->(target:Interface)
RETURN source.ip, target.ip, sum(con.packets) as packets, sum(con.volume) as volume
▪️ 리소스 관리 그래프 (ex. Kubernetes, Mesos 등)
▶ 실행 조건 기반 소프트웨어 배치
- 소프트웨어 정의 : 이름, 버전, 포트, 의존성, CPU/RAM/DISK 요구량
- 스케줄러 역할 : 사용 가능한 자원 파악, 인스턴스 배치 및 재할당, 헬스체크, 재시작, 재라우팅 수행
▶ 그래프 모델링 가치
- 실시간 자원 상태 > 배치 시각화
- 디스크 재사용, co-location 정책 등 모델링 가능
- 리소스 충돌, 낭비, 과부하 식별 가능
'Work > GraphDB' 카테고리의 다른 글
[Neo4j Sandbox Data 활용 7] Women's World Cup Sandbox (0) | 2025.05.30 |
---|---|
[Neo4j Sandbox Data 활용 5] Crime Investigation (0) | 2025.05.23 |
GraphDB를 활용한 자연어질의 처리 with LLM (0) | 2025.05.19 |
[Neo4j Sandbox Data 활용 4] ICIJ OffShoreleaks (0) | 2025.05.19 |
[Neo4j Sandbox Data 활용 3] OpenStreetMap 데이터 활용하기 (0) | 2025.05.07 |