VPN על UDP שותק בסריקת פורטים? למה זה קורה
WireGuard ו-OpenVPN מוקשח מפילים דטה-גרמות שנכשלות באימות בלי להשיב. שתיקה מסורק היא התנהגות צפויה, לא פורט סגור.
אתם סורקים את פורט ה-VPN, לא מקבלים תשובה ומסיקים שהשירות מושבת או שהחומה סגורה. עם WireGuard, ועם ערוצי הבקרה של OpenVPN שנושאים אימות משלהם, המסקנה הזו לא נובעת. דטה-גרם בלי חומר אימות תקף נזרק בלי תשובה, כך ששתיקה היא איך שירות בריא נראה מבחוץ. הבדיקה שגויה לפני שהמנהרה שגויה.
שתיקה היא הפרוטוקול, לא תקלה
ל-UDP אין הקמת חיבור, ולכן אין SYN ואין אישור שיאפשר לסורק להבחין בין פורט פתוח לפורט מסונן. הבדיקה מגיעה כדטה-גרם מבודד, והשירות בודק אם היא תואמת לפרוטוקול שהוא מצפה לו. כשהיא לא תואמת, החבילה נזרקת, וזריקה היא ההתנהגות המתועדת ולא תקלה.
WireGuard מאמת את הודעות ה-handshake שלו קריפטוגרפית ומתעלם מכל מה שנכשל. OpenVPN עם tls-auth או tls-crypt עושה אותו דבר לערוץ הבקרה שלו. בשני המקרים מטען שרירותי לא מגיע לעולם לשלב שפונה למשתמש, ולכן אין במה להשיב ואין שגיאה להחזיר.
TCP היה נותן לכם reset מפורט סגור. UDP משאיר אתכם בעמימות, שסורקים פותרים בהדפסת פתוח או מסונן במקום לנחש.
מה סורק יכול להסיק ומה לא
תוצאת סריקה מועילה רק כמידת המטען שהיא שלחה. מיינו את התצפיות האפשריות לפי מה שכל אחת מהן באמת תומכת בו:
| Probe | Observed result | What it supports |
|---|---|---|
| Empty datagram | No reply | Nothing beyond the fact that UDP was used |
| Random payload | No reply | Consistent with an authenticated service |
| Valid handshake from a real client | A protocol reply | The service is alive and reachable |
| ICMP port unreachable | Unreachable message | The host answered, usually because nothing listens |
קראו את השורה השלישית כבדיקה החיובית היחידה ברשימה. היא דורשת את הפרופיל האמיתי, המפתח האמיתי ונקודת הקצה הנכונה, וזה בדיוק מה שלסורק גנרי אין.
הסתכלו בשני קצוות הנתיב
בשרת שאתם מנהלים, תפסו בממשק לפני שאתם מסיקים מסקנה כלשהי, ואז שאלו את השירות מה הוא ראה. שתי הפקודות דורשות root בשער:
tcpdump -ni any udp port 51820
tcpdump -ni any udp port 1194
wg show
אם לא מופיעה חבילה בממשק, הנתיב זרק אותה לפני שהשירות ראה משהו, והתחנה הבאה היא ניתוב וסינון. אם חבילות מגיעות אבל אף handshake לא מסתיים, השירות נגיש והפער הוא במפתחות, בתצורת נקודת הקצה או בגרסת הפרוטוקול. ההשוואה הזו עונה על השאלה שהסורק לא יכול היה. הריצו אותה בזמן שלקוח אמיתי מנסה להתחבר, לא בזמן שהסורק חוזר על עצמו.
שנו את הבדיקה, לא את ההגנה
הקיצור המפתה הוא לכבות את הגנת ערוץ הבקרה כדי שאבחון יקבל תשובה. זה מחליף תכונת אבטחה אמיתית בתוצאת סריקה יפה יותר, וזו הכיוון השגוי. השתמשו במקום בפרופיל תקף מרשת מאושרת, ורשמו את נקודת הקצה והשעה כדי שההשוואה תהיה ניתנת לחזרה.
הבדיקה השימושית ביותר היא דיפרנציאלית: אותו פרופיל בנתיב שעובד ובנתיב שלא. אם הנתיב העובד מפיק handshake והנתיב הכושל לא מפיק דבר בממשק, איתרתם את נקודת השבירה בלי להחליש דבר.
לכן חבילת UDP בלי תשובה לא מוכיחה לא שהשרת לא מקוון ולא שהוא בטוח. היא מוכיחה שהבדיקה הזו, בנתיב הזה, ברגע הזה, לא התקבלה.