
다중 호스트 UFW 방화벽 대시보드 — 규칙을 평이한 영어로 설명하고, 보안 취약점을 탐지하며, 연결 진단을 제공합니다
다중 호스트 UFW 방화벽 대시보드. SSH를 통해 Linux 호스트에 연결하고, 방화벽 규칙 및 수신 대기 포트를 파싱하여 모든 것을 쉬운 영어로 설명하고 보안 취약점을 표시합니다.

| 경로 | 설명 |
|---|---|
/ | 호스트 카드, 서비스 배지, 갭 수를 포함한 개요 대시보드 |
/host/{name} | 탭 뷰가 있는 호스트 상세: 설명된 규칙, 보호되지 않은 포트, 수신 대기 포트, 원시 출력 |
Browser --> Cloudflare Tunnel --> Reverse Proxy --> FencePost (:8890)
FastAPI container
|-- SSH --> Host 1 (ufw status, ss -tlnp)
|-- SSH --> Host 2
|-- SSH --> Host N
'-- POST --> Notification webhook
FencePost는 읽기 전용입니다 -- 방화벽 규칙을 수정하지 않으며, 보고만 합니다.
<user> ALL=(ALL) NOPASSWD: /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered, /usr/bin/ss -tlnp
git clone <repo-url> && cd fencepost
# Add your SSH key
cp ~/.ssh/your_key ssh/id_ed25519
chmod 600 ssh/id_ed25519
# Create your environment file from the template
cp .env.example .env
# Edit .env with real credentials
timezone: Australia/Melbourne
hosts:
- name: My Server
hostname: 192.168.1.10
ssh_user: deploy
ssh_port: 22
is_docker_host: false
networks:
"192.168.1.0/24": "LAN"
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Load env vars (bash/zsh)
export $(grep -v '^#' .env | xargs)
uvicorn app.main:app --reload --port 8890
http://localhost:8890을 엽니다.
참고: 로컬 모드는 config.yaml(ssh.key_path)에 지정된 경로의 SSH 키를 사용합니다. 로컬 개발에서는 이를 로컬 ssh/id_ed25519를 가리키도록 재정의할 수 있습니다:
ssh:
key_path: ssh/id_ed25519
timeout: 10
docker compose up -d --build
http://localhost:8890을 엽니다. 컨테이너는 compose.yaml을 통해 .env에서 자격 증명을 자동으로 읽습니다.
자격 증명은 .env(gitignore 처리됨)에 저장되며 compose.yaml에서 참조합니다. 비밀을 저장소에 커밋하지 마십시오.
app/
main.py # FastAPI routes and auth
models.py # HostFirewallState, UFWRule, ListeningPort dataclasses
parser.py # Parses ufw status and ss output
explainer.py # Translates rules to plain English
diagnose.py # Connection diagnostic engine
gap_detector.py # Finds uncovered listening ports
ssh_client.py # Paramiko wrapper, parallel host fetching
eventfeed.py # Change detection and webhook posting
templates/
base.html # Layout, CSS, navigation
overview.html # Host dashboard grid
host_detail.html # Per-host tabbed detail view
diagnose.html # Connection diagnostic form and results
login.html # Authentication page
config.yaml # Host definitions, VLANs, devices, timezone
compose.yaml # Docker Compose service definition
Dockerfile # Python 3.12 slim image
.env.example # Template for environment variables
ssh/ # SSH key directory (key not committed)
data/ # Runtime state (last_state.json, not committed)
config.yaml의 hosts: 아래에 항목을 추가하십시오.ssh-copy-id -i ssh/id_ed25519.pub user@host/etc/sudoers.d/fencepost 생성docker compose up -d --buildconfig.yaml에서 NOTIFICATIONS_API_KEY 환경 변수로 구성하면 FencePost는 대시보드를 새로 고칠 때마다 변경 이벤트를 게시합니다:
이벤트에는 중복 방지를 위한 멱등성 키가 포함됩니다.
MIT
/diagnose| 규칙별 추적 시각화가 포함된 연결 진단 도구 |
/login | 세션 기반 인증 |
| 섹션 | 용도 |
|---|
timezone | 표시된 타임스탬프의 IANA 시간대 (예: Australia/Melbourne, UTC) |
hosts | SSH 대상 배열: name, hostname, ssh_user, ssh_port, is_docker_host |
ssh | key_path(개인 키 경로) 및 timeout(초) |
networks | VLAN에 대한 CIDR-이름 매핑 -- 규칙 설명 및 진단에 사용 |
devices | 진단 페이지 빠른 선택 버튼용 명명된 IP |
notifications | 선택적 웹훅: url, channel(환경 변수로 설정되는 API 키) |
| 변수 | 기본값 | 설명 |
|---|
FENCEPOST_USERNAME | admin | 로그인 사용자 이름 |
FENCEPOST_PASSWORD | fencepost | 로그인 비밀번호 |
FENCEPOST_SECRET_KEY | change-me | 세션 쿠키 서명 키 |
FENCEPOST_CONFIG | config.yaml | 구성 파일 경로 |
NOTIFICATIONS_API_KEY | 알림 웹훅용 Bearer 토큰 |