فهرست‌های پورت برای سرویس‌های VPN بین صفحه‌های مقایسه کپی می‌شوند بدون جزئیاتی که تعیین می‌کند آیا مهم‌اند یا نه: چه کسی اتصال را آغاز می‌کند. قاعده‌ای که TCP 443 خروجی را مجاز می‌کند هیچ نمی‌گوید که آیا میزبان دیگری می‌تواند به شنونده‌ای روی دستگاه شما برسد. پیش از مقایسهٔ حتی یک طرح، سه نیاز جداگانه بنویسید و مشخص کنید وظیفهٔ شما واقعاً به کدام‌ها نیاز دارد. بیشتر مقایسه‌ها وقتی آن برگه وجود داشته باشد به یک پرسش کوتاه فرو می‌کاهند.

نیاز را پیش از خواندن هر فهرست پورت جدا کنید

سه خط تقریباً همهٔ موارد را پوشش می‌دهد: رسیدن به مقصدی بیرون از تونل، منتشر کردن چیزی تا دیگران بتوانند به درون متصل شوند، و حمل خود تونل. هر خط به دلیلی متفاوت شکست می‌خورد، و سیاست ارائه‌دهنده‌ای که یکی را برآورده می‌کند می‌تواند دو خط دیگر را دست‌نخورده بگذارد. دسته‌بندی وظیفهٔ شما در خط درست پنج دقیقه وقت می‌گیرد و بعداً از یک بحث جلوگیری می‌کند.

LineWho starts itWhat can block itQuestion for the provider
Outbound destinationYour applicationEgress filter on the exit nodeIs this protocol and port allowed to that destination?
Inbound publishingA remote peerNo mapping, no public address, short lifetimeWhich protocol, which external port, and how long does the mapping last?
Tunnel transportYour client to the gatewayThe access network drops that protocolDoes the client offer a fallback the local network permits?

ادعاهای بازاریابی سه خط را عمداً مبهم می‌کنند. اجازهٔ P2P یک سیاست مقصد را توصیف می‌کند، نشانی اختصاصی یک نشانی را توصیف می‌کند، و ادعای نبود محدودیت پورت معمولاً یعنی طرح آن‌ها را فهرست نمی‌کند. هیچ‌یک از این عبارت‌ها به بقیه پاسخ نمی‌دهد.

یک جریان مشخص انتخاب کنید و آن را به شکل جمله بنویسید: آغازگر، انتقال، پورت، خانوادهٔ نشانی، جهت. یک کلاینت پشتیبان‌گیری شبانه که به میزبانی دوردست بارگذاری می‌کند فقط خروجی است. یک سرور بازی روی میز شما که دوستان به آن می‌پیوندند ورودی است. اجرای هر دو از یک تونل یعنی برگه به هر دو خط نیاز دارد، نه سازشی میان آن‌ها.

دسترسی خروجی در سیاست مقصد شکست می‌خورد، نه در تونل

ترافیک خروجی از دروازه‌ای که ترجمه می‌کند وضعیت می‌سازد. نخستین بسته از یک نشانی و پورت داخلی یک ورودی ترجمه می‌سازد و پاسخ‌ها با آن تطبیق می‌یابند، که همان رفتار نگاشت توصیف‌شده در RFC 3022 است. همین سازوکار دلیل آن است که یک زبانهٔ مرورگر معمولاً بدون هیچ درخواست پورتی کار می‌کند.

دو چیز هنوز آن را می‌شکند. گرهٔ خروجی ممکن است مقصدها یا شماره‌های پورتی را که سوءاستفاده‌پذیر می‌داند پالایش کند، و برنامه ممکن است روی پورتی گوش دهد که سیاست خروج هرگز انتظارش را نداشت. دربارهٔ جفت مقصد بپرسید نه قواعد ورودی، و برای TCP و UDP پاسخ‌های متفاوت انتظار داشته باشید.

پیش از بحث اندازه بگیرید. این‌ها را روی دستگاهی اجرا کنید که پشت تونل خواهد بود، یک بار با تونل خاموش و یک بار با آن روشن:

ss -lntup | sort
nc -vz -w 3 203.0.113.10 443
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 5 https://example.com

همان فرمان‌ها، همان مقصد، دو وضعیت تونل، به گرداننده مقایسهٔ پیش و پس از آن را می‌دهد که بتواند بر اساسش اقدام کند. نشانی مستندات را با میزبانی که واقعاً لازم دارید جایگزین کنید؛ مهم تکرار مقایسه است، نه این‌که عددی چشمگیر به نظر برسد.

انتشار ورودی به نگاشت، نشانی و طول عمر نیاز دارد

چیزی از بیرون نمی‌تواند اتصالی به شنوندهٔ شما آغاز کند مگر آن‌که چیزی در سمت عمومی بداند آن را کجا تحویل دهد. یک رزرو پورت ایستا که گرداننده نگه می‌دارد، نگاشتی که کلاینت از طریق UPnP، NAT-PMP یا PCP درخواست می‌کند، و یک نشانی عمومی مسیریابی‌شده سه محصول متفاوت با سه محدودیت متفاوت‌اند.

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

نخست نیمهٔ محلی را تأیید کنید، چون شنوندهٔ مرده و مسیر ورودی مسدود از بیرون یکسان به نظر می‌رسند:

ss -lntup | grep -E ':(8080|51820)\b'
python3 -m http.server 8080 --bind 0.0.0.0
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080

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

انتقال خود تونل پرسشی جداست

پورت‌های حامل کوچک‌ترین بخش مسئله و آسان‌ترین برای جست‌وجو هستند. پیش‌فرض‌ها بر اساس پروتکل تفاوت می‌کنند، و آنچه کلاینت می‌تواند مذاکره کند بیش از هر توصیف طرحی اهمیت دارد.

ClientOuter transportDefault portWhen it helps
OpenVPNUDP1194Default mode; needs outbound UDP to pass
OpenVPNTCP443UDP is dropped and TCP 443 is not
WireGuardUDP51820Short handshake; there is no TCP mode
IKEv2/IPsecUDP500 and 4500Mobile clients; 4500 carries NAT traversal

شبکه‌ای که UDP خروجی را دور می‌ریزد تونل TCP 443 را می‌پذیرد و UDP را رد می‌کند، پس یک حالت جایگزین به برگهٔ نیازها تعلق دارد. تغییر حامل پورت برنامه را درون تونل جابه‌جا نمی‌کند و سیاست مقصد را گسترده نمی‌سازد؛ آن‌ها در خطوط خودشان می‌مانند.

تکه‌تکه‌سازی یک آزمون می‌ارزد وقتی آنجا هستید، چون تونلی که وصل می‌شود و سپس در انتقال‌های بزرگ متوقف می‌شود معمولاً MTU نادرست دارد نه پورت بسته:

ping -M do -s 1400 203.0.113.10
ping -M do -s 1372 203.0.113.10

در ویندوز همان آزمون ping -f -l 1400 203.0.113.10 است. MTU تونل را زیر بزرگ‌ترین اندازه‌ای که عبور می‌کند تنظیم کنید، سپس انتقالی را که شکست خورد دوباره بیازمایید.

سه خط را پیش از پرداخت برای یک طرح بررسی کنید

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

ss -lntup | sort
nc -vz -w 3 203.0.113.10 443
python3 -m http.server 8080 --bind 0.0.0.0
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080
ping -M do -s 1400 203.0.113.10

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

دو عادت برگه را صادق نگه می‌دارد. تاریخ و نسخهٔ کلاینت را کنار هر نتیجه ثبت کنید، چون هم سیاست‌های ارائه‌دهنده و هم پیش‌فرض‌های کلاینت جابه‌جا می‌شوند. سپس تنگ‌ترین نگاشتی را بخواهید که به جریان خدمت می‌کند، چون درخواست باز کردن همه‌چیز معمولاً به جای پاسخ فنی یک رد یا پیشنهاد ارتقا به دست می‌آورد.

مقالات مرتبط