פרופיל שהפעיל בעבר נכשל כעת בשגיאת אפשרויות, והשורה שהמנתח מצטט נראית סבירה לחלוטין על המסך. זו המלכודת: קובץ תצורה הוא רשימה של שורות פיזיות, כל אחת מחזיקה מילת מפתח אחת של אפשרות והארגומנטים שלה, ושורה ארוכה שנשברת על ידי עורך נראית זהה לשתי שורות עד שמסתכלים על הבתים. שום דבר ברשת, בתעודה או במנהרה אינו מעורב במחלקת תקלות זו. שתי שורות שנראות זהות על המסך יכולות להיות שונות בבייט אחד.

בצעו את הבדיקות שלהלן לפי הסדר ועצרו בראשונה שנכשלת. כל אחת זולה מהבאה אחריה, וכל אחת שוללת הסבר אחר.

שורה אחת, הוראה אחת

המנתח קורא שורה, לוקח את המילה הראשונה כאפשרות ומתייחס לשאר כארגומנטים של אותה אפשרות. לכן שורה כמו cert server.crt port 1194 אינה שתי הוראות ברצף. זו אפשרות cert אחת עם שלושה ארגומנטים, והשלישי אינו שם קובץ שהאפשרות מקבלת. לקרוא את השגיאה כמעבר שורה חסר זה נכון; לקרוא אותה כהוראה חסרה זה לא.

# malformed: one option, three arguments
cert server.crt port 1194

# intended: two options, one argument each
cert server.crt
port 1194

שתי השורות המתוקנות האלה הן קטע, לא תצורה. הן קיימות כדי להראות היכן הגבול נמצא. כל הוראה רגילה בפרופיל פועלת לפי אותו כלל, ושורה שמאחדת שתיים מהן מייצרת או שגיאת ארגומנט או ערך שהאפשרות לא ציפתה לו.

הוכיחו שמעבר השורה אמיתי

עורכים גולשים לצורך תצוגה. חלקם גם מכניסים שבירות קשות כשמדביקים, וחלקם לא, כך שאותה תוצאה חזותית יכולה לבוא משני קבצים שונים מאוד. הציגו את סופי השורות וספרו את השורות לפני שאתם משנים משהו. מדידה עולה פקודה אחת; ניחוש עולה ערב.

cat -A /etc/openvpn/server/lab.conf | sed -n '10,20p'
awk 'NR>=10 && NR<=20 {printf "%d:%s\n", NR, $0}' /etc/openvpn/server/lab.conf

בפלט הראשון כל מעבר שורה אמיתי מופיע כסמן $, ולכן שורה שגולשה אך לא נשברה אינה מציגה סמן במקום שבו המסך שלכם גולש. הפקודה השנייה מדפיסה שורות ממוספרות, וזו הדרך המהירה ביותר להשוות בין מה שהמנתח מדווח לבין מה שהקובץ מכיל.

גם רווחים נוספים אינם יוצרים הוראה. ההזחה היא קוסמטית, ושורה שמתחילה ברווח היא עדיין אותה אפשרות יחידה. אם הודעת השגיאה מצביעה על מספר שורה, קראו בדיוק את השורה ההיא ולא את הפסקה שאליה היא שייכת.

צטטו נתיב, לא רשימת הוראות

מרכאות קיימות עבור ארגומנטים שמכילים רווחים, לא כדי לקבץ אפשרויות. נתיב תעודה עם רווח זקוק למרכאות משלו; שתי הוראות שחולקות זוג מרכאות הן עדיין שורה פגומה אחת.

cert "/etc/openvpn/pki/lab certs/server.crt"
key "/etc/openvpn/pki/lab certs/server.key"

בדקו את שמות האפשרויות יחד עם הפריסה, משום ששורה מאוחדת יכולה לייצר אסימון שנראה אמין ומעולם לא היה קיים. הוראת הפורט היא port; פרופיל שמשתמש במשהו אחר לאותה רעיון ייכשל גם לאחר תיקון גבולות השורה. כששם נראה לא מוכר, השוו אותו לרשימת האפשרויות של הגרסה שאתם מריצים ולא לדוגמה מפורום.

השאירו בלוקים מוטמעים כבלוקים

פרופילים יכולים לשאת תעודות ומפתחות באופן מוטמע, והבלוקים האלה הם נתונים ולא תצורה. שורות ה-PEM שבתוך בלוק אינן אפשרויות שיש לשטח, להזיח מחדש או לאחד, וסמני הבלוק חייבים להישאר בשורות משל עצמם.

התייחסו לבלוק מוטמע כאזור אטום: תקנו את שורות האפשרויות שסביבו, השאירו את תוכנו ללא נגיעה בייט אחר בייט, ולעולם אל תדביקו אותו בשרשור תמיכה ציבורי. אם כלי עיצוב שכתב את הבלוק מחדש, שחזרו אותו מה-PKI שלכם במקום לתקן אותו ביד.

תקנו את הקטע הקטן ביותר, לא את התבנית

התיקון המפתה הוא להחליף את כל הקובץ בתצורה מתוך מדריך „שעובד”. זה מחליף שורה פגומה אחת בסט של שינויי מדיניות שאיש לא בחן: פרמטרי DH אחרים, הגדרות דחיסה, בחירת צופן, מאזינים כפולים. הבעיה המקורית קטנה ומקומית, וההחלפה אינה לא זה ולא זה.

העתיקו את הפרופיל לקובץ עבודה מוגן, תקנו את גבולות השורה בעותק הזה, ותנו לבעלים הרגיל של השירות לטעון אותו. לאחר מכן הפעילו את המופע וקראו את השגיאה הראשונה, אם יש, מההתחלה.

openvpn --config /etc/openvpn/server/lab.conf --verb 3 --log /tmp/parse.log
grep -n 'Options error' /tmp/parse.log

כששלב הניתוח עובר, הכשל הבא יעסוק בקובץ, בתעודה או בצופן ולא באוצר מילים, וזו התקדמות אמיתית. שמרו את עותק העבודה והערה של שורה אחת על מה שאוחד; אותה הדבקה תקרה שוב למישהו אחר באותה קבוצה.

מאמרים קשורים