المستندات

اختيار ما يمر عبر النفق

وصفات RouterOS اختيارية لموجّه ForestVPN — إرسال مجموعة واحدة من التطبيقات، إرسال كل شيء، وإيقاف تسرّب حركة المرور عندما يكون النفق معطّلاً.

آخر تحديث: 8 أكتوبر 2026

كل ما في هذه الصفحة اختياري. يُنفّق موجّه ForestVPN حركة مروره الخاصة فور الاتصال، ولا شيء من هذا مطلوب لذلك. هذه هي المهمة الأخرى: تحديد أي جزء من حركة مرور شبكتك المحلية يغادر عبر خادم الخروج، وماذا يحدث عندما يتعذّر الوصول إلى خادم الخروج.

تقسيم العمل لا يتغيّر أبدًا. يقرر RouterOS ماذا يذهب إلى النفق، وتنقل الحاوية عبر النفق كل ما يُسلَّم إليها، ويقرر حسابك أين يخرج. لذا فإن كل هذا إعداد RouterOS عادي — علامات mangle، وجدول توجيه، وقاعدة جدار حماية — ولا شيء منه يمسّ الحاوية.

اقرأ هذا أولًا

ثلاث حقائق تحدد ما إذا كان أي من هذا سيعمل. تجاوزها ليلة لن تستعيدها.

الصق هذه على الصندوق الذي يوجّه شبكتك المحلية. سلسلة prerouting في RouterOS ترى فقط حركة المرور التي يوجّهها الصندوق نفسه. على نقطة وصول تقع خلف بوابتك الحقيقية، كل قاعدة أدناه خاملة — قِيست على جهاز cAP ax كان مساره الافتراضي هو الموجّه الذي فوقه: نقلت الحاوية النفق بشكل مثالي ولم تقترب حركة مرور أي عميل على الشبكة المحلية منه أبدًا. يمكن للحاوية أن تعمل على نقطة الوصول تلك؛ لكن القواعد تذهب على البوابة.

يقبل خادم الخروج عنوان مصدر واحد لكل جهاز — عنوان الإيجار (lease) الذي أصدره فوق الشبكة المتراكبة (overlay). أي حزمة تصل بعنوان مصدر داخلي آخر تُسقَط، لا تُوجَّه، مهما كانت قواعدك صحيحة. شيء ما يجب أن يعيد كتابة شبكتك المحلية على ذلك الإيجار، ويعتمد أي شيء على الحاوية:

الحاويةما عليك فعله حيال ذلك
suquant/fvpn — التطبيق المُدار عبر الحسابلا شيء. بدءًا من الإصدار 0.3.9، تُخفي الحاوية (masquerade) كل ما تحوّله إليها على عنوان إيجارها الخاص، وتتبع ذلك الإيجار عند تغيّره. أمر التثبيت يفعّل هذا.
suquant/fvpnq — النفق الخام، من ملف .conf كتبته أنتأضف src-nat إلى Address في ملف .conf الخاص بك، وهو أيضًا ما تضعه في AllowedIPs الخاصة بخادم الخروج. أنت اخترته، لذا فهو ثابت وتستطيع قاعدة أن تسمّيه به.

هل تُشغّل حاوية أقدم من 0.3.9؟ أعد تشغيل أمر التثبيت — فالقواعد أدناه ستُعلّم وتوجّه بشكل مثالي وسيُسقط خادم الخروج كل حزمة، وهو ما يبدو وكأن الشبكة المحلية فقدت الإنترنت تمامًا فور إضافة قاعدة التوجيه.

Fasttrack يتخطى mangle. يُسرِّع جدار الحماية المصنعي في MikroTik (fasttrack) الاتصالات القائمة بالفعل، ولا يصل اتصال مُسرَّع إلى سلسلة mangle مرة أخرى أبدًا — لذا تنطبق علاماتك على الحزمة الأولى من التدفق ولا شيء بعدها. تحمل كل وصفة أدناه القاعدة الواحدة التي تُبقي الاتصالات المُعلَّمة خارج fasttrack، ويجب أن تقع فوق قاعدة fasttrack-connection.

ونصف IPv6، وهو ما لا تستطيع هذه القواعد فعله من أجلك

كل شيء هنا هو IPv4. إذا كان لدى موجّهك دعم IPv6 فعّال، فإن كل وجهة تختارها أدناه يمكن الوصول إليها أيضًا عبر الإصدار السادس (v6)، حول النفق، من دون أي تحذير. أما إذا كان الموجّه يعلن نفسه موجّه IPv6 من دون أن يملك مسارًا افتراضيًا للإصدار السادس، فإن عملاء الشبكة المحلية يرسلون حركة v6 إليه ولا يحصلون على شيء في المقابل — ولا حتى خطأ، لأن RouterOS 7 لا يملك مسارًا "غير قابل للوصول" للإصدار السادس، بل blackhole صامت فقط. الأجهزة التي لا تملك Happy Eyeballs — أجهزة التلفاز، والساعات، وأي شيء يجري اتصالًا مباشرًا على سجل AAAA — تتجمّد عندئذٍ لمهلة اتصال كاملة على كل وجهة v6، وهو ما يبدو وكأن "الإنترنت معطّل أحيانًا" ويُلقي باللوم على Wi-Fi. هذا السطر الواحد يُبلّغ في أي من الحالتين أنت:

# Does this router tell LAN clients it is their IPv6 router?
/ipv6/nd/print where ra-lifetime!=none
 
# Does it have somewhere to send their v6 traffic?
/ipv6/route/print where dst-address="::/0" and routing-table="main"

إجابة على السؤال الأول ولا إجابة على الثاني هو الحالة الثانية. أعطِ IPv6 مسارًا افتراضيًا حقيقيًا، أو توقف عن الإعلان عن واحد بواسطة /ipv6/nd/set [find] ra-lifetime=none.

الخطوة 1 — البنية التمهيدية

الأمر نفسه للوصفات الثلاث. استبدل عنوان الحاوية الخاص بك بدلًا من 172.31.254.2 (الافتراضي من التثبيت؛ يُظهره /interface/veth/print) وبادئة شبكتك المحلية بدلًا من 192.168.88.0/24.

تحقق من /container/print detail أولًا. يجب أن يقول remote-image الإصدار 0.3.9 أو أحدث، ويجب أن يحتوي cmd على --nat-lan. كلاهما يأتيان من أمر التثبيت الحالي؛ الحاوية المثبَّتة قبل ذلك لا تملك أيًا منهما، والعرَض هو أن الشبكة المحلية تفقد الإنترنت تمامًا فور إضافة قاعدة التوجيه في الخطوة 2.

# A routing table of its own, so nothing here can disturb your normal
# default route.
/routing/table add name=via-fvpn fib
 
# Where marked traffic goes: the container, on the address RouterOS itself
# gave it.
/ip/route add dst-address=0.0.0.0/0 gateway=172.31.254.2 \
    routing-table=via-fvpn comment="fvpn: traffic leaves via the container"
 
# Collapse the LAN to one source address on the way IN to the container. The
# exit never sees this one either -- the container masquerades again onto its
# own lease -- so this is about keeping your LAN's layout out of the
# container's connection table, not about being admitted.
/ip/firewall/nat add chain=srcnat out-interface=veth-fvpn action=masquerade \
    comment="fvpn: hide LAN addressing from the container"
 
# The tunnel costs 80 bytes of MTU. Without this, large TCP flows stall
# rather than fail, which presents as "the internet is broken on Tuesdays".
/ip/firewall/mangle add chain=forward action=change-mss new-mss=clamp-to-pmtu \
    protocol=tcp tcp-flags=syn connection-mark=via-fvpn \
    comment="fvpn: clamp MSS on tunnelled TCP"
 
# Fasttrack bypasses mangle, so marked connections have to be accepted
# before they reach it. This rule is inert if it ends up below the fasttrack
# rule -- check with /ip/firewall/filter/print that it did not.
/ip/firewall/filter add chain=forward action=accept connection-mark=via-fvpn \
    place-before=[find action=fasttrack-connection] \
    comment="fvpn: marked flows skip fasttrack"

ثم اختر واحدة من الوصفتين التاليتين. كلتاهما تنتجان علامة الاتصال via-fvpn نفسها، لذا فإنهما ستتنازعان على حركة المرور نفسها إذا لصقت كليهما.

الخطوة 2أ — اختياري: المكالمات وتطبيقات المراسلة فقط

الإعداد الذي يعمل على جهاز RB3011 الخاص بنا منذ أشهر. يقسّم المشكلة بالطريقة التي تنقسم بها حركة المرور فعليًا: الإشارة (signalling) هي مجموعة من أسماء مضيفي البائعين، والوسائط (media) هي نطاق منافذ على مُرحّلات لا ينشرها أحد.

# Signalling, by hostname. A hostname in a RouterOS address list is not a
# static entry -- the router resolves it and keeps the answers fresh, which
# is the only form that survives a CDN moving under you.
/ip/firewall/address-list
add list=fvpn-via address=g.whatsapp.net      comment="fvpn: signalling"
add list=fvpn-via address=media.whatsapp.net  comment="fvpn: signalling"
add list=fvpn-via address=mmg.whatsapp.net    comment="fvpn: signalling"
add list=fvpn-via address=static.whatsapp.net comment="fvpn: signalling"
add list=fvpn-via address=web.whatsapp.com    comment="fvpn: signalling"
add list=fvpn-via address=api.telegram.org    comment="fvpn: signalling"
add list=fvpn-via address=core.telegram.org   comment="fvpn: signalling"
add list=fvpn-via address=web.telegram.org    comment="fvpn: signalling"
add list=fvpn-via address=chat.signal.org     comment="fvpn: signalling"
add list=fvpn-via address=storage.signal.org  comment="fvpn: signalling"
 
/ip/firewall/mangle
add chain=prerouting action=mark-connection new-connection-mark=via-fvpn \
    dst-address-list=fvpn-via \
    comment="fvpn: signalling by resolved vendor hostname"
 
# Media, by port -- the half an address list can never cover, because a call
# lands on whichever TURN relay the vendor picked that minute.
add chain=prerouting action=mark-connection new-connection-mark=via-fvpn \
    protocol=udp dst-port=3478-3481 \
    comment="fvpn: STUN/TURN media - calls in every major app"
add chain=prerouting action=mark-connection new-connection-mark=via-fvpn \
    protocol=tcp dst-port=3478-3481,5349,5350 \
    comment="fvpn: STUN/TURN over TCP and TLS"
add chain=prerouting action=mark-connection new-connection-mark=via-fvpn \
    protocol=udp dst-port=5060,5061 comment="fvpn: SIP"
add chain=prerouting action=mark-connection new-connection-mark=via-fvpn \
    protocol=tcp dst-port=5060,5061 comment="fvpn: SIP over TCP/TLS"
add chain=prerouting action=mark-connection new-connection-mark=via-fvpn \
    protocol=tcp dst-port=5222,5223 comment="fvpn: XMPP signalling"
 
# One routing decision for the whole connection. Marking the connection
# first and the route second -- rather than marking the route directly -- is
# what keeps a call that started on the tunnel on the tunnel.
add chain=prerouting action=mark-routing new-routing-mark=via-fvpn \
    passthrough=no src-address=192.168.88.0/24 connection-mark=via-fvpn \
    comment="fvpn: route marked connections via the exit"

أسماء المضيفين نقطة بداية، لا مرجعية ثابتة. يضيف البائعون أسماء ويزيلونها من دون إخبار أحد. تحقق من /ip/firewall/mangle/print stats بحثًا عن عدّادات تبقى عند صفر — فذلك يعني قاعدة لا تُطابق شيئًا، لا قاعدة تؤدي عملها بهدوء.

الخطوة 2ب — اختياري: كل شيء

/ip/firewall/mangle
# The container's own packets must never be marked, or its tunnel gets
# routed into itself. The install puts the container's interface in the LAN
# list, so the rule below WOULD match it. Substitute the container's
# address.
add chain=prerouting action=accept src-address=172.31.254.2 \
    comment="fvpn: never mark the container's own traffic"
 
# Everything from the LAN that is not addressed to this router.
# `dst-address-type=!local` is what keeps DNS, WebFig and the status page
# off the tunnel; `in-interface-list=LAN` rather than a source prefix keeps
# the rule correct when the LAN is renumbered.
add chain=prerouting action=mark-connection new-connection-mark=via-fvpn \
    in-interface-list=LAN dst-address-type=!local \
    comment="fvpn: everything from the LAN"
# `dst-address-type=!local` on this rule too, and it is not decoration. The
# install puts the container's veth in the LAN list, so replies coming back
# OUT of the container also match `in-interface-list=LAN`, and they still
# carry the connection mark. Mangle prerouting runs before dstnat, so at
# this moment their destination is still the router's own srcnat address --
# local. Without the test they would take the routing mark and be sent back
# into the container instead of on to the client that asked.
add chain=prerouting action=mark-routing new-routing-mark=via-fvpn \
    passthrough=no in-interface-list=LAN dst-address-type=!local \
    connection-mark=via-fvpn \
    comment="fvpn: route marked connections via the exit"

عُدّ ما لصقته قبل أن تختبره. يجب أن يُظهر /ip/firewall/mangle/print هذه القواعد الثلاث كلها. لصق طرفي يُسقط سطر متابعة واحدًا يتركك بقواعد التعليم من دون قاعدة التوجيه، وهو ما يبدو تمامًا وكأن "النفق مُتجاهَل" — تحمل الاتصالات connection-mark=via-fvpn، ولا شيء يستشير الجدول أبدًا، وتغادر كل حزمة عبر اتصالك المعتاد.

أرسل كل شيء وسترسل DNS أيضًا — وهذا هو المقصود، لكنه يعني أن مُحلِّل خادم الخروج يجيب عن أسماء شبكتك المحلية. تحقق من أن كل ما يعتمد على أسماء محلية (طابعة، أو NAS، أو router.lan) ما زال يُحلّ قبل أن تقرر أن هذا هو النمط الذي تريده.

الخطوة 3 — اختياري: إعداد يقطع حركة المرور عند انقطاع الاتصال

للتوجيه الانتقائي عيب يستحق الإغلاق: عندما يتوقف النفق، يمكن لحركة المرور المُعلَّمة أن تعود بهدوء إلى المغادرة عبر اتصالك المعتاد. هذه القواعد الثلاث تجعلها تتوقف بدلًا من ذلك. أضفها بعد أيًّا كانت الوصفة التي اخترتها.

شُغِّل كل أمر في هذا القسم على RouterOS 7.24.1 قبل تدوينه هنا. تختلف الصياغة عن RouterOS 6 في مكان واحد، مُشار إليه أدناه.

# 1. The route to the container counts only while the container answers.
/ip/route/set [find routing-table=via-fvpn dst-address=0.0.0.0/0] \
    check-gateway=ping
 
# 2. When it stops counting, drop rather than fall back. The higher distance
#    keeps this route inactive for as long as the real one is up. `blackhole`
#    is a bare flag here, not `type=blackhole` -- RouterOS 7 has no `type`
#    property on a route at all, and rejects it with "bad parameter type".
/ip/route/add dst-address=0.0.0.0/0 blackhole distance=10 \
    routing-table=via-fvpn comment="fvpn: kill switch - no exit, no traffic"
 
# 3. The leak the first two cannot see: a container that is alive and
#    answering ping while its own tunnel is down forwards to its default
#    gateway, which is you. Traffic wearing the address the srcnat above gave
#    it must never reach the internet directly. Substitute your router's own
#    address on the container's /30 if you changed it.
/ip/firewall/filter/add chain=forward action=drop src-address=172.31.254.1 \
    out-interface-list=WAN \
    place-before=[find comment="fvpn: marked flows skip fasttrack"] \
    comment="fvpn: kill switch - overlay source must not leave over WAN"

يجب أن تقع القاعدة 3 فوق قاعدة استثناء fasttrack من الخطوة 1، وإلا فإن تلك القاعدة تقبل حركة المرور أولًا ولا يُصل الإسقاط أبدًا. place-before يفعل ذلك هنا؛ تأكد بواسطة /ip/firewall/filter/print.

النسخة الأكثر صرامة: أجهزة لا يجوز لها استخدام أي اتصال سوى النفق

إذا كان ما تريده فعليًا هو "هذا الحاسوب المحمول لا يملك إنترنت إلا عبر النفق"، فقُله مباشرة بدلًا من استنتاجه من حالة التوجيه:

/ip/firewall/address-list/add list=fvpn-only address=192.168.88.50 \
    comment="fvpn: the work laptop"
/ip/firewall/filter/add chain=forward action=drop src-address-list=fvpn-only \
    out-interface-list=WAN \
    place-before=[find comment="fvpn: marked flows skip fasttrack"] \
    comment="fvpn: kill switch - these devices are tunnel-only"

يصل ذلك الجهاز الآن إلى الإنترنت عبر الحاوية أو لا يصل إطلاقًا، مهما قالت جداول التوجيه في أي صباح.

التحقق من أن الأمر نجح

# A rule sitting at zero packets is a rule matching nothing.
/ip/firewall/mangle/print stats
/ip/route/print where routing-table=via-fvpn
# The fasttrack-exemption rule has to be above the fasttrack rule.
/ip/firewall/filter/print

من جهاز على الشبكة المحلية، افتح أي صفحة "what is my IP". يجب أن تُظهر بلد خادم الخروج بالنسبة لحركة المرور التي اخترتها وبلدك الفعلي بالنسبة لكل ما عداها. إذا أظهرت بلدك الفعلي لكل شيء، فالسبب المعتاد هو الحقيقة الأولى في هذه الصفحة: القواعد على صندوق لا يوجّه الشبكة المحلية.

التراجع عنه

يحمل كل سطر أعلاه تعليقًا يبدأ بـfvpn:، لذا فإن إزالتها دقيقة — ولن تمسّ كائنات الحاوية نفسها، التي يُعلّق عليها المثبِّت بـforestvpn.

/ip/firewall/mangle/remove [find comment~"^fvpn:"]
/ip/firewall/filter/remove [find comment~"^fvpn:"]
/ip/firewall/nat/remove [find comment~"^fvpn:"]
/ip/firewall/address-list/remove [find comment~"^fvpn:"]
/ip/route/remove [find comment~"^fvpn:"]
/ip/address/remove [find comment~"^fvpn:"]
/routing/table/remove [find name="via-fvpn"]

تستمر الحاوية في العمل، وتحتفظ بربط حسابها، وتعود إلى نقل حركة مرورها الخاصة فقط. إذا كان هناك خطأ آخر، راجع استكشاف الأخطاء وإصلاحها.

العودة إلى المساعدة

العربية
اسألنا أي شيء