# Port Knocking در MikroTik؛ چطور وقتی تمام دسترسی‌های سازمان بسته است، از اینترنت به پنل‌های مدیریتی متصل شویم؟

آموزش عملی Port Knocking در RouterOS v7 همراه WireGuard، دسترسی محدود به VLAN مدیریت، اسکریپت Windows و Linux، تست، عیب‌یابی و Rollback امن.

## فهرست مطالب

- ۱. یک نیاز فوری، بیرون از سازمان
- ۲. Knock چه مجوزی می‌دهد؟
- ۳. دو معماری و انتخاب Production
- ۴. پیش‌نیاز Lab و مسیر ورودی
- ۵. بررسی تنظیمات فعلی
- ۶. Backup، Safe Mode و بازیابی
- ۷. ساخت WireGuard و یک Peer
- ۸. ساخت Chain مربوط به Knock
- ۹. محدودکردن WireGuard پیش از Acceptهای قبلی
- ۱۰. اعمال ACL شبکه مدیریت
- ۱۱. تنظیم WireGuard کلاینت
- ۱۲. Windows 10 و 11؛ ابزار آماده و PowerShell
- ۱۳. Linux؛ درخواست مرتب و سپس VPN
- ۱۴. تست پذیرش و عیب‌یابی
- ۱۵. لغو مجوز و Rollback امن
- ۱۶. مرزهای امنیتی باقی‌مانده
- ۱۷. Port Knocking چه زمانی انتخاب مناسبی نیست؟
- ۱۸. پرسش‌های فنی
- ۱۹. منابع رسمی و مقاله‌های مرتبط
- ۲۰. دانلود و چک‌لیست استقرار

![کاور Port Knocking میکروتیک و دسترسی امن مدیریت با WireGuard](/assets/img/articles/banners/mikrotik-port-knocking-secure-remote-access.png)

## ۱. یک نیاز فوری، بیرون از سازمان

وقتی به‌عنوان Infrastructure & DevOps Engineer دسترسی راه دور را طراحی می‌کنم، با یک مسئله مشخص شروع می‌کنم: پنل‌های مدیریت باید از اینترنت پنهان باشند، اما هنگام رخداد باید راه ورود کنترل‌شده داشته باشم. فرض کنید بیرون مجموعه هستم و لازم است وارد Winbox شوم، وضعیت ESXi یا vCenter را ببینم، هشدار Zabbix را بررسی کنم یا با SSH به Linux وصل شوم. نمی‌خواهم هر بار برای ورود، فایروال را دستی تغییر بدهم.

در این سناریوی سازمانی، MikroTik RouterOS، سوئیچ‌های Cisco، VMware ESXi و vCenter، Windows Server، سرورهای Linux، Zabbix، Grafana، NetBox و پنل‌های دیگر در شبکه مدیریت ایزوله قرار دارند. WAN سیاست Default Deny دارد و هیچ پنل مدیریتی منتشر نشده است. من Knock را فقط برای مجوز موقت ورود VPN به کار می‌برم؛ ورود تجهیزات مستقل می‌ماند. این طراحی قابل تکرار است، نه ادعای استقرار مشتری یا نتیجه اندازه‌گیری‌شده Lab.

## ۲. Knock چه مجوزی می‌دهد؟

یک TCP SYN به `32111`، مبدأ عمومی را ۳۰ ثانیه در `knock_stage_1` ثبت می‌کند. SYN به `43222` در زمان اعتبار آن، `knock_stage_2` را ۳۰ ثانیه ایجاد می‌کند. SYN به `54333` در زمان اعتبار مرحله دوم، مبدأ را ۱۵ دقیقه وارد `knock_authorized` می‌کند. پورت‌ها نمونه و قابل تغییرند؛ سرویس TCP روی آن‌ها گوش نمی‌دهد. فیلتر بسته را ثبت و سپس Drop می‌کند.

```text
Remote public IP
 -> TCP 32111 -> knock_stage_1 (30s)
 -> TCP 43222 -> knock_stage_2 (30s after stage 2)
 -> TCP 54333 -> knock_authorized (15m)
 -> UDP 51820 -> valid WireGuard key -> encrypted tunnel -> exact ACL
```

Timeout برای هر مرحله است، نه یک مهلت ۳۰ ثانیه‌ای برای کل توالی. این طراحی ساده زیرتوالی مرتب را تشخیص می‌دهد: Knock اشتباه یا نامرتبط مرحله قبلی را ریست نمی‌کند. ماشین حالت سخت‌گیرانه نیست؛ اسکن می‌تواند سرانجام ترتیب لازم را ایجاد کند. Knock معتبر تکراری می‌تواند مجوز را تمدید کند. ترتیب اشتباه را از وضعیت پاک تست و زمان باقی‌مانده واقعی را در نسخه RouterOS خود مشاهده کنید.

Knock شرط مبتنی بر IP را تغییر می‌دهد، نه وضعیت سرویس را. پورت مدیریت را باز نمی‌کند، شخص را احراز هویت نمی‌کند، رمزنگاری ندارد و Winbox یا SSH غیرفعال را فعال نمی‌کند. ۱۵ دقیقه عمر Address List است؛ ذاتاً نشست‌های برقرارشده را قطع نمی‌کند. دانستن توالی نباید مجوز نامحدود داخلی بدهد.

![سه Knock مرتب TCP و مجوز موقت مبدأ IP](/assets/img/articles/content/mikrotik-port-knocking-secure-remote-access/knock-sequence.png)

تصویر مفهومی: هر مرحله ۳۰ ثانیه مهلت دارد و مجوز ۱۵ دقیقه معتبر است. Knock جای احراز هویت VPN نیست.

## ۳. دو معماری و انتخاب Production

معماری A دسترسی مستقیم بعد از Knock است؛ برای فهم معماری یا استثنایی بسیار محدود. ترافیک مقصد خود روتر از `input` و ترافیک عبوری به ESXi از `forward` می‌گذرد. `dstnat` مقصد عمومی را به میزبان داخلی ترجمه می‌کند. Source Address List شرط تطبیق است، نه احراز هویت. Connection Tracking جریان و تصمیم NAT بسته نخست را نگه می‌دارد.

یک استثنای مفهومی می‌تواند TCP عمومی `10443` را فقط به `172.16.99.11:443` نگاشت کند. هم DST-NAT و هم اجازه New در Forward باید `knock_authorized`، ورودی WAN، میزبان دقیق و سرویس ترجمه‌شده را شرط کنند. پاسخ Established و Default Deny حفظ می‌شود. این پیشنهاد اصلی Production نیست؛ Accept عمومی کل LAN مناسب نیست. این گزینه را کنار Lab VPN نصب نکنید.

معماری B پیشنهاد این مقاله است: Knock صحیح موقتاً UDP `51820` مربوط به WireGuard را مجاز می‌کند، Peer تعریف‌شده مالکیت کلید خصوصی را اثبات می‌کند و ترافیک رمزنگاری‌شده از ACL مستقل و حداقلی مدیریت می‌گذرد. WireGuard کلید را احراز می‌کند، نه هویت انسانی یا MFA را. احراز هویت برنامه مقصد همچنان ضروری است.

```text
Remote Administrator -> Internet -> MikroTik WAN (ether1 / WAN)
 -> Port Knocking -> Dynamic Address List -> Temporary Authorization
 -> WireGuard -> Encrypted Tunnel -> Management VLAN 99
     +-- MikroTik 172.16.99.1:22,8291
     +-- Cisco switch 172.16.99.2:22
     +-- VMware ESXi 172.16.99.11:443
     +-- VMware vCenter 172.16.99.12:443
     +-- Zabbix 172.16.99.20:443
     +-- NetBox 172.16.99.21:443
     +-- Linux 172.16.99.30:22
```

![ارتباط مدیر راه دور از WireGuard و ACL به VLAN 99 مدیریت](/assets/img/articles/content/mikrotik-port-knocking-secure-remote-access/wireguard-management.png)

معماری مفهومی: رمزنگاری روی روتر پایان می‌یابد و ترافیک داخلی مدیریت با ACL مقصد و سرویس محدود می‌شود. این تصویر اسکرین‌شات محصول یا نتیجه تست نیست.

## ۴. پیش‌نیاز Lab و مسیر ورودی

```text
RouterOS: v7 (record exact supported patched release)
WAN interface: ether1; interface list: WAN
Existing Management VLAN: 99, interface vlan99
Existing management gateway: 172.16.99.1/24
Management subnet: 172.16.99.0/24
WireGuard: wg-management, 10.77.99.1/24, UDP 51820
Remote peer: 10.77.99.2/32
Knocks: TCP 32111 -> 43222 -> 54333
Stage timeout: 30s each; authorised timeout: 15m
Public endpoint: vpn.example.com (replace with reachable IPv4)
```

از CHR یا روتر Lab با کنسول و میزبان مدیریت استفاده کنید. VLAN 99، Bridge VLAN Filtering، ترانک سوئیچ و `172.16.99.1/24` باید از قبل کار کنند؛ این راهنما Bridge عملیاتی را بازسازی نمی‌کند. Gateway میزبان‌ها `172.16.99.1` است یا Gateway واقعی باید مسیر `10.77.99.0/24` را از این روتر برگرداند. با LAN کاربر هم‌پوشانی نداشته باشید. معماری B به DST-NAT مدیریت یا Masquerade نیاز ندارد.

Default Deny اجازه رسیدن بسته و بررسی قبل از Drop را می‌دهد. اگر مودم بالادست NAT دارد، فقط سه پورت TCP مربوط به Knock و UDP `51820` را به MikroTik هدایت کنید، نه پنل‌ها را. CGNAT سرویس‌دهنده یا نبود مسیر ورودی به IP عمومی، Hub/Relay VPN با اتصال خروجی یا Access Connector نیاز دارد. DDNS از CGNAT عبور نمی‌کند. این Lab و اسکریپت‌های کلاینت IPv4 هستند.

## ۵. بررسی تنظیمات فعلی

```routeros
/system resource print
/system package print
/interface print
/interface list print
/interface list member print
/interface vlan print detail
/ip address print
/ip route print detail
/ip firewall filter print detail
/ip firewall nat print detail
/ip firewall raw print detail
/ip firewall mangle print detail
/ip firewall address-list print
/ip service print
/ipv6 firewall filter print detail
```

نسخه دقیق، ورودی واقعی WAN که در PPPoE یا LTE ممکن است `ether1` نباشد، عضویت WAN، مسیر برگشت و Port Forwardها را ثبت کنید. پورت Knock نباید سرویس واقعی یا مقصد DST-NAT باشد. Drop در RAW، NOTRACK، لیست مسدودی اسکن و Accept زودتر می‌توانند طراحی را مختل کنند. Acceptهای Established/Related، Drop نهایی WAN، FastTrack و Accept گسترده LAN را پیدا کنید. Append، Rule را پیش از Deny موجود نمی‌گذارد. سیاست Output باید پاسخ VPN را مجاز کند.

## ۶. Backup، Safe Mode و بازیابی

```routeros
/export file=before-pk-management
/system backup save name=before-pk-management password="REPLACE_WITH_UNIQUE_BACKUP_PASSWORD"
```

رمز را محلی جایگزین و هر دو فایل را در فضای حفاظت‌شده ذخیره کنید. Export متنی به‌طور پیش‌فرض مقادیر حساس را حذف می‌کند و بازیابی کامل Secret نیست. Backup باینری تنظیم حساس دارد و بازیابی آن سازگاری دستگاه و نسخه می‌خواهد. مقادیر اولیه سرویس و فایروال را ثبت کنید. کنسول/OOB یا LAN مطمئن مستقل را حفظ کنید؛ VPN تازه نباید تنها مسیر بازیابی باشد.

در ترمینال RouterOS با Ctrl+X وارد Safe Mode شوید و نشانگر را قبل از تغییر ببینید. دسته تغییرها کوچک باشد چون تاریخچه محدود است. قطع Session مالک پس از تشخیص، تغییرهای ثبت‌شده را برمی‌گرداند؛ Ctrl+D لغو صریح است. پس از تأیید، Ctrl+X خارج می‌شود و تغییرها را تثبیت می‌کند. پنجره نگهداری و مسئول OOB آماده باشد؛ بستن عادی ترمینال روش Commit نیست.

## ۷. ساخت WireGuard و یک Peer

```routeros
/interface wireguard add name=wg-management listen-port=51820 mtu=1420 comment="PK-MGMT: VPN interface"
/ip address add address=10.77.99.1/24 interface=wg-management comment="PK-MGMT: VPN gateway"
:put [/interface wireguard get [find where name="wg-management"] public-key]
/interface wireguard peers add interface=wg-management public-key="REPLACE_WITH_CLIENT_PUBLIC_KEY" allowed-address=10.77.99.2/32 comment="PK-MGMT: administrator laptop"
```

Addها را روی روتر فاقد این Objectها یک بار اجرا کنید. RouterOS جفت‌کلید خودش را می‌سازد. در Client رسمی تونل خالی بسازید تا کلید محلی ایجاد شود. فقط Public Key کلاینت در Peer روتر و Public Key روتر در Client قرار می‌گیرد. Allowed Address روتر `/32` کلاینت است نه Subnet مدیریت؛ انتخاب Peer و محدودیت Source داخلی را انجام می‌دهد. هر دستگاه کلید و `/32` جدا داشته باشد؛ کلید خصوصی منتشر نکنید.

## ۸. ساخت Chain مربوط به Knock

این Chain اختصاصی غیرفعال را قبل از اتصال به Input بسازید. همه مرحله‌ها فقط WAN، TCP SYN و حالت New هستند. مرحله اول پیش‌نیاز لیست ندارد، دومی مرحله اول و سومی مرحله دوم را لازم دارد. Action افزودن لیست Passthrough است؛ Drop پایانی تلاش را بدون پذیرش اتصال ثبت می‌کند. تفاوت پورت مقصد نمی‌گذارد یک بسته هر سه مرحله را Match کند.

```routeros
/ip firewall filter
add chain=pk-knock in-interface-list=WAN protocol=tcp tcp-flags=syn,!ack connection-state=new dst-port=32111 action=add-src-to-address-list address-list=knock_stage_1 address-list-timeout=30s comment="PK-MGMT: stage 1 for 30s"
add chain=pk-knock in-interface-list=WAN protocol=tcp tcp-flags=syn,!ack connection-state=new dst-port=43222 src-address-list=knock_stage_1 action=add-src-to-address-list address-list=knock_stage_2 address-list-timeout=30s comment="PK-MGMT: stage 2 for 30s"
add chain=pk-knock in-interface-list=WAN protocol=tcp tcp-flags=syn,!ack connection-state=new dst-port=54333 src-address-list=knock_stage_2 action=add-src-to-address-list address-list=knock_authorized address-list-timeout=15m comment="PK-MGMT: authorise source for 15m"
add chain=pk-knock action=drop comment="PK-MGMT: drop all knock packets"
```

لیست پس از Match به‌صورت Dynamic با پرچم D و زمان باقی‌مانده ظاهر می‌شود؛ رکورد مجاز دائمی نسازید. رکورد زمان‌دار در RAM است و با Reboot حذف می‌شود. ورود مبدأ به لیست تا زمانی که Rule مستقلی از آن استفاده نکند، چیزی را Accept نمی‌کند.

## ۹. محدودکردن WireGuard پیش از Acceptهای قبلی

Gate محدود WAN را پیش از Acceptهای Established/Related بگذارید. فقط پورت Knock و UDP `51820` را کنترل می‌کند و بقیه را به فایروال Default Deny قبلی برمی‌گرداند. این کار نمی‌گذارد تلاش UDP غیرمجاز اما از قبل Trackشده، Rule از نوع New-only را دور بزند. Jump را Disable بسازید، به بالا ببرید و پس از تکمیل Chain مقصد فعال کنید.

```routeros
/ip firewall filter
add chain=pk-wan connection-state=invalid action=drop comment="PK-MGMT: invalid WAN"
add chain=pk-wan protocol=tcp dst-port=32111,43222,54333 action=jump jump-target=pk-knock comment="PK-MGMT: inspect knocks"
add chain=pk-wan protocol=udp dst-port=51820 src-address-list=knock_authorized connection-state=new,established action=accept comment="PK-MGMT: admitted WireGuard only"
add chain=pk-wan protocol=udp dst-port=51820 action=drop comment="PK-MGMT: deny unauthorised WireGuard"
add chain=pk-wan action=return comment="PK-MGMT: retain existing WAN policy"
add chain=input in-interface-list=WAN action=jump jump-target=pk-wan disabled=yes comment="PK-MGMT: WAN gate"
move [find where comment="PK-MGMT: WAN gate"] 0
enable [find where comment="PK-MGMT: WAN gate"]
```

هیچ Accept مبتنی بر لیست برای همه سرویس‌های RouterOS نداریم؛ Drop فقط UDP `51820` است. این Lab عمداً عضویت مجاز را برای همه UDPهای بیرونی مربوط، از جمله Established، بررسی می‌کند؛ بنابراین انقضا انتقال را حتی با باقی‌ماندن Conntrack مسدود می‌کند. الگوی متداول New-only زیر Accept Established می‌تواند UDP قبلی را حفظ کند. هیچ‌یک Logout برنامه یا حذف کلید Peer نیست؛ Knock موفق بعدی می‌تواند انتقال را برگرداند.

## ۱۰. اعمال ACL شبکه مدیریت

Handshake مجوز LAN نیست. Input فقط Winbox و SSH روتر روی `172.16.99.1` را می‌پذیرد. Forward فقط HTTPS پنل‌ها و SSH میزبان‌های مشخص داخل `172.16.99.0/24` را می‌پذیرد. RDP ویندوز و Grafana تا افزودن Rule دقیق بازبینی‌شده مسدود می‌مانند. `wg-management` را عضو لیست LAN مطمئن نکنید.

```routeros
/ip firewall address-list
add list=pk_https_targets address=172.16.99.11 comment="PK-MGMT: ESXi HTTPS"
add list=pk_https_targets address=172.16.99.12 comment="PK-MGMT: vCenter HTTPS"
add list=pk_https_targets address=172.16.99.20 comment="PK-MGMT: Zabbix HTTPS"
add list=pk_https_targets address=172.16.99.21 comment="PK-MGMT: NetBox HTTPS"
add list=pk_ssh_targets address=172.16.99.2 comment="PK-MGMT: Cisco SSH"
add list=pk_ssh_targets address=172.16.99.30 comment="PK-MGMT: Linux SSH"
/ip firewall filter
add chain=pk-router connection-state=invalid action=drop comment="PK-MGMT: invalid inner input"
add chain=pk-router src-address=10.77.99.2 dst-address=172.16.99.1 protocol=tcp dst-port=22,8291 connection-state=new,established action=accept comment="PK-MGMT: router management only"
add chain=pk-router action=drop comment="PK-MGMT: deny other router access"
add chain=pk-forward connection-state=invalid action=drop comment="PK-MGMT: invalid inner forward"
add chain=pk-forward src-address=10.77.99.2 dst-address=172.16.99.0/24 dst-address-list=pk_https_targets protocol=tcp dst-port=443 connection-state=new,established action=accept comment="PK-MGMT: named HTTPS panels"
add chain=pk-forward src-address=10.77.99.2 dst-address=172.16.99.0/24 dst-address-list=pk_ssh_targets protocol=tcp dst-port=22 connection-state=new,established action=accept comment="PK-MGMT: named SSH targets"
add chain=pk-forward action=drop comment="PK-MGMT: deny other tunnel forwarding"
add chain=input in-interface=wg-management action=jump jump-target=pk-router disabled=yes comment="PK-MGMT: inner input gate"
add chain=forward in-interface=wg-management action=jump jump-target=pk-forward disabled=yes comment="PK-MGMT: inner forward gate"
add chain=forward out-interface=wg-management dst-address=10.77.99.2 connection-state=established,related action=accept disabled=yes comment="PK-MGMT: tracked replies without FastTrack"
move [find where comment="PK-MGMT: inner input gate"] 0
move [find where comment="PK-MGMT: inner forward gate"] 0
move [find where comment="PK-MGMT: tracked replies without FastTrack"] 0
enable [find where comment="PK-MGMT: inner input gate"]
enable [find where comment="PK-MGMT: inner forward gate"]
enable [find where comment="PK-MGMT: tracked replies without FastTrack"]
```

این Ruleها در هر دو جهت پیش از FastTrack هستند: ورودی از Chain اختصاصی و پاسخ از Accept دقیق Established/Related همان Peer می‌گذرد. Flow قبلاً FastTrackشده ممکن است تا انقضا یا حذف انتخابی میان‌بر بماند؛ با جریان تازه تست کنید. Drop پایانی نمی‌گذارد Accept گسترده LAN بعدی مقصد دیگری را باز کند. Rule پاسخ، New از LAN به Peer را مجاز نمی‌کند. Invalid Drop و Default Deny سایر بخش‌ها را حفظ کنید.

IP Services هم باید `10.77.99.2/32` را کنار محدوده LAN مطمئن قبلی برای Winbox و SSH بپذیرد. محدودیت فعلی را بخوانید و ادغام کنید، نه بازنویسی کورکورانه. سرویس Disable فعال‌سازی آگاهانه مستقلی لازم دارد. Host Firewall باید سرویس دقیق را از `10.77.99.2` بپذیرد. مسیر برگشت را تأیید کنید، نه Source NAT گسترده را. MTU برابر ۱۴۲۰ نقطه شروع است؛ اگر پاسخ بزرگ HTTPS گیر کرد، PMTU/ICMP و MTU کوچک‌تر تونل را بررسی کنید.

```routeros
/ip firewall filter print detail where comment~"PK-MGMT:"
/ip firewall filter print stats where comment~"PK-MGMT:"
/ip firewall address-list print detail where list~"knock_"
/ip service print detail
```

## ۱۱. تنظیم WireGuard کلاینت

```ini
[Interface]
PrivateKey = REPLACE_WITH_LOCAL_CLIENT_PRIVATE_KEY
Address = 10.77.99.2/32

[Peer]
PublicKey = REPLACE_WITH_ROUTER_PUBLIC_KEY
Endpoint = vpn.example.com:51820
AllowedIPs = 172.16.99.0/24
PersistentKeepalive = 25
```

فایل تکمیل‌شده را خصوصی نگه دارید. AllowedIPs مسیر Split به `/24` می‌سازد، نه ACL سرور؛ فایروال محدودتر است. DNS حذف شده؛ از IP مدیریت یا Resolver داخلی مشخص و صریحاً مجاز استفاده کنید. آدرس تونل روتر `10.77.99.1` مقصد تست این مسیر کلاینت نیست؛ برای مدیریت از `172.16.99.1` استفاده کنید. شروع خودکار VPN را تا پایان تست قبل از Knock خاموش نگه دارید.

## ۱۲. Windows 10 و 11؛ ابزار آماده و PowerShell

Ncat را از بسته رسمی Windows در Nmap نصب کنید؛ Nping همان مجموعه هم گزینه تولید بسته است. از Mirror اجرایی نگهداری‌نشده پرهیز کنید. PowerShell را در مسیر نصب باز یا برنامه را به PATH اضافه کنید. سه تلاش مستقل Ncat را مرتب و با فاصله کوتاه اجرا کنید. ورود به MikroTik لازم نیست. Timeout یا Refused قابل انتظار است؛ فقط شواهد سمت روتر، مجوز را ثابت می‌کند.

[دریافت رسمی Nmap و Ncat](https://nmap.org/download.html)

[مرجع دستورات Ncat](https://nmap.org/ncat/guide/)

```powershell
ncat.exe -4 -z -w 1s vpn.example.com 32111
Start-Sleep -Milliseconds 250
ncat.exe -4 -z -w 1s vpn.example.com 43222
Start-Sleep -Milliseconds 250
ncat.exe -4 -z -w 1s vpn.example.com 54333
```

گزینه بعد را در `Knock-Management.ps1` ذخیره کنید. از Windows PowerShell 5.1 و PowerShell 7 پشتیبانی می‌کند، یک IPv4 را یک بار Resolve و برای هر مرحله سوکت جدا ایجاد و قبل از ادامه آزاد می‌کند. Destination با متغیر رزروشده `$Host` تداخل ندارد. Timeout زیر مهلت مرحله است و Credential ذخیره نمی‌شود. نتیجه محلی ادعای موفقیت مجوز نمی‌کند.

```powershell
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)][string]$Destination,
    [ValidateNotNullOrEmpty()][int[]]$Ports = @(32111,43222,54333),
    [ValidateRange(100,3000)][int]$TimeoutMs = 1000,
    [ValidateRange(100,1000)][int]$DelayMs = 250
)
$ErrorActionPreference = 'Stop'
try {
    foreach ($Port in $Ports) {
        if ($Port -lt 1 -or $Port -gt 65535) { throw "Invalid port: $Port" }
    }
    $TargetIp = [System.Net.Dns]::GetHostAddresses($Destination) |
        Where-Object { $_.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork } |
        Select-Object -First 1
    if ($null -eq $TargetIp) { throw 'No IPv4 address found.' }
    Write-Host "Target IPv4: $TargetIp"
    for ($Index=0; $Index -lt $Ports.Count; $Index++) {
        $Client = [System.Net.Sockets.TcpClient]::new([System.Net.Sockets.AddressFamily]::InterNetwork)
        $WaitHandle = $null
        try {
            $Attempt = $Client.BeginConnect($TargetIp, $Ports[$Index], $null, $null)
            $WaitHandle = $Attempt.AsyncWaitHandle
            if ($WaitHandle.WaitOne($TimeoutMs)) {
                $Client.EndConnect($Attempt)
                Write-Host "Stage $($Index+1): TCP connected; admission still unverified."
            } else {
                Write-Host "Stage $($Index+1): local timeout; SYN may have reached router."
            }
        } catch {
            Write-Warning "Stage $($Index+1): $($_.Exception.GetBaseException().Message); admission unknown."
        } finally {
            $Client.Close()
            if ($null -ne $WaitHandle) { $WaitHandle.Close() }
        }
        if ($Index -lt $Ports.Count-1) { Start-Sleep -Milliseconds $DelayMs }
    }
    Write-Host 'Sequence attempted. Check router address list, then activate WireGuard and verify handshake.'
} catch {
    Write-Error "Cannot run sequence: $($_.Exception.Message)"
    exit 1
}
```

```powershell
.Knock-Management.ps1 -Destination vpn.example.com -TimeoutMs 1000 -DelayMs 250
# After importing and activating the completed WireGuard tunnel:
Test-NetConnection 172.16.99.30 -Port 22
ssh admin@172.16.99.30
```

بعد از Knock، تنظیم محلی را در Client رسمی WireGuard ویندوز Import و Activate کنید. آخرین Handshake و شمارنده دریافت را ببینید و سرویس مجاز را تست کنید. اتصال موفق TCP به پورت Knock با سیاست Drop ما غیرمنتظره است؛ Listener، NAT بالادست یا ترتیب Rule را بررسی کنید. نه موفقیت و نه شکست TCP وجود رکورد لیست را ثابت نمی‌کند.

[کلاینت‌های رسمی WireGuard](https://www.wireguard.com/install/)

## ۱۳. Linux؛ درخواست مرتب و سپس VPN

در Debian و Ubuntu بسته‌های `netcat-openbsd` و `wireguard-tools` را نصب کنید. SYN می‌تواند قبل از Drop لیست را تغییر دهد؛ پاسخ لازم نیست. اسکریپت از `nc -4 -z -w 1` استفاده می‌کند، خروجی غیرصفر را تحمل و یک IPv4 را برای همه تلاش‌ها Resolve می‌کند. از اسکن موازی استفاده نکنید.

```bash
sudo apt update
sudo apt install netcat-openbsd wireguard-tools
```

```bash
#!/usr/bin/env bash
set -u
set -o pipefail
if [[ $# -ne 1 ]]; then echo "Usage: $0 public-ip-or-fqdn" >&2; exit 2; fi
for tool in nc getent awk; do
    command -v "$tool" >/dev/null || { echo "Missing: $tool" >&2; exit 1; }
done
target=$(getent ahostsv4 "$1" | awk '!found {ip=$1; found=1} END {if(found) print ip}')
[[ -n "$target" ]] || { echo 'No IPv4 address found' >&2; exit 1; }
echo "Target IPv4: $target"
for port in 32111 43222 54333; do
    if nc -4 -z -v -w 1 "$target" "$port"; then
        echo "$port: TCP connected; router authorisation unknown"
    else
        echo "$port: timeout/refusal/local error; knock may have arrived"
    fi
    sleep 0.25
done
echo 'Sequence attempted; verify address list and WireGuard handshake.'
```

```bash
chmod 700 knock-management.sh
./knock-management.sh vpn.example.com
# Store the completed private client config first:
sudo chmod 600 /etc/wireguard/wg-management.conf
sudo wg-quick up wg-management
sudo wg show wg-management latest-handshakes
ip route get 172.16.99.30
ssh admin@172.16.99.30
# After maintenance:
sudo wg-quick down wg-management
```

برای Nmap از اسکن مستقل تک‌پورت TCP Connect استفاده کنید، نه یک اسکن چندپورت. زمان‌بندی و تکرار با nc فرق دارد؛ هر تلاش را در مهلت مرحله نگه دارید و شواهد بسته را ببینید. روش اصلی ساده‌تر همان اسکریپت nc است.

```bash
nmap -sT -Pn -n -p 32111 --max-retries 0 --host-timeout 3s vpn.example.com
sleep 0.25
nmap -sT -Pn -n -p 43222 --max-retries 0 --host-timeout 3s vpn.example.com
sleep 0.25
nmap -sT -Pn -n -p 54333 --max-retries 0 --host-timeout 3s vpn.example.com
```

## ۱۴. تست پذیرش و عیب‌یابی

برای این مقاله VM یا روتر واقعی RouterOS در دسترس نبوده است. موارد زیر معیار پذیرش‌اند، نه نتایج Pass ثبت‌شده. از مبدأ واقعاً خارجی استفاده و IPv4 عمومی مشاهده‌شده، نسخه دقیق، زمان، تغییر شمارنده، پرچم D و Timeout و آخرین Handshake را ثبت کنید. دستورهای زیر توضیح هر تست، فرمان تشخیصی همان تست هستند.

### تست ۱ — قبل از Knock

VPN و فرستنده را متوقف و فقط مبدأ تست را از سه لیست پاک کنید؛ سپس تونل تازه بسازید. انتظار: رشد شمارنده Drop غیرمجاز و نبود Handshake تازه. شکست: Handshake تازه کار کند. علت: Gate زیر Accept، لیست WAN غلط، عبور IPv6 یا رکورد قبلی. راه‌حل: اصلاح ترتیب و عضویت، پاک‌کردن مبدأ تست و تکرار؛ Timestamp قدیمی موفقیت جدید نیست.

```routeros
/ip firewall filter print stats where chain="pk-wan"
/ip firewall address-list print detail where list="knock_authorized"
/interface wireguard peers print detail
```

### تست ۲ — ترتیب اشتباه و Timeout

از وضعیت پاک `54333,43222,32111` را بفرستید. انتظار: حداکثر مرحله اول، نه مجوز. شکست: مجوز ظاهر شود. علت: مرحله دوم قبلی، NAT مشترک، فرستنده هم‌زمان یا شرط غلط. راه‌حل: توقف سایر فرستنده‌ها، انتظار برای انقضای هر دو مرحله یا حذف فقط مبدأ تست و تکرار. همچنین `32111` و سپس بیش از ۳۰ ثانیه مکث و `43222` را تست کنید؛ مرحله دوم نباید ظاهر شود.

```routeros
/ip firewall address-list print detail where list~"knock_"
/ip firewall filter print stats where chain="pk-knock"
```

### تست ۳ — توالی صحیح

توالی `32111,43222,54333` را در مهلت مرحله‌ها بفرستید. انتظار: رکورد D در `knock_authorized` با تقریباً ۱۵ دقیقه اعتبار و رشد شمارنده مرحله‌ها. شکست: فقط مرحله اول یا هیچ رکوردی. علت: فیلتر بالادست، نبود Forward TCP، RAW یا مسدودی اسکن، ورودی یا زمان‌بندی غلط. راه‌حل: هر پورت را Capture و اولین نقطه بدون رشد شمارنده را اصلاح کنید.

```routeros
/ip firewall filter print stats where chain="pk-knock"
/ip firewall address-list print detail where list="knock_authorized"
```

### تست ۴ — Handshake VPN

پس از Knock، VPN را فعال کنید. انتظار: Handshake تازه و رشد Rx/Tx. شکست: شمارنده پذیرش بالا برود اما Handshake نباشد. علت: کلید یا Endpoint غلط، خروجی عمومی متفاوت Knock و VPN، فیلتر Output، مشکل ساعت یا Multi-WAN نامتقارن. راه‌حل: مقایسه محلی Public Key و دنبال‌کردن UDP دوطرفه؛ کلید خصوصی منتشر نکنید.

```routeros
/interface wireguard peers print detail
/ip firewall filter print stats where chain="pk-wan"
/ip firewall connection print detail where protocol=udp
```

### تست ۵ — مدیریت مجاز و ممنوع

HTTPS روی `172.16.99.11:443` و SSH روی `172.16.99.30:22` و سپس مقصد ممنوع `172.16.99.30:3389` و میزبان LAN نامرتبط را تست کنید. انتظار: فقط سرویس اعلام‌شده کار و شمارنده Deny رشد کند. شکست: همه با وجود Handshake قطع باشند یا مقصد اضافی کار کند. علت: Host Firewall یا مسیر برگشت، AllowedIPs، ترتیب Gate یا FastTrack قبلی. راه‌حل: اصلاح مسیر و ACL، حذف انتخابی Flow شناسایی‌شده Lab و تست تازه.

```routeros
/ip firewall filter print stats where chain="pk-forward"
/ip firewall filter print stats where chain="pk-router"
/ip route print detail
/ip firewall connection print
```

### تست ۶ — انقضا و نشست‌های قبلی

فرستنده را متوقف و SSH را فعال نگه دارید و ۱۵ دقیقه صبر کنید. انتظار: حذف مجوز؛ Gate همه‌بسته‌ای ما UDP بیرونی را Drop کند، انتقال نشست قبلی متوقف و تونل تازه تا Knock مجدد ناموفق باشد. Gate از نوع New-only زیر Accept Established می‌تواند UDP قبلی را حفظ کند. شکست: این Lab پس از انقضا داده عبور دهد. علت: Bypass، IPv6، رکورد یا مبدأ دیگر یا تمدید. راه‌حل: بررسی ورودی، شمارنده و Conntrack و رفع Bypass. Last Handshake می‌تواند تاریخچه را نگه دارد؛ نشست برنامه الزاماً نابود نشده است.

```routeros
/ip firewall address-list print detail where list="knock_authorized"
/ip firewall filter print stats where chain="pk-wan"
/ip firewall connection print
/interface wireguard peers print detail
```

### تست ۷ — شواهد فایروال و بسته

شمارنده را اطراف یک تلاش مقایسه کنید. مسیر انتظار: WAN Gate، UDP مجاز، ACL داخلی و Accept پاسخ Trackشده. شکست: Capture ورودی را ببیند ولی Filter تغییر نکند. علت: RAW Drop، انتقال مسیر به Forward با DST-NAT، عضویت WAN غلط یا L3 Hardware Offload. راه‌حل: بررسی مرحله زودتر و سیاست Interface و Bridge. Torch و Sniffer می‌توانند FastTrack را تغییر دهند؛ پذیرش را با Capture متوقف تکرار کنید.

```routeros
/ip firewall filter print stats
/ip firewall raw print stats
/ip firewall nat print stats
/ip firewall address-list print detail
/ip firewall connection print
/interface wireguard peers print detail
/log print
/tool torch interface=ether1 ip-protocol=tcp port=32111
/tool sniffer quick interface=ether1 ip-protocol=udp port=51820
```

Torch و Sniffer را جدا اجرا و با Ctrl+C متوقف کنید. ضبط را به مبدأ عمومی معلوم و بازه کوتاه محدود کنید. اطلاعات Endpoint خروجی Peer و Connection را پیش از اشتراک حذف کنید. لاگ پیش‌فرض ساکت است؛ فقط مجوز را موقتاً Log و بعد خاموش کنید. Log هر SYN می‌تواند روتر را تحت فشار بگذارد.

```routeros
/ip firewall filter set [find where comment="PK-MGMT: authorise source for 15m"] log=yes log-prefix="PK-AUTH "
/log print where message~"PK-AUTH"
/ip firewall filter set [find where comment="PK-MGMT: authorise source for 15m"] log=no
```

## ۱۵. لغو مجوز و Rollback امن

قبل از حذف فقط مبدأ عمومی تست از لیست‌ها، VPN و فرستنده را متوقف کنید. IP مستنداتی زیر را جایگزین کنید. همه Conntrack یا همه لیست‌ها را در Production پاک نکنید. حذف رکورد، کلید یا نشست برنامه را حذف نمی‌کند.

```routeros
/ip firewall address-list remove [find where list="knock_stage_1" and address="198.51.100.25"]
/ip firewall address-list remove [find where list="knock_stage_2" and address="198.51.100.25"]
/ip firewall address-list remove [find where list="knock_authorized" and address="198.51.100.25"]
```

برای لغو فوری از OOB همان Peer را Disable کنید. Conntrack را بررسی و Flow دقیق UDP بیرونی و مدیریت داخلی را پیدا کنید؛ در صورت نیاز فقط ID نمایش‌داده‌شده همان‌ها را حذف و نشست مقصد را ببندید. برای Rollback ابتدا Peer و Interface را Disable کنید. پیش از حذف Dropهای Gate، Accept گسترده قبلی WireGuard را بررسی کنید. فرض دستورات این است که همه Objectهای PK-MGMT متعلق به Lab و نام Chainها قبلاً آزاد بوده‌اند.

```routeros
/interface wireguard peers disable [find where comment="PK-MGMT: administrator laptop"]
/interface wireguard disable [find where name="wg-management"]
/ip firewall filter remove [find where comment~"^PK-MGMT:"]
/ip firewall address-list remove [find where list="knock_stage_1"]
/ip firewall address-list remove [find where list="knock_stage_2"]
/ip firewall address-list remove [find where list="knock_authorized"]
/ip firewall address-list remove [find where comment~"^PK-MGMT:"]
/interface wireguard peers remove [find where comment="PK-MGMT: administrator laptop"]
/ip address remove [find where comment="PK-MGMT: VPN gateway"]
/interface wireguard remove [find where name="wg-management"]
```

محدودیت IP Service تغییرکرده را از پرونده تغییر برگردانید، Default Deny و LAN قبلی را تأیید و پس از تأیید بازیابی از Safe Mode خارج شوید. بازیابی باینری آخرین راه نگهداری است: `/system backup load name=before-pk-management.backup` با رمز محلی. Reboot و جایگزینی کامل، شامل تغییر نامرتبط بعدی، را در نظر بگیرید. Export را کورکورانه روی Object موجود Import نکنید؛ Add می‌تواند تکراری بسازد.

## ۱۶. مرزهای امنیتی باقی‌مانده

Port Scanning و Brute Force: سه پورت ثابت تبادل Secret رمزنگاری‌شده ندارند. اسکن می‌تواند توالی را پیدا یا تصادفی زیرتوالی مرتب را ایجاد کند؛ بازه کوتاه احراز هویت قوی نمی‌سازد. Replay Attack: مشاهده‌کننده می‌تواند Knock ضبط‌شده را تکرار کند چون Nonce یا Challenge نیست. تغییر پورت جای کلید VPN، احراز هویت یا رسیدگی رخداد را نمی‌گیرد.

IP Spoofing: ثبت SYN تکمیل TCP Handshake نمی‌خواهد؛ مبدأ جعلی می‌تواند بدون دریافت پاسخ لیست را پر کند. کلید معتبر WireGuard به دست نمی‌آید، اما نویز یا مجوز برای دیگری ایجاد می‌شود. Anti-spoofing بالادست و اعتبارسنجی Source مناسب اعمال کنید؛ Reverse Path Filtering سخت‌گیرانه می‌تواند Multi-WAN نامتقارن را بشکند. IP هویت شخص نیست.

Source IP Sharing و CGNAT: همه پشت NAT عمومی مجوز را شریک‌اند، ولی هر کدام کلید Peer لازم دارند. Proxy سازمانی یا موبایل ممکن است Knock و UDP را با IP متفاوت بفرستد. Dynamic Public IP و جابه‌جایی کاربر Knock تازه از مبدأ تازه می‌خواهند. Roaming Endpoint فایروال را دور نمی‌زند. DDNS سمت سازمان باید به آدرس فعلی قابل دسترس Resolve شود.

Firewall Rule Ordering، Connection Tracking و FastTrack را با هم بررسی کنید. Gate پیش از Accept میان‌بر است؛ تصمیم NAT در Flow باقی می‌ماند و Connection قبلاً FastTrackشده ممکن است ACL تازه را دور بزند. اینجا NOTRACK استفاده نکنید، بعد از ارتقا یا تغییر Routing دوباره تست کنید و VLAN مدیریت را با ACL مستقل از VLAN کاربران و سرورها جدا نگه دارید. Knock مسیر ترافیک جانبی دیگر را محافظت نمی‌کند.

IPv6 Firewall: مسیر `/ip firewall` فقط IPv4 است. آدرس Global IPv6 یا AAAA نباید سیاست را دور بزند. Default Deny معادل Input و Forward IPv6 را حفظ و تا تست طراحی مجوز مستقل IPv6، انتشار مستقیم WireGuard و مدیریت روی IPv6 را مسدود کنید. ICMPv6 و Neighbor Discovery ضروری را حفظ کنید؛ Drop IPv4 را کورکورانه کپی نکنید.

Rate Limiting و Logging: کنترل اندازه‌گیری‌شده به‌ازای مبدأ و حفاظت بالادست برای محدودکردن بار SYN و رشد لیست لازم است. Limit سراسری فقط روی Accept می‌تواند در Flood کاربر واقعی را محروم کند؛ بسته مازاد Drop صریح می‌خواهد. آستانه بالاتر از Retransmission طبیعی، به‌خصوص NAT مشترک، تنظیم شود. Rule مسدودی اسکن باید آگاهانه اجازه رسیدن این گردش به Chain را بدهد. نرخ صدور مجوز، مبدأ غیرعادی، CPU و RAM، Handshake ناموفق و موجودی کلید را پایش و رویداد منتخب را با نگهداری محدود به لاگ مرکزی حفاظت‌شده بفرستید.

Multi-WAN: Knock و UDP باید با همان Source عمومی کلاینت به همان روتر برسند. پاسخ خروجی و جدول Policy درست می‌خواهد؛ PCC، ECMP و مسیر نامتقارن می‌توانند Handshake را بشکنند. Connection/Routing Mark بازبینی‌شده یا Endpoint اختصاصی و تست Failover لازم است. Mark خروجی تک‌WAN را روی PBR موجود Paste نکنید.

## ۱۷. Port Knocking چه زمانی انتخاب مناسبی نیست؟

برای دستگاه‌های ثابت مدیران، WireGuard همیشه‌در‌دسترس با مدیریت قوی چرخه Peer اغلب ساده‌تر است: وابستگی زمان‌بندی Knock و IP مشترک حذف می‌شود، اما Listener VPN در دسترس و لغو کلید دستگاه همچنان نیازمند مدیریت است. Knock لایه دفاع تکمیلی اختیاری است، نه الزام Enterprise.

Bastion Host می‌تواند مدیریت را با MFA و ثبت نشست متمرکز کند، اما مرز حساس Patch و Availability می‌شود و دسترسی خودش باید حداقلی باشد. Zero Trust Access هویت، وضعیت دستگاه و مجوز هر برنامه را ارزیابی می‌کند و اغلب با Connector خروجی پشت CGNAT کار می‌کند. وابستگی به Provider و هویت، هزینه و محدودیت پروتکل اضافه می‌شود. وقتی Audit نام‌دار، MFA، پیمانکار، جابه‌جایی و مقیاس سیاست اولویت دارند، این‌ها مناسب‌ترند. در هر مدل مسیر اضطراری مستقل حفظ کنید.

## ۱۸. پرسش‌های فنی

### آیا Timeout یعنی Knock ناموفق بوده؟

خیر. SYN می‌تواند قبل از Drop لیست را تغییر دهد. شمارنده و رکورد Dynamic روتر را ببینید، نه فقط نتیجه TCP.

### آیا انقضا همه نشست‌ها را قطع می‌کند؟

ذاتاً خیر. Conntrack و Accept Established می‌توانند انتقال را حفظ کنند. این Lab همه UDP بیرونی را پیش از آن Acceptها بررسی می‌کند، اما کلید Peer یا نشست برنامه را حذف نمی‌کند.

### آیا جای VPN یا MFA است؟

خیر. مجوز Source IP است. WireGuard رمزنگاری و احراز کلید Peer را می‌دهد؛ هویت انسانی، MFA و ورود مقصد مستقل‌اند.

### آیا Winbox غیرفعال را فعال یا CGNAT را دور می‌زند؟

خیر. سرویس اجراشده و مسیر ورودی پیش‌نیازند. بدون دسترسی ورودی، Hub قابل دسترس VPN با اتصال خروجی یا Access Connector لازم است.

### چرا کل Subnet مدیریت مجاز نباشد؟

لپ‌تاپ آلوده دسترسی بیش از نیاز می‌گیرد. مسیر /24 کلاینت را با ACL دقیق مقصد و سرویس روی روتر و میزبان محدود کنید.

### آیا اجرای واقعی RouterOS تست شده؟

خیر. دستورات با مستندات رسمی تطبیق داده شده‌اند؛ ماتریس پذیرش را پیش از Production روی نسخه دقیق RouterOS خود اجرا کنید.

## ۱۹. منابع رسمی و مقاله‌های مرتبط

بررسی در ۴ نوامبر ۲۰۲۶ انجام شده است. مستندات help.mikrotik.com اعلان توقف به‌روزرسانی و ارجاع به Manual رسمی جدید دارند. دستورات از قابلیت مستند Filter و List و Interface و Peer در RouterOS v7 استفاده می‌کنند. معماری VPN محدود و ACL انتخاب طراحی این مقاله‌اند، نه نسخه‌برداری دستورالعمل سازنده؛ رفتار نسخه دقیق همچنان Lab می‌خواهد.

[Port Knocking رسمی MikroTik](https://help.mikrotik.com/docs/spaces/ROS/pages/154042369/Port+knocking)

[Firewall Filter رسمی RouterOS](https://help.mikrotik.com/docs/spaces/ROS/pages/48660574/Filter)

[Address List رسمی RouterOS](https://help.mikrotik.com/docs/spaces/ROS/pages/130220135/Address-lists)

[WireGuard رسمی MikroTik](https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard)

[سخت‌سازی روتر در مستندات رسمی](https://help.mikrotik.com/docs/spaces/ROS/pages/328353/Securing+your+router)

[Connection Tracking رسمی RouterOS](https://help.mikrotik.com/docs/spaces/ROS/pages/130220087/Connection+tracking)

[Safe Mode و مدیریت تنظیمات RouterOS](https://help.mikrotik.com/docs/spaces/ROS/pages/328155/Configuration+Management)

[Manual رسمی جدید RouterOS](https://manual.mikrotik.com/docs/introduction/)

[مرتبط: سخت‌سازی فایروال میکروتیک](/articles/mikrotik-firewall-hardening-input-forward-chain)

[مرتبط: مسیریابی WireGuard در RouterOS v7](/articles/wireguard-mikrotik-routeros-7)

[مرتبط: Policy Routing میکروتیک](/articles/mikrotik-pbr-client)

## ۲۰. دانلود و چک‌لیست استقرار

پیش از Production، بازیابی OOB، Backup، ورودی WAN، Default Deny، ترتیب و Timeout مرحله، مالکیت کلید، ACL دقیق، مسیر برگشت، IPv6، هر دو جهت FastTrack، انقضا و Rollback تمرین‌شده را تأیید کنید. تنظیم دقیق بازبینی‌شده را در پرونده تغییر نگه دارید. دانلودهای `.rsc` اجزای مرتب‌اند، نه Provisioning کامل روتر. پیش‌نیازها را بخوانید و هنگام نصب Rollback را Import نکنید.

[دانلود article.fa.md](/downloads/mikrotik-port-knocking-secure-remote-access/article.fa.md)

[دانلود article.en.md](/downloads/mikrotik-port-knocking-secure-remote-access/article.en.md)

[دانلود Knock-Management.ps1](/downloads/mikrotik-port-knocking-secure-remote-access/Knock-Management.ps1)

[دانلود knock-management.sh](/downloads/mikrotik-port-knocking-secure-remote-access/knock-management.sh)

[دانلود knock-chain.rsc](/downloads/mikrotik-port-knocking-secure-remote-access/knock-chain.rsc)

[دانلود wan-gate.rsc](/downloads/mikrotik-port-knocking-secure-remote-access/wan-gate.rsc)

[دانلود management-acl.rsc](/downloads/mikrotik-port-knocking-secure-remote-access/management-acl.rsc)

[دانلود wg-management.conf.example](/downloads/mikrotik-port-knocking-secure-remote-access/wg-management.conf.example)

[دانلود rollback.rsc](/downloads/mikrotik-port-knocking-secure-remote-access/rollback.rsc)
