แก้ปัญหา LINE (Login ไม่ได้ , Chat ได้ ภาพไม่มาหรือโทร Video Call ไม่ได้) ภายใต้ Network ที่ใช้อุปกรณ์ Mikrotik

2033

เชื่อว่า ปัญหานี้คนทำระบบ Network โดยเฉพาะ Mikrotik นี่น่าจะเจอกันเยอะ ผมเจอปัญหานี้ครั้งแรกประมาณ 2-3  ปีก่อนโดยที่เจอกับ ISP นึงของบ้านเรา และลูกค้าผมที่ใช้ ISP นี้ก็เจอปัญหานี้เกือบทุกเจ้า กว่าจะหาทางแก้ได้ ก็ใช้เวลาอยู่นาน เพราะต้นตอของปัญหาไม่ได้เกิดขึ้นที่ข้างเรา แต่มันก็พอจะมีวิธ๊แก้ไขจากข้างเราได้ระดับนึงครับ

ส่วนใหญ่ที่จะเจอก็คือ

  1. คุณใช้ Network ที่มี Mikrotik เป็น Gateway
  2. LINE คุณจะมีปัญหาแปลกๆ เช่น Login ไม่ได้ ทั้งๆที่ Internet ใช้ได้ , Speedtest ออกมาความเร็วก็ปกติ 
  3. Login ได้ Chat ได้ แต่บางทีส่งรูปไม่ไป ส่ง Sticker ไม่ไป
  4. หรือบางทีทำได้เกือบหมด แต่ Video Call ไม่ได้

ซึ่งสาเหตุชัดๆ ผมก็บอกไม่ได้เหมือนกัน แต่ปัญหามันเกิดขึ้นจากขนาดของค่า TCP MSS ของ Packet ที่เราส่งไปครับ

แต่จะให้ผมเล่าก็ต้องเล่าย้อนไปไกลระดับนึง ผมจะลองดูนะครับว่า ผมจะสามารถอธิบายให้เข้าใจง่ายๆได้ไหม

เวลาเราจะส่งข้อมูลไปยังปลายทางบนโลก Internet เปรียบได้ดั่งการเดินไปส่งของที่ Kerry Express นั่นก็คือ คุณจะต้องมี ของที่คุณจะส่ง นำมันใส่กล่อง จากนั้น ก็แปะ ที่อยู่ ผู้ส่ง และ ที่อยู่ผู้รับ แล้วก็นำไปที่ Kerry เพื่อส่งใช่ไหมครับ

การใส่ของลงในกล่องเพื่อส่ง บางครั้ง ของที่คุณจะส่งไปมันมีมากเกินกว่า จะใส่กล่องเดียวได้ คุณอาจจะต้องแพ๊คของแยกสองกล่อง ซึ่งแต่ละกล่อง คุณอาจจะติดหมายเลขให้มันว่า นี่คือ กล่อง 1 อันนี้กล่อง 2 อะไรแบบนี้ 

แบบเดียวกันเลย คุณจะส่งข้อมูลไปยังโลก Internet

คุณก็ต้องมี ชิ้นข้อมูล ที่คุณสร้างคุณสร้างมานำมันมาใส่กล่องที่เราเรียกว่า  Payload จากนั้น ก็แปะ ที่อยู่ต้นทาง (Source Address) และ ที่อยู่ปลายทาง (Destination Address) เข้าไป แล้วก็นำมันไปส่งครับ

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

Packet ประกอบไปด้วย IP Header (ที่อยู่ผู้รับและผู้ส่ง มีขนาด 20 byte) + (TCP Header สถานะและลำดับของกล่อง มีขนาด 20 byte) + Payload ที่เป็น Data ที่เราส่งไปมีขนาด 1460 Byte รวมแล้วเป็น 1,500 byte ซึ่งค่า Default ของอุปกรณ์ Network โดยทั่วไปจะอยู่ที่ 1,500 byte นี่แหละครับ

เมื่อเราประกอบร่าง Packet พร้อมจะส่งแล้ว เราจะส่งมันเข้ามาใน เครือข่าย Ethernet ที่เป็น LAN พื้นฐานที่เราใช้งานกัน เราก็จะต้องครอบมันด้วย 

จากนั้นมันก็จะถูกครอบด้วย Ethernet Frame ที่มีขนาด 14byte และถูกส่งไปบนเครือข่าย LAN อีกทีนึงครับ

ซึ่งตัวเลขนี้เป็นค่าพื้นฐานของระบบ IPv4 ที่ใช้กันมาดั้งเดิม แต่ ตัวเลขนี้อาจจะมีเปลี่ยนแปลง ได้หลายสาเหตุครับ เช่น ถ้ามีการทำ MPLS , IPSec หรือมีการทำ VLAN  หรืออะไรเพิ่มเติมเข้ามา ผลก็คือ จะทำให้ขนาดของ Packet เปลี่ยนไป

อย่างในภาพข้างบน ถ้าเกิดว่าข้อมูลของเรา ดันส่งเข้าไปในเครือข่าย ที่มันมีการทำ MPLS ขึ้นมา จะเห็นว่า มันมีขนาดเพิ่มมาอีก 4 byte + 4 byte ที่เป็นค่าของ LDP + VPN Label ในการทำ MPLS 

อ้าว ขนาดของข้อมูลมันเปลี่ยนนี่หว่า ชิปหายล่ะ จากเดิมที่ Packet ของเรา จาก 1,500 เฉยๆ เป็น 1,504 ซึ่งขนาดตรงนี้ จะเพิ่มมาก็ไม่แปลกหรอก แต่อุปกรณ์ทุกตัวจะมีการกำหนดเอาไว้ว่า จะอ่าน ขนาดของค่า Packet ไว้ที่เท่าไหร่ โดยที่พื้นฐานจะมีการกำหนดการอ่านค่าเหล่านี้เอาไว้ ซึ่งค่าพวกนี้ เราเรียกว่าค่า MTU ครับ ย่อมาจาก Max Transmission Unit ถ้าให้แปลง่ายๆก็คือ กล่องที่จะใช้ส่งของเราจะมีขนาดใหญ่แค่ไหน โดยที่มันจะมี MTU 2 ค่า คือ

IP MTU สำหรับใช้ส่งและอ่านค่า IP Packet ค่า Default จะเป็น 1,500 

L2 MTU สำหรับการอ่านค่า Ethernet Frame ที่วิ่งในเครือข่าย Ethernet ค่า Default จะเป็นอะไรก็ได้ที่มากกว่า 1,500 แต่จะต้องกำหนดให้เพียงพอกับ เทคโนโลยี Ethernet ที่เราจะใช้ เช่น ถ้าคุณทำ VLAN ก็ต้องเพิ่มไปอีก 4 byte , ถ้าจะทำ MPLS ก็ต้องเพิ่มไปอีก 

ซึ่งผมคิดว่า มันน่าจะมีปัญหาใน ISP นั้น ที่เวลาจะส่งข้อมูลให้กับเครือข่าย CDN ของ LINE แล้วน่าจะกำหนด L2 MTU ผิด ผลก็คือทำให้อ่านค่า MTU ผิด พอส่งเข้าไปในเครือข่ายของ LINE ข้อมูลมันเลยใช้ไม่ได้ เพราะไม่ได้มีการกำหนด L2 MTU ให้มันถูกต้อง

อ้าว อ่านดูแล้วก็เป็นปัญหาข้างใน ISP นี่หว่า แล้วจะแก้ยังไงล่ะ มันไม่ได้เกี่ยวอะไรกับเราเลยนี่นา

จริงๆ ปัญหาจะเป็นข้าง ISP หรือ ข้างฝั่ง LINE ผมก็ไม่รู้จริงๆครับ เพราะว่า เราไม่รู้เลยว่าใครไป Config พลาดตรงไหน แต่ส่วนใหญ่ถ้าใช้ ISP นึง แล้วจะค่อนข้างมีปัญหาชัดๆเลย ผมเลยค่อนข้าง เทไปยังข้าง ISP มากกว่านะ

แต่ก็นั่นแหละ แล้วจะแก้ยังไงล่ะ ผมยังไม่รู้เลยว่า ผมควรจะไปบอก ISP หรือบอก LINE กันแน่ โทรไปหา Call Center แล้วบอกเค้าจะเข้าใจไหมล่ะเนี่ย

งั้นเราก็ต้องกลับมาแก้ข้างเราครับ ถ้าเกิดปัญหามันอยู่ที่ว่า L2 MTU ของเส้นทางซักเส้นทางนึงจากเราไปยัง LINE Server มันกำหนดขนาดมาไม่พอ ที่จะทำให้ส่ง Payload  ข้ามไปได้ งั้นมันก็สามารถแก้ไขฝั่งเราได้ครับ ด้วยการลดขนาดของ Payload ที่ส่งไป มันจะได้พอดีกับกล่อง ของฝั่งโน้นนั่นเอง

ซึ่ง Mikrotik สามารถทำสิ่งได้ด้วยการปรับค่า TCP MSS ให้พอดีกับปลายทางแบบอัตโนมัติครับ

โดยที่เราต้องกำหนดค่าใน Firewall ของ Mikrotik ครับ ว่า ถ้าจะส่ง Packet ออกไปยังโลก Internet ให้ทำการเช็คขนาดของ TCP MSS ที่ปลายทางก่อนว่า ปลายทางรับได้เท่าไหร่ แล้ว พอจะเริ่มเชื่อมต่อ ค่อยปรับขนาดของ Payload ให้เล็กลงจนเหมาะสมทำให้วิ่งผ่านไปได้นั่นเอง (พูดง่ายๆก็คือ ถ้าของในกล่องที่เราส่งไป มันดันใหญ่กว่า กระบะที่ทางโน้นรับได้ ก็ให้เราเช็คก่อนว่าขนาดกระบะ ของฝั่งโน้นมันรับได้เท่าไหร่ ค่อยส่งขนาดที่ ฝั่งนั้นรับได้ มันจะได้ผ่านได้ตลอดทั้งทางนั่นเองครับ

คำสั่งที่ผมใช้ก็คือ

/ip firewall mangle add action=change-mss chain=forward comment="Clamp MTU for PPPoE1" new-mss=clamp-to-pmtu out-interface=pppoe-out1 passthrough=yes protocol=tcp tcp-flags=syn tcp-mss=1-65535

คำสั่งนี้จะทำให้ Packet ที่วิงออกทาง Interface ที่ชื่อ pppoe-out1 เนี่ย จะถูกปรับค่า TCP MSS ตามที่เช็คได้ว่าปลายทางรับได้เท่าไหร่ครับ

พอใช้คำสั่งนี้กับ Internet ขาออก ก็จะแก้ไขปัญหา LINE เพี้ยนๆ อย่างที่ผมบอกไปครับผม

ทีนี้ถ้าคุณจะเอาไปใช้งาน คุณก็ต้องดูว่า Mikrotik ของคุณออก Internet ด้วย interface ไหน เช่น ehter1, ether2 หรือ pppoe-out1 , pppoe-out2 ก็ไปแก้ไขชื่อ ให้ตรง ในหัวข้อ out-interface=xxxx นะครับ

ทีนี้ แล้วปัญหาก็คือ ทำไม Router บางตัวไม่เห็นมีปัญหา ทำไม Mikrotik แล้วมีปัญหา

อาจจะเพราะว่า Router แบบ Home Use ที่ขายโดนทั่วไป มีการใส่ค่านี้มาให้โดยอัตโนมัติอยู่แล้ว ก็เลยใช้ได้ครับ สาเหตุก็เพราะว่า Mikrotik มันเป็น Router ที่ทำงานตามสั่งเท่านั้น เวลาคุณซื้อมันมา มันก็เหมือนกระดาษขาว ที่ให้คุณบรรเลงยังไงก็ได้ ว่ากันว่า Mikrotik มันจะเก่งหรือไม่เก่งก็อยู่ที่คน Setup นี่แหละครับ