דרישות פורטים ל-VPN: שלוש שורות לכתוב לפני ההשוואה
הבינו איזו שאלת פורט באמת יש לכם: יעד יוצא, פרסום נכנס או התעבורה של המנהרה עצמה. אחר כך שאלו את הספק רק על זה.
רשימות פורטים לשירותי VPN מועתקות בין עמודי השוואה בלי הפרט שמכריע אם הן חשובות: מי יוזם את החיבור. כלל שמתיר TCP 443 יוצא אינו אומר דבר על האפשרות שמארח אחר יגיע למאזין במחשב שלכם. כתבו שלוש דרישות נפרדות לפני שתשוו תוכנית אחת, וסמנו אילו מהן המשימה שלכם באמת דורשת. רוב ההשוואות מתכווצות לשאלה קצרה אחת ברגע שקיים הדף הזה.
הפרידו את הדרישה לפני קריאת כל רשימת פורטים
שלוש שורות מכסות כמעט כל מקרה: הגעה ליעד מעבר למנהרה, פרסום משהו כדי שאחרים יוכלו להתחבר פנימה, ונשיאה של המנהרה עצמה. כל שורה נכשלת מסיבה אחרת, ומדיניות ספק שממלאת אחת יכולה להשאיר את השתיים האחרות ללא שינוי. מיון המשימה לשורה הנכונה אורך חמש דקות וחוסך ויכוח לאחר מכן.
| Line | Who starts it | What can block it | Question for the provider |
|---|---|---|---|
| Outbound destination | Your application | Egress filter on the exit node | Is this protocol and port allowed to that destination? |
| Inbound publishing | A remote peer | No mapping, no public address, short lifetime | Which protocol, which external port, and how long does the mapping last? |
| Tunnel transport | Your client to the gateway | The access network drops that protocol | Does 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 ובקשה מרשת שאינכם שולטים בה עדיין נגמרת בזמן קצוב, הפער נמצא בצד הציבורי. זה הרגע לומר למפעיל פרוטוקול ופורט חיצוני במקום לתאר את היישום בשמו.
התעבורה של המנהרה עצמה היא שאלה נפרדת
פורטי הנשא הם החלק הקטן ביותר בבעיה והקלים ביותר לבדיקה. ברירות המחדל משתנות לפי פרוטוקול, ומה שהלקוח יכול לנהל משא ומתן נחשב יותר מכל תיאור תוכנית.
| Client | Outer transport | Default port | When it helps |
|---|---|---|---|
| OpenVPN | UDP | 1194 | Default mode; needs outbound UDP to pass |
| OpenVPN | TCP | 443 | UDP is dropped and TCP 443 is not |
| WireGuard | UDP | 51820 | Short handshake; there is no TCP mode |
| IKEv2/IPsec | UDP | 500 and 4500 | Mobile 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
ב-Windows אותה בדיקה היא 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
קראו את הפלט כרשימת בדיקה. יוצא עובד כשהיעד עונה והמנהרה פועלת. נכנס עובד רק כשמארח מחוץ לרשת שלכם מגיע למאזין בפורט החיצוני. הנשא עובד כשלחיצת היד מסתיימת בפרוטוקול שהרשת שלכם מאפשרת.
שני הרגלים משאירים את הדף ישר. רשמו את התאריך ואת גרסת הלקוח ליד כל תוצאה, כי גם מדיניות הספקים וגם ברירות המחדל של הלקוחות זזות. אחר כך בקשו את המיפוי הצר ביותר שמשרת את הזרימה, כי בקשה לפתוח הכול זוכה בדרך כלל לסירוב או למכירה נוספת ולא לתשובה טכנית.