تانل Site-to-Site بین دو میکروتیک
با WireGuard در RouterOS 7
این نسخه فقط WireGuard را پوشش میدهد و تا زمان اجرای کامل سناریو در آزمایشگاه با indexable:0 نگه داشته شده است. مثال برای دو روتر RouterOS 7 با شبکههای غیرهمپوشان و IP عمومی قابلدسترسی نوشته شده؛ آدرسهای عمومی مثال از بازههای مستندسازی هستند و باید با مقادیر واقعی جایگزین شوند.
سناریو، پیشنیازها و برنامه آدرسدهی
هدف این است که دستگاههای LAN شعبه A بتوانند بدون NAT با LAN شعبه B ارتباط داشته باشند و برعکس. در مثال، WAN روتر A برابر 198.51.100.10، WAN روتر B برابر 203.0.113.20، شبکه A برابر 192.168.10.0/24 و شبکه B برابر 192.168.20.0/24 است. این دو LAN نباید همپوشانی داشته باشند. برای خود تونل نیز شبکهی مجزای 10.255.255.0/30 در نظر میگیریم.
- هر دو روتر RouterOS 7 و ساعت صحیح داشته باشند
- UDP/51820 بین endpointها قابل عبور باشد
- LAN A و LAN B همپوشانی نداشته باشند
- قبل از تغییر firewall از تنظیمات روتر export و backup تهیه شود
WireGuard در RouterOS 7 بخشی از سیستم است و نیازی به فرمانی برای enable کردن package جداگانه ندارد. افزودن interface یک جفت کلید میسازد؛ فقط public key را با سمت دیگر ردوبدل کنید و private key را منتشر نکنید.
مرحله ۱: ساخت WireGuard interface و IP تونل
روی روتر A interface و آدرس اول شبکه /30 را بسازید. سپس جزئیات interface را چاپ و مقدار public-key را یادداشت کنید.
# Router A
/interface/wireguard/add name=wg-site-b listen-port=51820 comment="WireGuard to Site B"
/ip/address/add address=10.255.255.1/30 interface=wg-site-b
/interface/wireguard/print detail where name=wg-site-b
روی روتر B همین کار را با نام و آدرس سمت دوم انجام دهید.
# Router B
/interface/wireguard/add name=wg-site-a listen-port=51820 comment="WireGuard to Site A"
/ip/address/add address=10.255.255.2/30 interface=wg-site-a
/interface/wireguard/print detail where name=wg-site-a
خروجی print ممکن است اطلاعات حساس هم داشته باشد؛ تنها public key را کپی کنید. نیازی به محاسبه یا واردکردن دستی private key نیست.
مرحله ۲: تعریف peerها با propertyهای صحیح
در RouterOS، endpoint با دو property جدا یعنی endpoint-address و endpoint-port تعریف میشود. allowed-address باید هم IP تونل peer و هم LAN پشت آن peer را شامل شود. بازههای یک peer نباید با peer دیگر روی همان interface همپوشانی داشته باشند.
# Router A — public key روتر B را جایگزین کنید
/interface/wireguard/peers/add interface=wg-site-b public-key="SITE_B_PUBLIC_KEY" endpoint-address=203.0.113.20 endpoint-port=51820 allowed-address=10.255.255.2/32,192.168.20.0/24 comment="Site B peer"
# Router B — public key روتر A را جایگزین کنید
/interface/wireguard/peers/add interface=wg-site-a public-key="SITE_A_PUBLIC_KEY" endpoint-address=198.51.100.10 endpoint-port=51820 allowed-address=10.255.255.1/32,192.168.10.0/24 comment="Site A peer"
در سناریوی پایه که هر دو endpoint مستقیماً قابل دسترسی هستند، keepalive لازم نیست. اگر یک peer پشت NAT است و باید mapping آن زنده بماند، روی همان peer مقدار persistent-keepalive=25 را بررسی و اعمال کنید؛ مقدار پیشفرض صفر است.
مرحله ۳: افزودن route برای LAN مقابل
allowed-address جای route سیستم را نمیگیرد. چون دو IP تونل روی یک شبکهی متصل /30 هستند، میتوان IP تونل سمت مقابل را gateway مسیر استاتیک قرار داد.
# Router A
/ip/route/add dst-address=192.168.20.0/24 gateway=10.255.255.2 comment="Route to Site B LAN"
# Router B
/ip/route/add dst-address=192.168.10.0/24 gateway=10.255.255.1 comment="Route to Site A LAN"
اگر یکی از این prefixها از قبل route دیگری دارد، distance و جدول مسیریابی را پیش از افزودن بررسی کنید. این مثال از routing table اصلی و یک WAN در هر سمت استفاده میکند؛ multi-WAN و policy routing به طراحی جداگانه نیاز دارند.
مرحله ۴: اجازه handshake در input و ترافیک بین شعب در forward
بستهی UDP که مقصدش خود روتر است از chain ورودی عبور میکند؛ ترافیکی که از یک LAN به LAN دیگر میرود از chain forward. ruleهای accept باید پیش از ruleهای drop مرتبط قرار بگیرند. چون ترتیب firewall هر روتر متفاوت است، یک شمارهی ثابت برای place-before ارائه نمیشود؛ ابتدا /ip/firewall/filter/print را ببینید و ruleها را در جای درست قرار دهید.
# Router A
/ip/firewall/filter/add chain=input action=accept protocol=udp src-address=203.0.113.20 dst-port=51820 comment="Allow WireGuard handshake from Site B"
/ip/firewall/filter/add chain=forward action=accept src-address=192.168.10.0/24 dst-address=192.168.20.0/24 comment="Allow Site A to Site B"
/ip/firewall/filter/add chain=forward action=accept src-address=192.168.20.0/24 dst-address=192.168.10.0/24 comment="Allow Site B to Site A"
# Router B
/ip/firewall/filter/add chain=input action=accept protocol=udp src-address=198.51.100.10 dst-port=51820 comment="Allow WireGuard handshake from Site A"
/ip/firewall/filter/add chain=forward action=accept src-address=192.168.20.0/24 dst-address=192.168.10.0/24 comment="Allow Site B to Site A"
/ip/firewall/filter/add chain=forward action=accept src-address=192.168.10.0/24 dst-address=192.168.20.0/24 comment="Allow Site A to Site B"
بعد از افزودن، ruleهای جدید را بالاتر از dropهای عمومی قرار دهید و counter آنها را هنگام تست ببینید. بازکردن WinBox، SSH یا WebFig روی WAN برای کارکرد WireGuard لازم نیست.
مرحله ۵: NAT bypass فقط در صورت match شدن masquerade
اگر masquerade فقط روی WAN interface یا WAN list اعمال میشود و WireGuard عضو آن نیست، معمولاً NAT bypass جدا لازم نیست. اگر rule وسیع srcnat ترافیک بین دو LAN را هم match میکند، پیش از masquerade یک action=accept اضافه کنید تا آدرس مبدا بین شعب حفظ شود.
# فقط در صورت نیاز — Router A
/ip/firewall/nat/add chain=srcnat action=accept place-before=0 src-address=192.168.10.0/24 dst-address=192.168.20.0/24 comment="No NAT between Site A and Site B"
# فقط در صورت نیاز — Router B
/ip/firewall/nat/add chain=srcnat action=accept place-before=0 src-address=192.168.20.0/24 dst-address=192.168.10.0/24 comment="No NAT between Site B and Site A"
فرمان قدیمی این مقاله که از action=jump و property نامعتبر استفاده میکرد حذف شده است. برای action=jump، property معتبر jump-target است؛ اما در این سناریو اصولاً به chain پرش نیاز نداریم.
آزمون handshake، route و ارتباط دو LAN
ابتدا وضعیت peer و زمان آخرین handshake را ببینید. سپس IP تونل و بعد gateway شبکهی دور را ping کنید. اگر تونل ping میشود اما LAN مقابل نه، route، forward firewall و gateway پیشفرض دستگاه مقصد را بررسی کنید.
# روی Router A
/interface/wireguard/peers/print detail
/ip/route/print where dst-address=192.168.20.0/24
/ping 10.255.255.2 count=4
/ping 192.168.20.1 count=4
# روی Router B
/interface/wireguard/peers/print detail
/ip/route/print where dst-address=192.168.10.0/24
/ping 10.255.255.1 count=4
/ping 192.168.10.1 count=4
نبودن handshake معمولاً به endpoint، public key یا firewall ورودی مربوط است. handshake بدون عبور داده میتواند از allowed-address، route یا forward firewall باشد. تغییرات را یکبهیک انجام دهید و از log و counter ruleها برای تشخیص استفاده کنید.
محدوده این راهنما و شرط انتشار
این پیکربندی برای سناریوی سادهی دو endpoint ثابت، یک WAN در هر سمت، routing table اصلی و LANهای غیرهمپوشان نوشته شده است. NAT پیچیده، endpoint پویا، چند WAN، VRF، policy routing و اتصال بیش از دو شعبه نیازمند طراحی و آزمون جداگانهاند. هیچ فرمانی را بدون تطبیق prefixها، interfaceها و ترتیب firewall روی روتر production اجرا نکنید.
صفحه با indexable:0 تحویل میشود تا پس از اجرای آزمایشگاهی روی دو RouterOS 7، ثبت خروجی handshake، آزمون ارتباط دوطرفه و بازبینی یک متخصص شبکه منتشر شود. تنها بعد از عبور از این چکلیست باید indexable شود.
پرسشهای پرتکرار
آیا WireGuard در RouterOS 7 به package جدا نیاز دارد؟
خیر، WireGuard در RouterOS 7 در دسترس است و interface با منوی /interface/wireguard ساخته میشود.
کدام کلید را باید بین دو روتر جابهجا کنم؟
فقط public key هر interface را به peer سمت مقابل بدهید. private key باید محرمانه روی همان روتر بماند.
چرا allowed-address بهتنهایی کافی نیست؟
allowed-address انتخاب peer و محدوده مجاز را مشخص میکند، اما برای LAN دور باید route مناسب در جدول مسیریابی نیز وجود داشته باشد.
آیا persistent-keepalive همیشه لازم است؟
خیر، مقدار پیشفرض صفر است. معمولاً برای peer پشت NAT یا اتصالی که باید mapping کمترافیک آن زنده بماند مقدار 25 ثانیه بررسی میشود.
آیا باید برای تونل NAT انجام دهم؟
در site-to-site معمولاً هدف حفظ آدرسهای دو LAN است. bypass فقط وقتی لازم است که rule عمومی masquerade ترافیک بین دو شبکه را نیز match کند.
منابع رسمی و مطالعه بیشتر
پیش از اجرا، سناریوی شبکه را بازبینی کن
Prefixها، endpointها و ترتیب firewall باید با توپولوژی واقعی شما تطبیق داده شوند.