네트워크¶
3계층 네트워크 개요¶
graph TB
internet["인터넷"]
subgraph public["공인 IP (외부 노출)"]
eta_pub["eta<br/>141.164.53.203"]
end
subgraph wg["wg-admin (10.100.0.0/24)"]
direction LR
eta_wg["eta .1"]
psi_wg["psi .2"]
rho_wg["rho .3"]
tau_wg["tau .4"]
end
subgraph hs["Headscale (100.64.0.0/10)"]
direction LR
users["사용자 VPN 클라이언트"]
end
internet -- "80, 443, 10022" --> eta_pub
eta_pub --- eta_wg
eta_wg --- psi_wg
eta_wg --- rho_wg
eta_wg --- tau_wg
users -- "Magic DNS" --> eta_wg
users -- "Magic DNS" --> psi_wg
users -- "Magic DNS" --> tau_wg
| 레이어 | 기술 | 용도 | 대역 |
|---|---|---|---|
| WireGuard | wg-admin |
인프라 관리 (SSH, DB, 모니터링) | 10.100.0.0/24 |
| Headscale | Tailscale 호환 | 사용자 서비스 접근 | 100.64.0.0/10 |
| 공인 IP | nginx 리버스 프록시 | 외부 노출 (eta만) | 141.164.53.203 |
호스트 목록¶
| 호스트 | 공인 IP | wg-admin IP | 게이트웨이 | 위치 |
|---|---|---|---|---|
| eta | 141.164.53.203 | 10.100.0.1 | 141.164.52.1 | Vultr VPS |
| psi | 117.16.251.37 | 10.100.0.2 | 117.16.251.254 | KREN 네트워크 |
| rho | 10.80.169.39 | 10.100.0.3 | 10.80.169.254 | 랩 내부 (NAT) |
| tau | 10.80.169.40 | 10.100.0.4 | 10.80.169.254 | 랩 내부 (NAT) |
WireGuard (wg-admin)¶
인프라 관리용 메시 VPN입니다. SSH, DB, 모니터링 트래픽이 이 네트워크를 통합니다.
- 인터페이스:
wg-admin - 포트:
51820/UDP - 대역:
10.100.0.0/24 - PersistentKeepalive: 25초
NAT 뒤 호스트(rho, tau)는 엔드포인트가 없으며, 공인 IP 호스트(eta, psi)에 먼저 연결합니다.
Headscale (사용자 VPN)¶
사용자가 서비스에 접근하기 위한 Tailscale 호환 VPN입니다.
- 제어 서버:
https://hs.sjanglab.org - IPv4:
100.64.0.0/10 - Magic DNS:
sbee.lab - Split DNS:
sjanglab.org쿼리를 내부 DNS로 라우팅
ACL 그룹¶
Authentik 그룹과 15분마다 자동 동기화됩니다.
| 그룹 | 접근 태그 |
|---|---|
sjanglab-admins |
tag:ai, tag:apps, tag:monitoring |
sjanglab-researchers |
tag:ai, tag:apps |
sjanglab-students |
tag:apps |
ACL 태그 소유권¶
| 태그 | 소유 그룹 | 설명 |
|---|---|---|
tag:server |
sjanglab-admins |
서버 노드 |
tag:ai |
sjanglab-admins |
AI 서비스 (Ollama, Docling) |
tag:apps |
sjanglab-admins |
앱 서비스 (Nextcloud, n8n†) |
tag:monitoring |
sjanglab-admins |
모니터링 (Grafana) |
†n8n은 네트워크 수준에서
tag:apps로 접근 가능하나, Authentik Forward Auth에서 관리자만 허용합니다.
ACL 동기화 매커니즘¶
sequenceDiagram
participant T as systemd 타이머 (15분)
participant S as acl-sync 스크립트
participant A as Authentik API
participant H as Headscale
T->>S: 실행
S->>A: 그룹 멤버십 조회
A-->>S: 그룹/사용자 목록
S->>S: 정적 ACL + 동적 그룹 병합
S->>H: ACL 파일 갱신
H->>H: inotify 감지 → 리로드
- systemd 타이머가 15분마다
acl-sync스크립트를 실행 - Authentik API에서 그룹 멤버십을 조회
- 정적 ACL 규칙과 동적 그룹 정보를 병합하여 새 ACL 파일 생성
- Headscale이 inotify로 ACL 파일 변경을 감지하여 자동 리로드
방화벽 정책¶
공통¶
wg-admin인터페이스: 신뢰 (모든 포트 허용)- WireGuard:
51820/UDP
호스트별¶
| 호스트 | 외부 개방 포트 | wg-admin 개방 포트 |
|---|---|---|
| eta | 80, 443, 10022 (SSH + Rate limiting) | 10022 |
| psi | — | 10022, 5000 (Harmonia) |
| rho | — | 10022, 5432 (PostgreSQL), 3000 (Grafana) |
| tau | — | 10022, 5678 (n8n 웹훅) |
ACME 인증서¶
모든 TLS 인증서는 eta에서 Cloudflare DNS 챌린지로 발급됩니다. 다른 호스트(psi, tau)에는 acme-sync 사용자를 통해 rsync로 동기화됩니다.