OpenSSH 7.8 Broken Pipe with VMware

Teerayut Hiruntaraporn
1 min readJul 15, 2020

--

วันนี้ได้พบปัญหาบางอย่างจากการลง FreeBSD12 บน VMware Fusion นั่นคือ เราไม่สามารถที่จะสั่ง copy ไฟล์ข้ามเครื่องผ่านคำสั่ง scp ได้ โดยมี error ประมาณนี้

$ scp -r user@192.168.0.1:~/rails6 rails6
Password for user@server:
Fssh_packet_write_wait: Connection to 192.168.0.1 port 22: Broken pipe
$

ซึ่งเป็นพฤติกรรมที่ค่อนข้างแปลกมาก เดี๋ยวเราจะค่อยๆ แกะปัญหาและวิธีการแก้ไขกันครับ

พฤติกรรมลักษณะนี้ พบว่าจะไม่เกิดถ้าใช้จากเครื่องปกติ แต่จะเป็นกับเครื่อง VMWare หรือ Router เก่าๆ บางตัว เลยไปทำการค้นเพิ่มเติมพบว่า

  1. OpenSSH version 7.8 มีการเปลี่ยนแปลงค่ามาตรฐานที่เกี่ยวข้องกับ QoS จากเดิมที่ใช้ LowDelay สำหรับ interactive mode และ Throughput สำหรับ Bulk mode เป็น AF21 สำหรับ interactive mode และ CS1 สำหรับ Bulk Mode
  2. ปัญหาคือ Vmware NAT มันเหมือนจะไม่รู้จัก QOS แบบ DSCP ทำให้ส่งสัญญาณ Reset กลับไป ทำให้ปิดการเชื่อมต่อ

การจัดความสำคัญของ Network Traffic

โดยปกติแล้ว การส่งข้อมูลในระบบเครือข่าย จะมีลักษณะที่เรียกว่า Best Effort ว่ากันง่ายๆ คือใครยัดเร็วกว่าก็ไปเร็วกว่า ปัญหาคือ ถ้าเรามี Traffic ที่สำคัญ แต่แย่งส่งไม่ทัน ก็จะเกิดปัญหาได้ เช่น ในห้องที่มีคนดู Youtube เยอะๆ แต่อยู่ๆ เราต้องไปทำเหตุการณ์สำคัญ เช่น ผ่าตัดระยะไกล(อันนี้อาจจะสุดโต่งไป) การที่ traffic ที่ส่งสัญญาณไปคุมอุปกรณ์มาๆ ขาดๆ อาจจะส่งผลกระทบที่หนักได้

เราจึงจำเป็นต้องกำหนดความสำคัญของข้อมูลที่ส่งไปบน internet เช่น ข้อมูลที่เป็น interaction ข้อมูลประเภท voice ก็อาจจะมีความสำคัญสูงกว่า การ download หรือการดูวีดีโอ / ฟังเพลง เป็นต้น

โดยจะมีสิ่งที่สามารถควบคุมคุณภาพของการส่งข้อมูล ที่เรียกว่า Quality of Service เพื่อให้อุปกรณ์สามารถบริหารจัดการการส่งข้อมูลตามความสำคัญได้

ตัวอย่างเช่น AF21 เป็นค่าที่ถูกตั้งเพื่อจะบอกว่า Traffic นี้มี Priority สูงสำหรับ Interactive Application (แต่ยังไม่ใช่ค่าที่สูงที่สุด)

ขณะที่ CS1 จะบอกว่า Traffic นี้มี priority ต่ำ เพราะงานการ transfer file มีการส่งข้อมูลเป็นงานที่ใช้ Bandwidth สูง เดี๋ยวงานอื่นจะใช้กันไม่ได้

การแก้ไข

ดังนั้นในช่วงของการเปลี่ยนผ่านนี้ใครจำเป็นต้องใช้งานก็มีทางเลือกอยู่ 2 อย่างครับ

  1. ตั้งค่า QoS กลับไปที่ LowDelay กับ Throughput เหมือนเดิม โดยสามารถตั้งได้ดังนี้

ไปที่ไฟล์ ~/.ssh/config แล้วเพิ่ม config ดังนี้

Host *
IPQoS lowdelay throughput

หรือถ้าไม่ตั้ง config สามารถทำได้โดยการใส่ option ผ่านคำสั่ง scp หรือ ssh ได้เลย

$ scp -o 'IPQoS=throughput' user@server:~/test.dat .
Password for user@server:
test.dat 100% 348 9.7KB/s 00:00
$

2. downgrade ไปยัง openssh version 7.7

สุดท้าย เข้าใจว่าเดี๋ยวทาง VMware คงจะมี update ใน version ล่าสุดในที่สุด ทั้งใน VMware Workstation หรือ VMware Fusion แต่ถ้าใครไม่มีทุน update เป็น version ล่าสุด ก็ลองใช้วิธีที่บอกไว้ก่อนได้ครับ

References

  1. https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/readconf.c#rev1.284
  2. https://lwn.net/Articles/763444/
  3. https://bugzilla.redhat.com/show_bug.cgi?id=1624437
  4. https://communities.vmware.com/thread/590825

--

--

Teerayut Hiruntaraporn
Teerayut Hiruntaraporn

No responses yet