เปิดเบราว์เซอร์ → http://127.0.0.1:8123 (พอร์ตเปลี่ยนได้ใน CONFIG.md)
ครั้งแรกต้องล็อกอินด้วยรหัสผ่าน — หาได้จาก:
python run.py passwordตอนรันเป็น service ต้องใช้คำสั่งนี้จากสิทธิ์ admin ด้วย (config อยู่ใต้ %ProgramData%)
| การ์ด | ความหมาย |
|---|---|
| ล็อกอินล้มเหลว (24 ชม.) | จำนวน Event 4625 ทั้งหมดใน 24 ชั่วโมงล่าสุด |
| ล็อกอินสำเร็จ (24 ชม.) | จำนวน Event 4624 ที่นับได้ |
| IP กำลังถูกบล็อก | จำนวน IP ที่มี rule อยู่ในตาราง blocked ตอนนี้ |
| บล็อกทั้งหมด | ผลรวมตลอดกาล (ประวัติ + กำลังบล็อก) |
| กฎที่ตั้ง | สรุปค่าการตรวจจับปัจจุบัน (max ครั้ง / กรอบเวลา / ชั่วโมงบล็อก) |
แถบหัว (header) แสดงสถานะ: กำลังเฝ้าระวัง (เขียว) / เฝ้าระวังปิดอยู่ (เหลือง) / ไม่ทำงาน (แดง) + บริบทการรัน (Windows Service / standalone)
หน้า refresh อัตโนมัติทุก 3–5 วินาที
ส่วน "การตรวจจับ" (ใต้การ์ดสถิติ): สวิตช์เปิด/ปิดเฝ้าระวังทั้งหมด + chip เปิด/ปิดแต่ละ engine (RDP/OpenSSH/MSSQL/IIS/MySQL/Generic) — กดแล้วมีผลทันที ไม่ต้อง restart
ส่วน "สถานะระบบ (ส่วนประกอบสำคัญ)" บอกว่าของที่ต้องใช้ทำงานได้จริงหรือไม่:
| ส่วนประกอบ | สถานะที่เป็นไปได้ |
|---|---|
| Security event log (แหล่งหลัก) | ✔ อ่านได้ / ✘ อ่านไม่ได้ (สิทธิ์ไม่พอ — service/SYSTEM อ่านได้) |
| Windows Firewall (ตัวบล็อก) | ✔ เข้าถึง + มีสิทธิ์เพิ่ม rule / ○ เข้าถึงได้แต่ไม่มีสิทธิ์ / ✘ เข้า COM ไม่ได้ |
| สิทธิ์โปรแกรม | ✔ admin/SYSTEM / ✘ ผู้ใช้ธรรมดา (บล็อกไม่ได้) |
| Monitor / เฝ้าระวัง | ✔ รันอยู่ / ✘ ไม่ได้รัน |
| แต่ละ Engine | ✔ แหล่งข้อมูลพร้อม / ✘ อ่านไม่ได้ / ○ ยังไม่พบแหล่ง / ⊘ ปิดอยู่ |
ปุ่ม "ทดสอบบล็อกจริง (firewall)" — เพิ่ม + ลบ rule ทดสอบ (IP TEST-NET ไม่กระทบใคร) แล้วรายงานผลว่าบล็อกได้จริงหรือไม่ และถ้าไม่ได้บอกเหตุผลให้ (เช่น "ต้องรันด้วย admin")
ปุ่ม "ทดสอบระบบทั้งหมด (self-test)" — พิสูจน์ทั้ง pipeline แบบเรียลไทม์ (ใช้เวลา ~15-25 วิ):
- เขียน event จำลอง 5 รายการ (Event 18456) ลง Application log จริง
- engine MSSQL อ่าน event → detector บล็อก IP ทดสอบ (8.8.8.8) อัตโนมัติ
- ตรวจ rule ใน Windows Firewall ว่าถูกสร้างจริง
- ปลดบล็อก + ลบ event ทดสอบ (ทำความสะอาดให้เอง)
แสดงผลเป็นขั้นตอนทีละบรรทัด (✔/✘) — ถ้าผ่านทุกขั้น = ระบบทำงานได้จริงทั้งสาย ต้องรันด้วย admin/service
ส่วน "Windows Service" ในหน้าแรก (ใต้การ์ดสถิติ) แสดงสถานะ + ปุ่มควบคุม:
| ปุ่ม | การทำงาน |
|---|---|
| ติดตั้ง | ลงทะเบียนเป็น Windows Service (เริ่มอัตโนมัติตอน boot) |
| เริ่ม / หยุด / รีสตาร์ท | ควบคุม service |
| ถอน | ถอนการติดตั้ง service |
- ปุ่มจะ ปิดใช้งานอัตโนมัติ ตามบริบท: รันใน service เอง / ไม่มีสิทธิ์ admin / สถานะไม่ตรง (เช่น กด "เริ่ม" ตอนรันอยู่แล้ว) — พร้อมข้อความอธิบายเหตุผล
- ต้องเปิดโปรแกรมด้วย Run as administrator ถึงจะใช้ปุ่มได้
- รันใน service อยู่ → ควบคุมผ่าน services.msc หรือ CLI (
rdpguard.exe stopฯลฯ) เท่านั้น
ตารางแสดง session RDP/console/network ปัจจุบัน (refresh ทุก 10 วินาที) โดยพยายามใช้ qwinsta/query session และ fallback เป็น WTS API (win32ts) ใน process เดียวกัน — ไม่ใช้ PowerShell จึงไม่ขึ้นกับการมีคำสั่งภายนอกและหลีกเลี่ยงการถูกโปรแกรมกันไวรัสฟลาก
ตารางแสดง failed/success logon ล่าสุด 80 รายการ: เวลา (UTC), IP, ผู้ใช้, โดเมน, LogonType, แหล่ง (RDP/OpenSSH/MSSQL/IIS Web/MySQL — รู้ว่าโจมตีผ่านช่องทางไหน), ประเภท (ล้มเหลว/สำเร็จ/NTLM)
- ตารางมีคอลัมน์ "ประเทศ" แสดงธง + ชื่อประเทศของแต่ละ IP (GeoIP ออนไลน์ + cache — ถ้าเครื่องออฟไลน์แสดง "-" ไม่กระทบการบล็อกแต่อย่างใด)
- ปุ่ม ปลดบล็อก — ถอด rule firewall + ลบออกจากตารางทันที
- กล่อง บล็อกด้วยมือ — ใส่ IP (หรือ CIDR เช่น
203.0.113.0/24) + จำนวนชั่วโมง (0 = ถาวร) แล้วกดปุ่ม - Whitelist = เพิ่มแล้วปลดบล็อกทันที (ถ้าถูกบล็อกอยู่) + จะไม่ถูกบล็อกเด็ดขาด (กัน IP สำนักงาน/ตัวเอง — รองรับ CIDR)
- Blacklist = เพิ่มแล้วบล็อกทันที (สร้าง rule firewall เลย ไม่ต้องรอให้ IP นั้นโจมตี — รองรับ CIDR) — ลบออกจาก blacklist = ปลดบล็อกให้อัตโนมัติด้วย
- ครบเวลาปลดเอง: ทุก 60 วินาทีระบบตรวจ — บล็อกที่หมดอายุ (
block_hours) ถูกลบ rule + ปลดให้อัตโนมัติ (ยกเว้นถูกโจมตีต่อ →auto_extendต่ออายุ) - ขยายบล็อก IP ขาประจำ: IP ที่โดนบล็อกครบ
escalate_after_blocksครั้ง (ค่าเริ่มต้น 3 ครั้งใน 30 วัน) แล้วกลับมาโจมตีอีก → ครั้งถัดไปขยายเป็นescalate_block_hours(7 วัน) หรือถาวร (escalate_to_permanent) — เห็นเหตุผลในตารางว่า "ขยายบล็อกเป็น 168 ชม." - ตัวนับสะสม (ยิงสั้น ๆ แล้วหนี): นับความล้มเหลวสะสมต่อ IP ภายใน
accumulate_window_hours(ค่าเริ่มต้น 24 ชม.) แยกจากตัวนับ window ระยะสั้น — IP ที่ยิงทีละ 1-2 ครั้งไม่ถึงเกณฑ์ short-window แต่สะสมครบaccumulate_threshold(ค่าเริ่มต้น 8) โดนบล็อกด้วยaccumulate_block_hours(ค่าเริ่มต้น 6 ชม. — สั้นกว่าปกติ กันพลาดบล็อกผู้ใช้หลัง NAT) — เห็นใน log ว่าสะสม N/M ใน 24 ชม.และตาราง IP ถูกบล็อกมี badge "สะสม"; IP ที่ล็อกอินสำเร็จจะถูกล้างตัวนับทันที - auto_extend จะไม่ลดระยะเวลาที่ขยายแล้ว และไม่แตะบล็อกถาวร
พาเนลด้านล่างสุดแสดง rdpguard.log ล่าสุด โดยเลือกได้ 250 / 500 / 1000 บรรทัด (refresh อัตโนมัติทุก 5 วินาที + ปุ่ม "โหลดใหม่") พร้อมแสดง path และขนาดไฟล์
- ระบบอ่านเฉพาะ 64 KB ท้ายสุดของไฟล์ต่อ request จึงไม่โหลด log ทั้งไฟล์เข้าหน่วยความจำ
- ไฟล์ log หมุนอัตโนมัติเมื่อถึง
[general] log_max_mb(ค่าเริ่มต้น 5 MB) และเก็บไฟล์เก่าตาม[general] log_backups(ค่าเริ่มต้น 5 ไฟล์) - ไฟล์ปัจจุบันและไฟล์สำรองใช้ชื่อ
rdpguard.log,rdpguard.log.1, ... — ลบไฟล์สำรองได้เมื่อหยุดโปรแกรมแล้ว - เลือกไฟล์หมุนเวียน, ค้นหาข้อความ, หยุด auto-refresh และดาวน์โหลด Log ได้
- แนวโน้ม 7 วัน แสดงจำนวนล้มเหลว/สำเร็จรายวันเพื่อดูช่วงที่มีการโจมตีหนัก
- ประวัติการบล็อก แสดง IP ที่ถูกปลดแล้ว พร้อมเหตุผลและผู้ดำเนินการ
- Audit Log บันทึกการ block/unblock, whitelist/blacklist, เปลี่ยน config, ทดสอบแจ้งเตือน และควบคุม service
- ทั้งประวัติและ Audit Log ส่งออกเป็น CSV ได้
| รายการ | พฤติกรรม |
|---|---|
| Whitelist | IP/CIDR ที่จะไม่มีวันถูกบล็อกอัตโนมัติ (เช่น IP สำนักงาน, IP ตัวเอง) |
| Blacklist | IP/CIDR ที่จะถูกบล็อกทันทีแม้พยายามครั้งแรก |
เปลี่ยนค่าการเฝ้าระวัง/ตรวจจับ/firewall/engine/แจ้งเตือน/Web UI ได้จากหน้าเว็บ กด บันทึกการตั้งค่า แล้วมีผลทันที โดย service/monitor โหลด config ใหม่เอง
- การเปลี่ยน
webui.hostหรือwebui.portต้อง restart โปรแกรม/service เพราะเป็นค่าที่ใช้ตอนเปิด HTTP server - ค่าใน
[general]โดยเฉพาะlog_level,log_max_mb,log_backupsแก้จากหน้า Settings หรือconfig.iniได้ แต่ต้อง restart เพื่อให้ logging handler ใช้ค่าใหม่ - ค่า retention (
event_retention_days,history_retention_days,audit_retention_days) ต้อง restart และระบบจะล้างข้อมูลเก่าตามรอบ cleanup - ปุ่ม ดาวน์โหลด Backup จะล้างค่าลับออกจาก config; ปุ่ม กู้คืน Backup ต้อง restart ก่อนใช้ฐานข้อมูลใหม่
ตั้งค่า Generic engine (ไฟล์ log ของโปรแกรมอื่น + regex เอง เช่น MailEnable/SmarterMail/PBX) ดูตัวอย่างโปรแกรมจริงและวิธีทดสอบ regex ได้ที่ GENERIC.md
เมื่อบล็อก IP ระบบส่งข้อความแจ้งเตือน — ตั้งค่าในหน้า ตั้งค่า → "แจ้งเตือน (Telegram / Email)": เปิดสวิตช์ + ใส่ Bot Token/Chat ID (Telegram — สร้าง bot กับ @BotFather) และ/หรือ SMTP (อีเมล) แล้วกด "ส่งข้อความทดสอบ" ตรวจก่อนใช้จริง
- ข้อความ:
[ชื่อเครื่อง] บล็อก IP <ip> (RDP) — เหตุผล — หมดอายุ <เวลา>— ขึ้นต้นด้วยชื่อเครื่องเสมอ (ตั้งเองได้ในช่อง ชื่อเครื่อง ว่าง = ชื่อเครื่องระบบ) — รู้ได้ทันทีว่าข้อความมาจากเครื่องไหน ถ้าเฝ้าหลายเครื่อง - ช่องทางเลือกได้:
ทั้งสองช่องทาง,Telegram เท่านั้นหรือEmail เท่านั้น - cooldown 60 วิ (ค่าเริ่มต้น): โจมตีหนัก ๆ ข้อความถูกรวมเป็นชุดเดียว ไม่สแปม (ตั้ง 0 = ส่งทันทีทุกครั้ง)
- ส่งแบบ background — ไม่หน่วงการบล็อก; ถ้าส่งไม่สำเร็จ (network/ตั้งค่าผิด) ดู
rdpguard.log - ถ้า Telegram ขึ้น
CERTIFICATE_VERIFY_FAILEDจาก proxy/โปรแกรมกันไวรัสที่ intercept HTTPS ให้ปิด ตรวจสอบ SSL ของ Telegram แล้วกดบันทึก; ค่านี้มีผลเฉพาะ Telegram - Webhook เป็นช่องทางเสริม ตั้งค่า URL และเปิดใช้ได้จากกลุ่มแจ้งเตือน
เปิด "เปิดรับคำสั่งจาก Telegram" ในหน้า ตั้งค่า → แจ้งเตือน เมื่อตั้งค่า Bot Token และ Chat ID แล้วจะควบคุม RDPGuard จาก Telegram ได้
คำสั่งที่รองรับ:
| คำสั่ง | การทำงาน |
|---|---|
/where |
แสดงชื่อเครื่องนี้ + เวอร์ชัน |
/status |
สถานะระบบ (monitor, engines, blocked, fail 24 ชม.) |
/block <ip> [ชั่วโมง] |
บล็อก IP (0 = ถาวร) |
/unblock <ip> |
ปลดบล็อก IP |
/unblock-all |
ปลดบล็อกทุก IP — ต้องยืนยัน /confirm |
/allow <ip> |
เพิ่ม whitelist + ปลดบล็อก |
/blacklist <ip> / /whitelist <ip> |
จัดการรายการ |
/list blocked|white|black |
ดูรายการล่าสุด |
/events [n] |
เหตุการณ์ล่าสุด (สูงสุด 20) |
/log [บรรทัด] |
ดู log ท้ายสุด (สูงสุด 50) |
/ping |
ตรวจ bot ทำงาน |
/help |
รายการคำสั่ง |
- รับคำสั่งจาก
telegram_chat_idที่ตั้งไว้เท่านั้น — แชทอื่นถูกปฏิเสธเงียบ ๆ - จำกัดคำสั่งต่อนาทีตาม
rate_limit_per_minute /unblock-allต้องยืนยัน/confirmภายในconfirm_timeout_seconds- ทุกคำสั่งบันทึกลง Audit Log
- ระบบทำงานผ่าน Bot API long-polling ไม่ต้องเปิดพอร์ตหรือตั้ง HTTPS
หลายเครื่อง / bot เดียว — ใช้ bot และ Chat ID เดียวกันกับหลายเครื่องได้ โดยตั้ง ชื่อเครื่อง ให้ต่างกัน (หน้า ตั้งค่า → แจ้งเตือน):
- ทุกคำตอบขึ้นต้นด้วย
[ชื่อเครื่อง]— รู้เสมอว่าคำตอบมาจากเครื่องไหน - ต่อท้ายคำสั่งด้วย
@ชื่อเครื่องเพื่อสั่งเครื่องที่ต้องการ เช่น/status @srv-a— เครื่องที่ไม่ใช่เป้าตอบปฏิเสธ ไม่ลงมือทำ - หมายเหตุ: คำสั่งที่ส่งไปจะตกที่เครื่องใดเครื่องหนึ่งแบบสุ่ม (เครื่องที่ polling ถึงก่อน) — ถ้าคำตอบมาจากเครื่องที่ไม่ต้องการ ให้ส่งซ้ำ;
/whereใช้ยืนยันว่าเครื่องไหนตอบอยู่ - ระบบใช้ staggered polling กันการชนกันเอง: เครื่องที่เจอ
409 Conflict(อีกเครื่องถือสิทธิ์อยู่) จะรอสุ่ม 15–45 วิ แล้วลองใหม่ — ทุกเครื่องผลัดกันรับคำสั่ง ไม่มีเครื่องไหนถูกกันออกถาวร (ปรับช่วงเวลาได้ใน ตั้งค่า → แจ้งเตือน)
ทุกคำสั่งใช้ผ่าน python run.py <คำสั่ง> หรือ python -m rdpguard <คำสั่ง> (รันจากโฟลเดอร์โปรเจกต์) ถ้าสร้าง exe แล้วใช้ rdpguard.exe <คำสั่ง>
รันโดยไม่มีคำสั่ง (เช่น ดับเบิลคลิก
rdpguard.exe) = เริ่มเฝ้าระวังทันที (monitor + web UI) + เปิดเบราว์เซอร์ให้อัตโนมัติ และถ้าเป็นครั้งแรก จะเจอ Setup Wizard ตั้งค่าทีละขั้นก่อน
| คำสั่ง | ความหมาย | ต้อง admin? |
|---|---|---|
install |
ติดตั้ง Windows Service (เริ่มอัตโนมัติตอน boot) | ใช่ |
remove |
ถอนการติดตั้ง service | ใช่ |
start / stop / restart |
ควบคุม service | ใช่ |
status |
ดูสถานะ service (installed? running?) | ไม่ |
run |
รันแบบ foreground (monitor + web) — ใช้ทดสอบ/ดู log สด | แนะนำใช่ (จะบล็อก IP ได้) |
web |
รันเฉพาะ Web UI โดยไม่เฝ้าระวัง — ใช้ทดสอบ UI | ไม่ |
unblock-all |
ปลดบล็อกทุก IP ที่ RDPGuard จัดการ (ฉุกเฉิน) | ใช่ |
allow <ip> |
เพิ่ม IP เข้า whitelist และปลดบล็อกทันที (ฉุกเฉิน) | ใช่ |
ตอนรันครั้งแรก (ยังไม่เคยตั้งค่า) Web UI จะแสดงวิซซาร์ด 4 ขั้นตอนให้ตั้งค่าก่อนใช้งาน:
- ยินดีต้อนรับ — อธิบายการทำงาน + แนะนำการติดตั้งเป็น service
- การตรวจจับ — จำนวนครั้ง/กรอบเวลา/ระยะเวลาบล็อก/ข้าม LAN
- Web UI — host/พอร์ต/รหัสผ่าน
- พร้อมใช้งาน — สรุปการตั้งค่า → กด "เสร็จสิ้น" เพื่อบันทึกและเริ่มเฝ้าระวังทันที
กด "ข้ามการตั้งค่า" ได้ถ้าไม่อยากตั้ง (จะใช้ค่าเริ่มต้นทั้งหมด) — ตั้งค่าทีหลังได้ที่หน้า "ตั้งค่า" ใน dashboard
| block <ip> [ชั่วโมง] | บล็อก IP ด้วยมือ (ค่าเริ่มต้น 24 ชม., 0 = ถาวร) | ใช่ |
| unblock <ip> | ปลดบล็อก IP | ใช่ |
| password | แสดงรหัสผ่าน Web UI | ไม่ |
| password reset | สุ่มรหัสผ่าน Web UI ใหม่ | ไม่ |
| version | แสดงเวอร์ชัน | ไม่ |
| help | แสดงคำสั่งทั้งหมด | ไม่ |
:: ดูสถานะ
python run.py status
:: บล็อก IP ด้วยมือ 12 ชั่วโมง
python run.py block 203.0.113.9 12
:: บล็อกถาวร
python run.py block 203.0.113.9 0
:: ปลดบล็อก
python run.py unblock 203.0.113.9
:: รีเซ็ตรหัสผ่าน Web UI
python run.py password resetRDPGuard บล็อกได้ไม่จำกัด (1 rule ต่อ IP — Windows Firewall รองรับเป็นร้อยได้สบาย) แต่เมื่อจำนวนเยอะ หน้าจอ/rules จะรก ถ้าเกินหลักพันอาจเริ่มหน่วง แนวทางจัดการ:
| วิธี | ทำยังไง |
|---|---|
| บล็อกแบบ CIDR | ถ้า IP โจมตีมาจาก subnet เดียวกัน (เช่น 203.0.113.5, 203.0.113.9) → บล็อก 203.0.113.0/24 rule เดียวครอบหมด (ช่อง "บล็อกด้วยมือ" รับ CIDR ได้) |
| Blacklist ด้วย CIDR | ใส่ subnet ที่โจมตีประจำใน blacklist → บล็อกทันทีทั้งวง |
| ลด block_hours | ตั้ง block_hours = 6 (หน้า ตั้งค่า) — IP หมดอายุเร็ว ไม่สะสมเยอะ (IP ขาประจำยังถูก escalation ขยายให้) |
| ปลดล้าง | ปลดรายตัวในตาราง / "ปลดบล็อกทั้งหมด (ฉุกเฉิน)" / CLI rdpguard.exe unblock-all |
Web UI จะแสดงคำเตือนอัตโนมัติเมื่อมี IP ถูกบล็อกเกิน 50 (และเตือนแรงขึ้นเมื่อเกิน 200) พร้อมคำแนะนำข้างต้น
RDPGuard มีกัน 3 ชั้นอัตโนมัติ: ไม่บล็อก IP ที่มี session ล็อกอินสำเร็จล่าสุด (active_session_grace_minutes), ปลดบล็อกอัตโนมัติเมื่อ IP นั้นล็อกอินสำเร็จ, และปลดบล็อก IP ที่อยู่ใน whitelist/never_block_ips ทุก 60 วินาที
ถ้ายังโดนล็อกจริง ให้ใช้วิธีนี้ (เรียงตามความสะดวก):
| วิธี | ขั้นตอน |
|---|---|
| Web UI | เข้า http://127.0.0.1:8123 (ถ้าเข้าได้) → หน้า "IP ที่ถูกบล็อก" → ปลดบล็อกทั้งหมด (ฉุกเฉิน) หรือปลดเฉพาะ IP |
| CLI จาก console จริง | ไปที่เครื่อง (จอ/คีย์บอร์ดจริง, iDRAC, VM console — ไม่ต้องพึ่ง RDP) → รัน rdpguard.exe unblock-all หรือ rdpguard.exe unblock <IP> หรือ rdpguard.exe allow <IP> (เพิ่ม whitelist + ปลดบล็อก) |
| แก้ config | แก้ config.ini เพิ่ม IP ตัวเองใน never_block_ips = 1.2.3.4 → รอ ≤60 วิ ระบบปลดให้เอง (service รีโหลด config อัตโนมัติ) |
แนะนำ: เตรียม
allowไว้ล่วงหน้า — จด IP ที่ใช้เข้าประจำไว้ในnever_block_ipsหรือ whitelist ตั้งแต่แรก
ตำแหน่งขึ้นกับโหมดการรัน:
| โหมด | ตำแหน่ง (config.ini, rdpguard.db, rdpguard.log) |
|---|---|
exe (rdpguard.exe) |
โฟลเดอร์เดียวกับ exe ถ้าเขียนได้; ถ้าไม่ได้ใช้ data directory สำรอง |
source (python run.py) |
%ProgramData%\RDPGuard\ (ถ้าเขียนไม่ได้ → C:\Users\<user>\.rdpguard\) |
| ไฟล์ | ความหมาย |
|---|---|
| config.ini | ตั้งค่าทั้งหมด (ส่วนใหญ่แก้ผ่าน Web UI ได้; ค่า [general] ต้องแก้ไฟล์โดยตรง) |
| rdpguard.db | SQLite: เหตุการณ์, blocked, whitelist, blacklist |
| rdpguard.log | log การทำงาน |
โหมด exe: ถ้าข้าง exe ยังไม่มีข้อมูล แต่มีข้อมูลเก่าที่
%ProgramData%\RDPGuard\อยู่ (จากโหมด source/เวอร์ชันก่อนหน้า) ระบบจะคัดลอก config.ini + rdpguard.db มาไว้ข้าง exe อัตโนมัติตอนรันครั้งแรก
- เปิด RDP ไปที่เครื่องตัวเอง (จากเครื่องอื่น) แล้วลองใส่รหัสผิด 5+ ครั้งภายใน 10 นาที
- เปิด Web UI → ควรเห็นเหตุการณ์ล้มเหลวสะสม และ IP นั้นโดนบล็อกอัตโนมัติ (การ์ด "IP กำลังถูกบล็อก" เพิ่มขึ้น)
- ลองรัน
python run.py status+wf.msc→ ค่าเริ่มต้นดู rule ชื่อRDPGuard Block(single rule); ถ้าตั้งsingle_rule = falseจะเห็น rule แยกตาม IP - ปลดบล็อกได้จากปุ่มใน Web UI หรือ
python run.py unblock <IP>