0183 | TCP MSS Clamping

MSS => Maximum segment size คือค่า parameter ระบุขนาด packet สูงสุดที่ server ทั้งสองฝ่ายรับรู้ เพื่อป้องกันไม่ให้ packet มีขนาดมากเกินว่าค่า MTU ใน Layer 2 ซึ่งถ้าเกินจะทำให้ packet โดน drop หายไปกลางทาง ตามก็ไม่เจอ trace ก็ไม่เห็นว่า loss (เพราะตอน trace ไม่ได้ใช้ packet ขนาดเท่ากะที่ loss) สนุกสนานมาก

เนื่องด้วย TCP เป็น 2-way communication เพราะงั้นก็เลยมี option MSS ไว้ระบุว่าทั้งสองฝั่งจะคุยกันด้วยขนาด packet ไม่เกินเท่าไหร่ ส่งตอบไปตอบกลับตอน 3-way handshake แล้วก็จะพยายามส่ง packet ขนาดไม่เกินเท่านั้นตลอด

MTU interface ปกติคือ 1500 ถ้า traffic ต้องวิ่งผ่าน interface ที่มี encapsulation เพิ่มเช่น pppoe หรือ tunnel ต่างๆ ก็ต้องหัก header ของการ encapsulation นี้ออกไปทำให้ MTU ลดลงไปอีกด้วย ถ้าเครื่องต้นทางและปลายทาง config ไว้ไม่ดีก็อาจทำให้ packet loss ได้

iptables มีตัวช่วยคือ mangle TCP MSS ที่ช่วยแก้ไขค่า MSS ใน packet ให้อยู่ในระดับที่เหมาะสมได้ดังนี้ครับ

iptables -t mangle -A POSTROUTING -p tcp –tcp-flags SYN,RST SYN -m tcpmss –mss 1453:1536 -j TCPMSS –set-mss 1452

คำสั่งแก้ไขเพิ่มเติมจากโพสของพี่นิวตรอน

คำสั่งเดียวเอง แก้ปัญหา packet วิ่งข้าม tunnel แล้ว loss ได้แล้ว แต่มีผลเฉพาะ tcp นะครับ