Web UI ของ RDPGuard เป็น REST API ง่าย ๆ (JSON) — เปิดเฉพาะ 127.0.0.1:8123 (ค่าเริ่มต้น)
- ทุก endpoint ต้องล็อกอินก่อน ยกเว้น
/api/login-status,/api/setup-status,/api/loginและ/api/logout - ล็อกอินแล้วระบบจะให้ cookie
rdpguard_session— ส่งติดตัวไปทุก request - session มีอายุ 24 ชั่วโมง และต่ออายุอัตโนมัติเมื่อใช้งานต่อเนื่อง
- กันเดารหัสแยกตาม IP: พลาด 5 ครั้ง → ล็อก 5 นาที (จำกัดรายการ guard สูงสุด 1000 IP)
- POST ที่ส่ง
OriginหรือRefererต้องตรงกับHostเพื่อป้องกัน CSRF; curl ที่ไม่ส่ง header ดังกล่าวยังใช้ได้ - ตัวอย่างใช้
curl(Windows 10+ มีในตัว) — บันทึก cookie ลงไฟล์cookies.txt
curl -s -c cookies.txt -X POST http://127.0.0.1:8123/api/login ^
-H "Content-Type: application/json" ^
-d "{\"password\":\"<รหัสผ่าน>\"}"ต่อจากนั้นทุกคำสั่งเพิ่ม -b cookies.txt
{ "ok": true, "data": { ... } }
{ "ok": false, "error": "ข้อความผิดพลาด" }สถานะล็อกอิน + บริบทการรัน
{ "ok": true, "data": { "authorized": true, "context": "service" } }context: service (รันใน Windows Service) / standalone-admin / standalone
body: { "password": "..." } → คืน { "token": "..." } และ set cookie
สถานะว่า Setup Wizard ทำเสร็จแล้วหรือยัง
{ "ok": true, "data": { "setup_done": true } }ออกจากระบบ
สถิติ + สถานะโดยรวม
{
"ok": true,
"data": {
"version": "1.7.0",
"context": "service",
"monitor_running": true,
"stats": {
"failed_24h": 128, "success_24h": 3,
"blocked_active": 7, "blocked_total": 45, "blocked_manual": 1
},
"settings_summary": { "max_attempts": 5, "window_minutes": 10, "block_hours": 24, "enable": true }
}
}เหตุการณ์ล่าสุด (max 500) เรียงใหม่สุดก่อน
{ "ok": true, "data": { "events": [
{ "id": 1, "ts": "2026-08-16T05:00:00Z", "kind": "fail",
"ip": "203.0.113.9", "user": "Administrator", "domain": "SERVER", "logon_type": 3,
"source": "openssh" }
] } }kind:fail/success/ntlmsource: engine ที่พบ —rdp/openssh/mssql/iis/mysql/generic(หรือgeneric:<ชื่อ>)
{ "ok": true, "data": { "blocked": [
{ "ip": "203.0.113.9", "reason": "ล็อกอิน RDP ล้มเหลวเกินกำหนด (auto)",
"source": "auto", "created": "...", "expires": "...", "rule_name": "RDPGuard Block 203.0.113.9" }
] } }source: auto / manual / blacklist / accumulate — expires ว่าง = ถาวร
บล็อกด้วยมือ — body: { "ip": "203.0.113.9", "hours": 24 } (hours 0 = ถาวร, รองรับ CIDR)
ปลดบล็อก (ip ต้อง URL-encode)
{ "ok": true, "data": { "whitelist": [ { "ip": "192.168.1.0/24", "note": "", "created": "..." } ] } }body: { "ip": "192.168.1.0/24", "note": "สำนักงาน" } (รองรับ CIDR)
คืน config ปัจจุบันทั้งไฟล์ (ยกเว้นรหัสผ่านจริง — ใช้ webui.password_hidden แทน)
{ "ok": true, "data": { "general": { "log_level": "INFO", "log_max_mb": "5", "event_retention_days": "90" }, "monitor": { ... }, "webui": { "password_set": true }, "notify": { "telegram_bot_token_set": true }, ... } }ค่าลับจะไม่อยู่ใน response; ใช้คีย์ลงท้าย _set เพื่อตรวจว่าตั้งค่าแล้วหรือยัง
คืน session RDP/console/network ที่กำลังใช้งาน — พยายามใช้ qwinsta/query session และ fallback เป็น WTS API (win32ts)
{ "ok": true, "data": { "sessions": [
{ "type": "rdp", "user": "Administrator", "session_id": "2", "state": "Active", "started": "..." }
] } }สถานะ Windows Service + สิทธิ์ควบคุม
{ "ok": true, "data": {
"installed": true, "state": "running", "running": true,
"context": "standalone", "is_admin": true, "can_control": true
} }context:service(รันใน service — ควบคุมไม่ได้) /standalone-admin/standalonecan_control= มีสิทธิ์ admin และไม่ได้รันใน service
ควบคุม service — body: { "action": "install" | "remove" | "start" | "stop" | "restart" }
- ต้องมีสิทธิ์ admin (คืน 403 ถ้าไม่มี) และต้องไม่ได้รันใน service เอง
สถานะการตรวจจับ: { "enable": true, "engines": { "openssh": true, "mssql": true, "iis": true, "mysql": true, "generic": true } }
เปิด/ปิดทันที — body: { "key": "enable" } (เฝ้าระวังทั้งหมด) หรือ { "engine": "openssh" } (engine ตัวเดียว: openssh/mssql/iis/mysql/generic)
log ล่าสุด (รับค่า 1–2000; ค่าติดลบจะถูกปรับเป็น 1) — server อ่านเฉพาะ 64 KB ท้ายสุดของไฟล์ปัจจุบัน
{ "ok": true, "data": { "lines": ["..."], "file": "C:\\...\\rdpguard.log", "file_size": 47942 } }รายการไฟล์ rdpguard.log และไฟล์หมุนเวียนที่อนุญาตให้ดู
ดาวน์โหลดไฟล์ Log ที่อนุญาต — ไม่รับ path นอก data directory
หาประเทศของ IP — body: { "ips": ["8.8.8.8", ...] } (ประมวลผลสูงสุด 20 IP ต่อครั้ง)
{ "ok": true, "data": { "geoip": { "8.8.8.8": { "code": "US", "country": "United States", "flag": "🇺🇸" } } } }ถ้าไม่มีข้อมูล (ออฟไลน์/IP ผิด) → null
ทดสอบบล็อกจริง: เพิ่ม + ลบ rule ทดสอบ (203.0.113.254 TEST-NET) แล้วรายงานผล
{ "ok": true, "data": { "working": true, "message": "Firewall ทำงานได้จริง — ..." } }working: false + เหตุผลเมื่อทำไม่ได้ (เช่น ไม่มีสิทธิ์ admin)
ฉุกเฉิน: ปลดบล็อกทุก IP ที่ RDPGuard บล็อกไว้ (ลบ rule firewall + ลบจากตาราง) — { "message": "ปลดบล็อกทั้งหมดแล้ว (N IP)" }
ทดสอบระบบครบวงจร (ต้องรันด้วย admin/service) — เขียน event จำลองตาม max_attempts (ค่าเริ่มต้น 5, Event 18456, CLIENT: 8.8.8.8) ลง Application log จริง → รอ engine ตรวจจับ + บล็อก → ตรวจ rule firewall → ปลดบล็อก + ลบ event ทดสอบ
{ "ok": true, "data": {
"working": true,
"steps": ["เขียน event จำลอง 5 รายการ ... OK", "engine MSSQL อ่าน event → detector บล็อก 8.8.8.8 — OK", "...", "ปลดบล็อก + ลบ event ทดสอบ — OK"],
"message": "✅ self-test ผ่านครบวงจร: ..."
} }- ใช้เวลาไม่เกินประมาณ 25 วินาที (รอ engine poll + บล็อก)
- ต้องเปิด engine
mssqlอยู่ และmonitor.enable = true
ส่งข้อความทดสอบตามช่องทางที่เลือกใน [notify] — ทดสอบได้ทั้งโหมด monitor และ python run.py web โดยไม่ต้องเปิดการเฝ้าระวัง
{ "ok": true, "data": { "message": "ผลทดสอบแจ้งเตือน", "results": { "telegram": "ok", "email": "ไม่ได้เลือกช่องนี้" } } }คืนสถานะการตั้งค่าและผลการส่งล่าสุด โดยไม่คืนข้อมูลลับ
คืนสถานะ Telegram Command — เปิด/ปิด, polling ทำงานหรือไม่, chat_id ที่ตั้ง และคำสั่งล่าสุด
{ "ok": true, "data": { "enabled": true, "running": true, "configured": true, "chat_id": "12345", "last_command": "/status", "last_result": "...", "last_ts": 0.0 } }คืนจำนวน Events fail/success รายวัน (สูงสุด 31 วัน)
ประวัติ IP ที่ถูกปลดบล็อก พร้อม unblocked_at และ unblocked_by
ส่งออกประวัติการบล็อกเป็น CSV
Audit Log จากการจัดการผ่าน Web UI
ส่งออก Audit Log เป็น CSV
ปลดบล็อกหลายรายการ — body { "ips": ["203.0.113.9", "198.51.100.4"] } สูงสุด 200 รายการ
ส่งออก Events หรือรายการ Blocked เป็น CSV ตามตัวกรองเดียวกับ endpoint หลัก จำกัดสูงสุด 100,000 รายการ
ดาวน์โหลด ZIP backup ที่ล้างค่าลับออกจาก config แล้ว
อัปโหลด ZIP backup ด้วย Content-Type: application/zip; ตรวจ SQLite integrity แล้วเก็บเป็นไฟล์รอ restart ไม่เขียนทับฐานข้อมูลที่กำลังใช้งาน
/api/overviewมีฟิลด์healthด้วย:{ is_admin, in_service, can_add_rules, eventlog_ok, firewall_com_ok, engines: {...}, monitor_running }— ใช้ตรวจสถานะส่วนประกอบสำคัญ
บันทึก config — รับเฉพาะ key ที่อนุญาตต่อ section (ดู CONFIG.md) แล้วมีผลทันที ไม่ต้อง restart ยกเว้น webui.host/webui.port, ค่า logging และ retention ใน [general] ที่ต้อง restart
{ "detection": { "max_attempts": "8", "window_minutes": "15" } }ทำเครื่องหมายว่า Setup Wizard เสร็จแล้ว — body {} และมีผลทันที
:: ล็อกอิน + บันทึก cookie
curl -s -c cookies.txt -X POST http://127.0.0.1:8123/api/login -H "Content-Type: application/json" -d "{\"password\":\"abc\"}"
:: ดูสถิติ
curl -s -b cookies.txt http://127.0.0.1:8123/api/overview
:: บล็อก IP 48 ชั่วโมง
curl -s -b cookies.txt -X POST http://127.0.0.1:8123/api/blocked -H "Content-Type: application/json" -d "{\"ip\":\"203.0.113.9\",\"hours\":48}"
:: ปลดบล็อก
curl -s -b cookies.txt -X DELETE http://127.0.0.1:8123/api/blocked/203.0.113.9| Code | ความหมาย |
|---|---|
| 200 | สำเร็จ |
| 400 | ข้อมูลไม่ถูกต้อง (เช่น IP รูปแบบผิด) |
| 401 | ยังไม่ล็อกอิน / รหัสผิด |
| 403 | ไม่ผ่าน Origin/Referer หรือไม่มีสิทธิ์ควบคุม service/self-test |
| 404 | ไม่พบเส้นทาง |
| 429 | ล็อกอินพยายามเกินกำหนด (5 ครั้ง → รอ 5 นาที) |