OpenVPN: วิธีลดปัญหา MTU ของพา ธ ในแต่ละลูกค้าได้อย่างไร


16

เรามีอุปกรณ์ฝังตัวจำนวนมากติดตั้งไว้ที่ลูกค้าทุกคนโทรกลับบ้านเพื่อใช้บริการ OpenVPN ของเรา โดยทั่วไปแล้วใช้งานได้ดี แต่ลูกค้าของเราบางรายมีปัญหาเกี่ยวกับเส้นทางของ MTU ที่รุนแรง อิทธิพลของเราที่มีต่อลูกค้าในการแก้ไขปัญหาเครือข่ายของพวกเขานั้นมี จำกัด ดังนั้นเราจึงต้องการ OpenVPN เพื่อจัดการกับมัน โดยสรุปคำถามของฉันคือ:

ฉันจะลด MTU ที่มีพา ธ ต่ำของลูกค้าบางรายบนฐานต่อไคลเอ็นต์ได้อย่างไรโดยไม่ต้องใช้การตั้งค่าร่วมที่รองรับกรณีที่เลวร้ายที่สุดสำหรับลูกค้าทั้งหมด

โปรดทราบว่ากรณีที่เลวร้ายที่สุดของเรามันค่อนข้างแย่: เส้นทาง MTU 576 ลดลงทุกส่วนไม่แยกส่วนไม่ให้เกียรติ DF-bit คุณเห็นว่าทำไมฉันถึงไม่ต้องการแก้ปัญหานี้ในระดับโลก

OpenVPN manpageมีจำนวนของ MTU --link-mtu, --tun-mtu, --fragment and --mssfixเกี่ยวข้องกับตัวเลือกที่โดดเด่นที่สุด แต่มันก็บอกว่า

--link-mtu [... ] เป็นการดีที่สุดที่จะไม่ตั้งค่าพารามิเตอร์นี้จนกว่าคุณจะรู้ว่าคุณกำลังทำอะไรอยู่

--tun-mtu [... ] วิธีที่ดีที่สุดคือใช้ตัวเลือก --fragment และ / หรือ --mssfix เพื่อจัดการกับปัญหาการปรับขนาด MTU

ดังนั้นผมจึงเริ่มการทดลองด้วย--fragmentและ--mssfixแต่เร็ว ๆ นี้จะต้องตระหนักว่าอย่างน้อยในอดีตจะต้องตั้งค่าไม่เพียง แต่ฝั่งไคลเอ็นต์ แต่ยังฝั่งเซิร์ฟเวอร์ จากนั้นฉันก็ดูการกำหนดค่าฝั่งเซิร์ฟเวอร์ต่อไคลเอนต์ผ่านทาง--client-config-dirแต่มันบอกว่า

ตัวเลือกต่อไปนี้ถูกต้องตามกฎหมายในบริบทเฉพาะลูกค้า: --push, --push-reset, - เส้นทาง, --ifconfig-push และ --config

ไม่มีการพูดถึงตัวเลือก MTU!

ดังนั้นนี่คือคำถามที่เฉพาะเจาะจงของฉัน:

  • ทำไมlink-mtuและtun-mtuท้อแท้แน่นอน? ปัญหาที่อาจเกิดขึ้นกับตัวเลือกเหล่านี้คืออะไร? โปรดทราบว่าฉันค่อนข้างสบายใจที่มีส่วนหัว IP ต่ำในระดับต่ำ
  • ตัวเลือกlink-mtu tun-mtu fragment mssfixใดที่ต้องทำมิเรอร์บนฝั่งเซิร์ฟเวอร์เพื่อให้ทำงานได้?
  • ซึ่งในตัวเลือกที่link-mtu tun-mtu fragment mssfixสามารถใช้ในการclient-config-dir?
  • ในกรณีที่ทั้งสี่ตัวเลือกจะต้องทำมิเรอร์ฝั่งเซิร์ฟเวอร์และไม่สามารถใช้ภายในclient-config-dir: มีทางเลือกอื่นในการต่อสู้กับ MTU ที่มีพา ธ ต่ำต่อลูกค้าหรือไม่?

หมายเหตุ:

  • บางส่วนของคำถามของฉันถูกถามเมื่อ 5 ปีที่แล้วที่นี่แต่พวกเขายังไม่ได้รับคำตอบจริงๆดังนั้นฉันกล้าทำซ้ำ
  • เซิร์ฟเวอร์ OpenVPN ปัจจุบันคือ 2.2.1 บน Ubuntu 12.04 เรากำลังเตรียมการอัพเกรดเป็น 2.3.2 บน Ubuntu 14.04
  • ไคลเอนต์ OpenVPN คือ 2.2.1 บนเดเบียน 7.6
  • ฉันมีความสุขที่จะตรวจสอบเส้นทางของ MTU ของลูกค้าด้วยตนเอง
  • ขณะนี้เราไม่สามารถทดสอบฝั่งเซิร์ฟเวอร์ได้มาก แต่เรากำลังสร้างเตียงทดสอบแยกที่สมบูรณ์ควรจะพร้อมในไม่ช้า

ฉันขอบคุณสำหรับคำแนะนำที่เป็นประโยชน์ใด ๆ


1
576? เรียนท่านที่เคารพ ฉันไม่เห็น MTU นั้นต่ำมากตั้งแต่วันที่โทรออก นั่นจะเป็นการเชื่อมโยงอนุกรมโบราณหรือไม่?
Michael Hampton

คุณสามารถเรียกใช้เซิร์ฟเวอร์ OpenVPN สองแห่งได้หรือไม่ บางทีคุณอาจเรียกใช้เซิร์ฟเวอร์ทั้งสองในที่อยู่ IP สาธารณะเดียวกันและใช้การส่งต่อพอร์ต (หรือนโยบายการกำหนดเส้นทาง) เพื่อนำลูกค้าไปยังเซิร์ฟเวอร์ OpenVPN อื่นขึ้นอยู่กับว่าพวกเขาอยู่บนเครือข่ายที่มีปัญหาหรือไม่ (ตามที่กำหนดโดยรายชื่อลูกค้า ที่อยู่ IP)
kasperd

1
@MichaelHampton ฉันก็สงสัยเหมือนกัน มัน> 600kbit / s และ RTT ~ 30ms ดูไม่เหมือนอนุกรมโบราณสำหรับฉัน เนื่องจากพวกเขามีการตั้งค่าโง่อื่น ๆ (เช่นไม่ตอบสนองต่อ DF ด้วย 'จำเป็นต้องมีการแตกแฟรกเมนต์') ฉันคิดว่านี่เป็นอีกการหนึ่ง เราบอกพวกเขาแล้ว แต่ยังไม่ได้ยินเลย
Nils Toedtmann

@kasperd แนวคิดที่น่าสนใจ ฉันสามารถใช้งานเซิร์ฟเวอร์ OpenVPN ได้หลายอินสแตนซ์ จะต้องมีอาจ 3 หรือ 4 สำหรับช่วง MTU ที่แตกต่างกัน ฝั่งเซิร์ฟเวอร์ต่อไคลเอนต์ NAT จะไม่ทำงาน (ฉันไม่สามารถคาดเดาที่อยู่ IP ไคลเอนต์สาธารณะแบบไดนามิก) แต่ฉันจะต้องเปลี่ยนการตั้งค่าไคลเอนต์ต่อไปสำหรับการตั้งค่า MTU (ถูกต้อง?) ดังนั้นฉันจะกำหนดค่าพอร์ตต่างๆ เข้าสู่ลูกค้า - แต่มันเป็นฝันร้ายของการบำรุงรักษาที่ฉันต้องการหลีกเลี่ยง!
Nils Toedtmann

@NilsToedtmann เกณฑ์ใดที่คุณจะใช้ในการตรวจสอบว่าลูกค้าได้รับผลกระทบใดบ้าง อีกวิธีหนึ่งที่สามารถเรียกใช้สคริปต์บนเซิร์ฟเวอร์หลังจากที่ลูกค้าได้เชื่อมต่อ สคริปต์สามารถลอง ping ที่อยู่ IP ของลูกค้าด้วยขนาดแพ็คเก็ตที่แตกต่างกันเพื่อหาว่าอันไหนใช้ได้บ้าง จากนั้นมันสามารถแทรกiptablesกฎเพื่อลด MSS ในแพ็กเก็ต SYN ทั้งหมดไปยังหรือจากที่อยู่ IP ไคลเอนต์นั้น
kasperd

คำตอบ:


4

ฉันแก้ไขปัญหาที่ฝั่งไคลเอ็นต์โดยเพิ่มตัวเลือกmssfix 1300ในไฟล์ปรับแต่ง

จากหน้าคน openvpn:

--mssfix max
    Announce to TCP sessions running over the tunnel that they should limit their send packet sizes such that after OpenVPN has encapsulated them, the resulting UDP packet size that OpenVPN sends to its peer will not exceed max bytes. 

แนวคิดดั้งเดิมสำหรับโซลูชันของฉันมาจากpersonalvpn.org


1
ดังนั้นmssfixสามารถตั้งค่าฝั่งไคลเอ็นต์เท่านั้นได้หรือไม่ อย่างน้อยนั่นก็เป็นอย่างนั้น มันไม่ได้ช่วยแพ็คเก็ต UDP (ซึ่งเป็นเหตุผลว่าทำไมฉันถึงสนใจในตัวเลือกอื่น ๆ แต่อย่างน้อยก็แนะนำfragmentให้ตั้งค่าฝั่งเซิร์ฟเวอร์ด้วย)
Nils Toedtmann

3
mssfix สามารถเพิ่มได้บนเซิร์ฟเวอร์เช่นเดียวกับลูกค้า อย่างไรก็ตามมูลค่าที่น้อยกว่าจะถูกใช้ในการเจรจา
Ahmed

2

เมื่อขาดคำตอบตอนนี้ฉันกำลังโพสต์วิธีแก้ปัญหาที่ไม่หรูหรา แต่ใช้งานง่าย: เรียกใช้อินสแตนซ์ OpenVPN อื่นบน TCP สำหรับ "ไคลเอนต์ไม่ดี"

proto tcp

และลด TCP MSS บนไคลเอนต์เช่น

iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o ${OUT_DEV} -j TCPMSS --set-mss ${PATH-MTU-MINUS-40}

ข้อดีของการแก้ปัญหานี้คือลูกค้าแต่ละรายสามารถตั้งค่า MSS แยกต่างหากได้

นี้เป็นที่ยอมรับ TCP-over-TCP แต่ที่ควรดำเนินการได้ดีพอในหลายสถานการณ์

โปรดทราบว่าฉันยังคงเป็นโซลูชันที่น่าสนใจซึ่งไม่ต้องการproto tcpและฉันจะทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องหากพวกเขาทำตามข้อกำหนดที่ระบุไว้ของฉันไม่มากก็น้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.