หนึ่งคำสั่ง OpenVPN ต่อบรรทัด และทำไมการตัดบรรทัดจึงโกหก
หน้าจอที่ตัดบรรทัดแบบอ่อนไม่ใช่บรรทัดใหม่ในไฟล์ ตรวจสอบการขึ้นบรรทัดจริงก่อนแทนที่ส่วนที่เสียหายด้วยเทมเพลตของคนแปลกหน้า
โปรไฟล์ที่เคยเริ่มทำงานได้ตอนนี้ล้มเหลวด้วยข้อผิดพลาดตัวเลือก และบรรทัดที่ตัวแยกวิเคราะห์อ้างถึงดูสมเหตุสมผลที่สุดบนหน้าจอ นั่นคือกับดัก: ไฟล์กำหนดค่าเป็นรายการของบรรทัดจริง แต่ละบรรทัดมีคำหลักของตัวเลือกหนึ่งคำและอาร์กิวเมนต์ของมัน และบรรทัดยาวที่ถูกตัดโดยโปรแกรมแก้ไขจะดูเหมือนสองบรรทัดจนกว่าคุณจะดูที่ไบต์ ไม่มีส่วนใดของเครือข่าย ใบรับรอง หรืออุโมงค์ที่เกี่ยวข้องกับความล้มเหลวประเภทนี้ สองบรรทัดที่ดูเหมือนกันบนหน้าจออาจ ต่างกันเพียงหนึ่งไบต์
ทำการตรวจสอบด้านล่างตามลำดับและหยุดที่รายการแรกที่ล้มเหลว แต่ละรายการถูกกว่าอันถัดไป และแต่ละรายการตัดคำอธิบายที่แตกต่างกันออกไป
หนึ่งบรรทัด หนึ่งคำสั่ง
ตัวแยกวิเคราะห์อ่านหนึ่งบรรทัด ใช้คำแรกเป็นตัวเลือก และถือว่าส่วนที่เหลือเป็นอาร์กิวเมนต์ของตัวเลือกนั้น ดังนั้นบรรทัดอย่าง 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
เมื่อขั้นตอนการแยกวิเคราะห์ผ่าน ความล้มเหลวถัดไปจะเกี่ยวกับไฟล์ ใบรับรอง หรือไซเฟอร์ ไม่ใช่คำศัพท์ และนั่นคือความก้าวหน้าจริง เก็บสำเนางานและบันทึกหนึ่งบรรทัดเกี่ยวกับสิ่งที่รวมเข้าด้วยกัน การวางแบบเดียวกันจะเกิดขึ้นอีกกับคนอื่นในทีมเดียวกัน