From 56c165dc367e9132bcfa5fa3f7d07a5a5e9e3c69 Mon Sep 17 00:00:00 2001 From: brandon Date: Mon, 30 Mar 2026 16:21:46 +0900 Subject: [PATCH] Add network-plan.md --- network-plan.md | 386 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 386 insertions(+) create mode 100644 network-plan.md diff --git a/network-plan.md b/network-plan.md new file mode 100644 index 0000000..daeda85 --- /dev/null +++ b/network-plan.md @@ -0,0 +1,386 @@ +# Network & Migration Plan + +## 현재 구조 (AS-IS) — 2026-03-30 기준 + +``` + ┌─────────────────────────────────────┐ + │ ISP (SK브로드밴드) │ + │ WAN: 39.122.244.108 (동적) │ + └──────────────┬──────────────────────┘ + │ + ┌──────────────┴──────────────────────┐ + │ TP-Link Archer AXE75 (라우터) │ + │ LAN: 192.168.0.254 │ + │ WireGuard VPN: 51820/UDP │ + │ DHCP: .200 ~ .253 │ + │ │ + │ 포트포워딩: │ + │ :80 → .100:10080 (Let's Encrypt)│ + │ :443 → .100:443 (Caddy HTTPS) │ + │ :24242 → .100:22 (SSH) │ + │ + 레거시 포트 다수 (정리 예정) │ + └──────────────┬──────────────────────┘ + │ + ┌────────────────────┴────────────────────────┐ + │ 서버 (192.168.0.100, coala) │ + │ Ubuntu 20.04 / i9-10900K / 64GB │ + │ HDD 2TB (191GB 사용) │ + │ │ + │ ┌─── Caddy v2.11.2 (리버스 프록시) ───┐ │ + │ │ :443 ← 외부 HTTPS 진입점 │ │ + │ │ auto Let's Encrypt SSL │ │ + │ │ │ │ + │ │ git.0022222.xyz → localhost:3000 │ │ + │ │ gitlab.0022222.xyz → localhost:8443 │ │ + │ │ tb.0022222.xyz → localhost:10500 │ │ + │ │ cm.0022222.xyz → localhost:10501 │ │ + │ │ cb.0022222.xyz → localhost:10590 │ │ + │ │ gw.0022222.xyz → localhost:15002 │ │ + │ │ gw-qa.0022222.xyz → localhost:15005 │ │ + │ │ cc.0022222.xyz → localhost:10513 │ │ + │ │ jenkins.0022222.xyz→ localhost:8080 │ │ + │ │ pve.0022222.xyz → localhost:8006 │ │ + │ └──────────────────────────────────────┘ │ + │ │ + │ ┌─── Docker 컨테이너 ──────────────────┐ │ + │ │ gitea :3000 (Git 호스팅) │ │ + │ │ tb-api :10500 (TrainBoard) │ │ + │ │ cm-api :10501 (CultureMakers) │ │ + │ │ cheeseboard :10590 (CheeseBoard) │ │ + │ │ tb-db :33306 (MySQL) │ │ + │ │ cm-db :33308 (MySQL) │ │ + │ │ cheeseboard-db:33309 (MySQL) │ │ + │ │ gitlab-runner │ │ + │ └──────────────────────────────────────┘ │ + │ │ + │ ┌─── 네이티브 서비스 ──────────────────┐ │ + │ │ GitLab Omnibus :8443 (레거시, HTTP) │ │ + │ │ Jenkins :8080 │ │ + │ │ PostgreSQL :5432 │ │ + │ │ GroupWare :15002 / :15005 (QA) │ │ + │ │ ChordCourse :10513 │ │ + │ └──────────────────────────────────────┘ │ + └──────────────────────────────────────────────┘ + + ┌─── VPN 클라이언트 (외부) ──────────┐ + │ brandon: 10.5.5.2/32 │ + │ → 192.168.0.0/24 접근 가능 │ + │ → Endpoint: 39.122.244.108:51820 │ + └────────────────────────────────────┘ +``` + +### WAN 정보 +| 항목 | 값 | +|------|-----| +| ISP | SK브로드밴드 | +| 연결 유형 | 동적 IP (DHCP) | +| WAN IP | 39.122.244.108 (변경될 수 있음) | +| WAN Gateway | 39.122.244.1 | +| DNS | 210.220.163.82 / 219.250.36.130 | + +### TP-Link 설정 +| 항목 | 값 | +|------|-----| +| LAN IP | 192.168.0.254 | +| 서브넷 | 255.255.255.0 | +| DHCP 범위 | 192.168.0.200 ~ .253 | +| 관리자 비밀번호 | (설정됨) | +| WireGuard VPN | 활성 (51820/UDP) | +| MAC | BC-07-1D-3C-CF-D8 | + +### TP-Link 포트포워딩 (현재) +| 서비스 | 외부포트 | 내부포트 | 대상 | 상태 | 비고 | +|--------|----------|----------|------|------|------| +| gitlab | 443 | 443 | .100 | 활성 | Caddy HTTPS | +| gitlab_hook | 5050 | 5050 | .100 | 활성 | | +| lets_encrypt | 80 | 10080 | .100 | 활성 | ⚠️ 80→80으로 변경 필요 | +| ssh | 24242 | 22 | .100 | 활성 | | +| TB_mvp_back | 10600 | 10600 | .100 | 활성 | 레거시 | +| CM-back | 10601 | 10601 | .100 | 활성 | 레거시 | +| bjsrtest_back | 10501 | 10501 | .100 | 활성 | 레거시 | +| CheeseBoard | 10503 | 10503 | .100 | 활성 | 레거시 | +| CC_frontend | 10510 | 10510 | .100 | 활성 | 레거시 | +| CC_backend | 10511 | 10511 | .100 | 활성 | 레거시 | +| CC_mysql | 10512 | 10512 | .100 | 활성 | ⚠️ DB 노출 | +| Groupware_Dev | 15001 | 15001 | .100 | 활성 | 레거시 | +| Groupware_swagger | 15003 | 15003 | .100 | 활성 | 레거시 | +| Groupware_qa | 15004 | 15004 | .100 | 활성 | 레거시 | +| Groupware_mysql | 33307 | 33307 | .100 | 활성 | ⚠️ DB 노출 | +| TB_mysql | 33306 | 33306 | .100 | 활성 | ⚠️ DB 노출 | +| bjsrtest_mysql | 33308 | 33308 | .100 | 활성 | ⚠️ DB 노출 | +| jenkins | 8889 | 28080 | .100 | 활성 | ⚠️ 관리 노출 | +| kisa_test | 9797 | 9797 | .100 | 활성 | ⚠️ 삭제 대상 | +| bjsrtest_frt1 | 13000 | 13000 | .100 | 활성 | ⚠️ 삭제 대상 | +| bjsrtest_frt2 | 13001 | 13001 | .100 | 활성 | ⚠️ 삭제 대상 | +| BM_rdp | 2765 | 2765 | .15 | 활성 | ⚠️ 삭제 대상 | +| flask_test | 5000 | 5000 | .48 | 활성 | ⚠️ 삭제 대상 | +| rdp | 2588 | 3389 | .48 | 활성 | ⚠️ 삭제 대상 | + +### DHCP 예약 +| 장치 | MAC | IP | +|------|-----|-----| +| 서버 (coala) | B4-2E-99-F6-D0-65 | 192.168.0.100 | +| DESKTOP-N2D0NAM | D4-5D-64-B0-6B-7F | 192.168.0.48 | +| DESKTOP-8NDJGE9 | 0C-7A-15-8B-AE-E3 | 192.168.0.2 | + +### WireGuard VPN +| 항목 | 값 | +|------|-----| +| 터널 IP | 10.5.5.1/32 | +| 수신 포트 | 51820/UDP | +| 클라이언트 액세스 | 인터넷 & 홈네트워크 | +| 계정: brandon | 10.5.5.2/32 | + +### 서브도메인 (Cloudflare DNS — 0022222.xyz) +| 서브도메인 | 대상 | 서비스 | +|------------|------|--------| +| git.0022222.xyz | → Caddy → :3000 | Gitea | +| gitlab.0022222.xyz | → Caddy → :8443 | GitLab (레거시) | +| tb.0022222.xyz | → Caddy → :10500 | TrainBoard API | +| cm.0022222.xyz | → Caddy → :10501 | CultureMakers API | +| cb.0022222.xyz | → Caddy → :10590 | CheeseBoard API | +| gw.0022222.xyz | → Caddy → :15002 | GroupWare | +| gw-qa.0022222.xyz | → Caddy → :15005 | GroupWare QA | +| cc.0022222.xyz | → Caddy → :10513 | ChordCourse | +| jenkins.0022222.xyz | → Caddy → :8080 | Jenkins | +| pve.0022222.xyz | → Caddy → :8006 | Proxmox (미설치) | + +### 외부 접속 방법 +| 대상 | 방법 | +|------|------| +| 서버 SSH | `ssh -p 24242 brandon@39.122.244.108` | +| Gitea | `https://git.0022222.xyz` | +| 모든 웹 서비스 | `https://{서브도메인}.0022222.xyz` | +| 공유기 관리 | VPN 접속 후 `https://192.168.0.254` | + +--- + +## Gitea 레포지토리 (GitLab에서 마이그레이션 완료 — 33개) + +``` +Gitea (https://git.0022222.xyz) +│ +├── cheeserush (15) +│ ├── at-thermo ├── cm ├── cm-back +│ ├── cm-monorepo ├── cheeseboard ├── be-template +│ ├── fobl_landingpage ├── homepage ├── jenkins_test +│ ├── medigo-poc ├── onboarding ├── schindler-sso +│ ├── suneeds-homepage ├── tb_mvp_back └── tb_mvp_front +│ +├── bjsl (7) +│ ├── bjsl-admin-app ├── bjsl-admin-web ├── bjsl-back +│ ├── bjsl-forus-web ├── bjsl-monorepo ├── bjsl-user-app +│ └── bjsl-user-app-android +│ +├── chordcourse (3) +│ ├── back ├── deploy └── front +│ +├── groupware (3) +│ ├── back-end ├── cheeseoffice-landing └── front-end +│ +├── okmoneyletter (3) +│ ├── admin-front ├── back └── front +│ +├── mini-apps (1) +│ └── seoul-metro-time +│ +└── rush (1) + └── signal_arena +``` + +--- + +## 보안 긴급 조치 (Phase 0.5) + +### 즉시 삭제할 포트포워딩 +| 규칙 | 이유 | +|------|------| +| TB_mysql (33306) | DB 외부 노출 | +| Groupware_mysql (33307) | DB 외부 노출 | +| bjsrtest_mysql (33308) | DB 외부 노출 | +| CC_mysql (10512) | DB 외부 노출 | +| jenkins (8889) | 관리 페이지 노출 | +| BM_rdp (2765) | 미사용 장비 RDP | +| flask_test (5000) | 미사용 장비 | +| rdp (2588) | 미사용 장비 RDP | +| kisa_test (9797) | 테스트용 | +| bjsrtest_frt1 (13000) | 테스트용 | +| bjsrtest_frt2 (13001) | 테스트용 | + +### 서버 보안 조치 +- [ ] PostgreSQL: listen_addresses → localhost +- [ ] SSH: PasswordAuthentication → no +- [ ] MySQL Docker: 0.0.0.0 바인딩 → 127.0.0.1 (tb-db, cm-db, cheeseboard-db) +- [ ] 불필요 사용자 계정 정리 + +### Caddy 전환 후 추가 삭제 가능 (레거시 포트포워딩) +| 규칙 | 조건 | +|------|------| +| 모든 개별 서비스 포트 (10500~15005) | Caddy 서브도메인으로 대체 완료 시 | +| ssh (24242) | VPN으로만 접속 시 | +| gitlab_hook (5050) | Gitea webhook 전환 후 | +| lets_encrypt (80→10080) | 80→80 변경 또는 Caddy 직접 수신 | + +--- + +## 목표 구조 (TO-BE): Proxmox + 서브도메인 기반 + +``` + ┌─────────────────────────────────────┐ + │ ISP (SK브로드밴드) │ + └──────────────┬──────────────────────┘ + │ + ┌──────────────┴──────────────────────┐ + │ TP-Link Archer AXE75 │ + │ 포트포워딩: 80, 443 → .101 │ + │ WireGuard VPN: 51820/UDP │ + └──────────────┬──────────────────────┘ + │ + ┌────────────────────────────┴────────────────────────────┐ + │ Proxmox 호스트 (192.168.0.100) │ + │ SSD / i9-10900K / 64GB │ + │ │ + │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────┐ ┌─────┐ │ + │ │CT101 │ │CT102 │ │CT103 │ │CT104 │ │CT105│ │ + │ │Caddy │ │Gitea │ │Apps │ │DB │ │CI │ │ + │ │.101 │ │.102 │ │.103 │ │.104 │ │.105 │ │ + │ │:80/:443 │ │:3000 │ │Docker │ │PG │ │Jenk │ │ + │ │ │→│ │ │TB,CM,CB │ │MySQL │ │Gitea│ │ + │ │ │→│ │ │GW,CC │ │ │ │Runr │ │ + │ └─────────┘ └─────────┘ └─────────┘ └──────┘ └─────┘ │ + └────────────────────────────────────────────────────────┘ + + 외부 → :80/:443 → CT101 (Caddy) → 서브도메인별 라우팅 + VPN → 직접 접근 (Proxmox :8006, Jenkins, DB 등) +``` + +### IP 할당 +| IP | 역할 | 비고 | +|----|------|------| +| 192.168.0.254 | TP-Link 라우터 | 관리 웹UI | +| 192.168.0.100 | Proxmox 호스트 | 관리 웹UI (8006) | +| 192.168.0.101 | CT: Reverse Proxy | Caddy — 외부 유일 진입점 | +| 192.168.0.102 | CT: Gitea | GitLab 대체 | +| 192.168.0.103 | CT: 웹앱 (Docker) | TrainBoard, CM, CheeseBoard, GroupWare 등 | +| 192.168.0.104 | CT: DB | PostgreSQL + MySQL (내부만 접근) | +| 192.168.0.105 | CT: Jenkins/CI | Jenkins + Gitea Runner | + +### 라우터 포트포워딩 (최종) +| 외부 포트 | 내부 대상 | 용도 | +|-----------|-----------|------| +| 80 | 192.168.0.101:80 | HTTP → HTTPS 리다이렉트 + Let's Encrypt | +| 443 | 192.168.0.101:443 | 모든 HTTPS 트래픽 | +| 51820/UDP | (라우터 자체) | WireGuard VPN | + +→ 기존 포트포워딩 규칙 **전부 폐쇄** +→ 외부에서는 80/443/51820만 열림 +→ SSH, DB, 관리 포트는 VPN 전용 + +### 서브도메인 → 서비스 매핑 (최종) +| 서브도메인 | 백엔드 | 비고 | +|------------|--------|------| +| git.0022222.xyz | 192.168.0.102:3000 | Gitea | +| tb.0022222.xyz | 192.168.0.103:10500 | TrainBoard API | +| cm.0022222.xyz | 192.168.0.103:10501 | CultureMakers API | +| cb.0022222.xyz | 192.168.0.103:10590 | CheeseBoard API | +| gw.0022222.xyz | 192.168.0.103:15002 | GroupWare | +| gw-qa.0022222.xyz | 192.168.0.103:15005 | GroupWare QA | +| cc.0022222.xyz | 192.168.0.103:10513 | ChordCourse | + +### VPN 전용 접근 +| 대상 | 접근 방법 | +|------|-----------| +| Proxmox 관리 | `https://192.168.0.100:8006` | +| Jenkins | `http://192.168.0.105:8080` | +| DB (MySQL/PG) | `192.168.0.104:3306/5432` | +| 라우터 관리 | `https://192.168.0.254` | + +### DNS 레코드 (0022222.xyz — Cloudflare) +``` +*.0022222.xyz A 39.122.244.108 +0022222.xyz A 39.122.244.108 +``` +참고: WAN IP가 동적이므로 DDNS 설정 또는 고정 IP 전환 권장 + +--- + +## 마이그레이션 순서 + +### Phase 0: 기본 인프라 ✅ 완료 +- [x] 서버 상태 파악 (server-audit.md) +- [x] SSH 키 설정 (coala@192.168.0.100, brandon 계정 추가) +- [x] 라우터 교체 (FortiGate → TP-Link, FortiGate 제거) +- [x] TP-Link LAN IP 변경 (.1 → .254) +- [x] TP-Link DHCP 범위 설정 (.200~.253) +- [x] 서버 게이트웨이 변경 (.1 → .254) +- [x] WireGuard VPN 설정 (brandon: 10.5.5.2) +- [x] 외부 접속 확인 (SSH, GitLab, 서비스들) + +### Phase 0.7: Caddy + Gitea + 마이그레이션 ✅ 완료 +- [x] Caddy v2.11.2 설치 (리버스 프록시, auto SSL) +- [x] Cloudflare DNS 서브도메인 10개 설정 (0022222.xyz) +- [x] Gitea 설치 (Docker, :3000) +- [x] GitLab → Gitea 전체 마이그레이션 (33개 레포, 7개 org) +- [x] GitLab HTTP 전환 (:8443, Caddy 뒤로) +- [x] 외부 HTTPS 접속 확인 (git/tb/cm/cb 등) + +### Phase 0.5: 보안 긴급 조치 ← 다음 +- [ ] DB 포트포워딩 삭제 (33306, 33307, 33308, 10512) +- [ ] Jenkins 포트포워딩 삭제 (8889) +- [ ] 미사용 포트포워딩 삭제 (RDP, flask_test, kisa_test, bjsrtest) +- [ ] PostgreSQL listen_addresses → localhost +- [ ] MySQL Docker 바인딩 → 127.0.0.1 +- [ ] SSH 비밀번호 로그인 비활성화 +- [ ] 레거시 포트포워딩 정리 (Caddy 서브도메인으로 대체된 것들) +- [ ] lets_encrypt 포트포워딩 수정 (80→10080 → 80→80) + +### Phase 1: SSD 도착 전 준비 +- [ ] 전체 백업 실행 (GitLab, DB, Docker 볼륨, 설정파일, 인증서) +- [ ] 백업 스크립트 작성 +- [ ] docker-compose 정리 +- [ ] GitLab 서비스 중단 (Gitea로 완전 전환 후) +- [ ] CI/CD 파이프라인 Gitea webhook으로 전환 + +### Phase 2: SSD 도착 후 Proxmox 설치 +- [ ] SSD에 Proxmox VE 설치 +- [ ] 네트워크 브릿지 설정 (vmbr0 → 192.168.0.0/24) +- [ ] CT 생성: 101 (Caddy), 102 (Gitea), 103 (Apps), 104 (DB), 105 (Jenkins) +- [ ] 각 CT에 고정 IP 할당 + +### Phase 3: 서비스 이관 +- [ ] DB 복원 (PostgreSQL, MySQL) +- [ ] Gitea 데이터 이관 +- [ ] Docker 앱 배포 +- [ ] Jenkins 복원 +- [ ] Caddy 리버스 프록시 설정 +- [ ] SSL 인증서 발급 확인 (Caddy 자동) + +### Phase 4: 전환 +- [ ] 라우터 포트포워딩 변경 (80/443 → .101) +- [ ] 기존 포트 포워딩 전부 제거 +- [ ] DNS 최종 확인 +- [ ] 검증 후 기존 HDD Ubuntu 보관 (롤백용) + +--- + +## 참고 + +### 도메인 +| 도메인 | 레지스트라 | 용도 | 만료일 | +|--------|-----------|------|--------| +| 0022222.xyz | Cloudflare | 현재 서브도메인 (임시) | 2027-02-22 | +| softk.io | - | 주 도메인 (추후 전환) | - | +| cheeserush.co | - | 이전 도메인 (비활성) | - | + +### 서버 하드웨어 +- CPU: Intel i9-10900K (10C/20T) +- RAM: 64GB +- Disk: HDD 2TB (191GB 사용) → SSD 마이그레이션 예정 +- VT-x: 지원 (Proxmox 가능) + +### 계정 +| 대상 | 계정 | 비고 | +|------|------|------| +| 서버 SSH | brandon (NOPASSWD sudo) | `ssh -p 24242 brandon@39.122.244.108` | +| 서버 SSH | coala (기존) | 키 인증 설정됨 | +| Gitea 관리자 | brandon | https://git.0022222.xyz |