MSS-ის შეზღუდვა VPN-კარიბჭეზე: რას ასწორებს და რას არა
შეზღუდვა გადაწერს MSS-ს TCP ხელის ჩამორთმევისას, რათა სეგმენტები გვირაბში ჩაჯდეს. ის არასოდეს ასწორებს UDP-ს ან გატეხილ path-MTU შემოწმებას. სამი შემოწმება, თანმიმდევრობით.
პატარა მოთხოვნები მუშაობს, დიდი ჩამოტვირთვები იჭედება და ვიღაც MSS შეზღუდვას გვთავაზობს. ეს შეთავაზება საკმარისად ხშირად მართალია, რომ ღირდეს სწორი თანმიმდევრობით ცდა, და საკმარისად ხშირად მცდარი, რომ ბრმად გამოყენებისას ნახევარი დღე დაკარგო. ქვემოთ სამი შემოწმება გამოყოფს TCP ზომის ნამდვილ პრობლემას UDP პრობლემისგან, გატეხილი path-MTU აღმოჩენისგან და ისეთი შეზღუდვისგან, რომელიც ვერასოდეს ხედავს იმ ხელის ჩამორთმევას, რომელიც უნდა გადაწეროს.
დაიწყეთ მარცხის ფორმით
ზომის მარცხს აქვს ხელმოწერა: კავშირი მყარდება, ავთენტიფიკაცია და პატარა პასუხები წარმატებით სრულდება, შემდეგ კი გადაცემა განუსაზღვრელი ხნით ჩერდება, როგორც კი სრული ზომის სეგმენტი დასჭირდება. გვერდები, რომლებიც ტექსტს ტვირთავენ, მაგრამ სურათს ვერასოდეს ამთავრებენ, იგივე მარცხია უფრო მცირე მასშტაბში. თუ საერთოდ არაფერი უკავშირდება, პრობლემა გზაზე უფრო ადრეა და შეზღუდვა არ დაეხმარება. შეზღუდვა ვერ შეაკეთებს ხელის ჩამორთმევას, რომელიც არასოდეს მოსულა.
ხელმოწერა არსებობს იმიტომ, რომ ხელის ჩამორთმევა სწორედ ის ადგილია, სადაც სეგმენტის ზომაზე თანხმდებიან. თითოეული მხარე აცხადებს მაქსიმალურ სეგმენტის ზომას TCP ოფციად, და გამომგზავნები პატივს სცემენ მეორე მხარის განცხადებას. თუ გზა ასეთ დიდ სეგმენტს ვერ ატარებს, მარცხი მოგვიანებით ჩნდება, როცა გამომგზავნი ბოლოს და ბოლოს ერთს ცდის.
ამ სიმპტომის კითხვისას ტრანსპორტი თვალიდან არ მოშორდეთ. შეზღუდვა TCP ოფციის გადაწერაა, ამიტომ იმავე გვირაბის ქვეშ გაჭედილი ხმოვანი ან ვიდეო ზარი MSS-ის პრობლემა არ არის და ამით არ გაუმჯობესდება. ჩაიწერეთ ტრანსპორტი, სანამ TCP ოფციას შეეხებით.
შეაფასეთ გზა, შემდეგ შეადარეთ გვირაბს
ორი რიცხვი მნიშვნელოვანია და მათ ხშირად ურევენ. path-MTU არის ყველაზე დიდი პაკეტი, რომელსაც გზა დაყოფის გარეშე გადაიტანს, ხოლო IPv4-ისთვის გამოცხადებული MSS არის ეს მნიშვნელობა გამოკლებული IP და TCP სათაურების 40 ბაიტი, ან გამოკლებული 60 IPv6-ისთვის. გვირაბის ინკაფსულაცია ბიუჯეტის ნაწილს ხარჯავს ჯერ შიდა პაკეტის დაწყებამდე.
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
ping do-not-fragment ბიტით გეტყვით, გადარჩება თუ არა ასეთი დატვირთვის ზომის პაკეტი; შეცვალეთ ზომა, სანამ ის ჩავარდება, და ემპირიულად იპოვეთ გზის ზღვარი. tracepath-ის გამომავალი აცხადებს მარშრუტის გასწვრივ აღმოჩენილ MTU-ს, რაც უფრო სწრაფია, როცა მუშაობს, და ნაკლებად საიმედო, როცა შუალედური hop ფილტრავს ზონდებს.
ახლა გამოაკელით გვირაბის ხარჯი. გარე IP სათაური, UDP სათაური და გვირაბისთვის დამახასიათებელი სათაური ყველა ერთი და იმავე 1500 ბაიტიდან გამოდის, ამიტომ ტიპურ Ethernet საფუძველზე გამოსაყენებელი შიდა MTU უფრო დაბალია, ვიდრე ფიზიკური რგოლი გვაფიქრებინებს. თუ გამოთვლილი შიდა MTU დაბალია თქვენი პარტნიორების განცხადებულზე, თქვენ იპოვეთ ნამდვილი შეზღუდვის კანდიდატი და არა ვარაუდი. თუ გამოთვლილი მნიშვნელობა უკვე აღემატება პარტნიორების განცხადებას, აქ გაჩერდით და სხვაგან ეძებეთ.
მოათავსეთ შეზღუდვა იქ, სადაც ხელის ჩამორთმევა გადის
შეზღუდვა მუშაობს SYN და SYN-ACK პაკეტებში MSS ოფციის გადაწერით, როცა ისინი კარიბჭეს კვეთენ. თუ წესი იმ ინტერფეისზე ზის, რომელსაც ვერც ერთი მიმართულება ვერასოდეს კვეთს, მოლაპარაკება უცვლელად სრულდება და სიმპტომი რჩება, ამიტომ შედეგს მნიშვნელობაზე მეტად განლაგება წყვეტს.
| Symptom | What it points to | Next check |
|---|---|---|
| Handshake completes, large transfer stalls | Segment size larger than the path can carry | Path MTU against the tunnel's effective MTU |
| Nothing connects, small or large | Routing, firewall or keying failure | Not MSS; look at the tunnel state |
| Only UDP applications stall | Datagram size or a dropped ICMP error | Platform-specific UDP handling, not clamping |
| Fixed after reconnect, returns later | Clamp applied to one direction or one interface | Rule placement and the handshake path |
მიმართულება მეორე ნახევარია. ერთი მიმართულების შეზღუდვა ნახევარ ნაკადს ასწორებს და დანარჩენს ისე ტოვებს ჩავარდნილს, რომ წყვეტილად გამოიყურება, ამიტომ გამოიყენეთ იგი გადაცემული ტრაფიკის ორივე მიმართულებაზე. გვირაბის ინტერფეისის კლასიკური Linux ფორმაა mangle წესი, რომელიც SYN პაკეტებს ემთხვევა:
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
ყურადღება მიაქციეთ, რას აკეთებს --clamp-mss-to-pmtu სინამდვილეში: ის მნიშვნელობას მარშრუტის MTU-დან გამოიყვანს, რაც ყოველთვის არ არის გვირაბის ნამდვილი დატვირთვის ბიუჯეტი. მარშრუტზე დაფუძნებულ გვირაბში, სადაც შიდა მარშრუტი და გარე გზა განსხვავდება, წინა შემოწმებაში გამოთვლილი მკაფიო მნიშვნელობა უფრო პროგნოზირებადია, ვიდრე ავტომატური.
დაადასტურეთ ახალი კავშირით და ცოცხლად შეინახეთ უკუკავშირი
დამყარებული კავშირი ინარჩუნებს იმ MSS-ს, რაზეც შეთანხმდა, ამიტომ იმავე სესიაზე ტესტირება არაფერს ამტკიცებს. ცვლილების შემდეგ გახსენით ახალი კავშირი და წაიკითხეთ შეთანხმებული მნიშვნელობა პირდაპირ, ნაცვლად იმისა, რომ შემთხვევით დასრულებული გადაცემიდან გამოიტანოთ.
ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS
პირველი ბრძანება აცხადებს socket-ის MSS-ს მის გადატვირთვის მდგომარეობასთან ერთად, რაც ყველაზე სწრაფი დადასტურებაა, რომ შეზღუდვამ იმოქმედა. მეორე ადასტურებს, რომ წესი, რომლის დამატებასაც ფიქრობთ, არის ის წესი, რომელიც არსებობს, იმ ცხრილში, სადაც ის განთავსდა.
შემდეგ დაიცავით ის მექანიზმი, რომელიც არ შეასწორეთ. path-MTU აღმოჩენა დამოკიდებულია იმაზე, რომ ICMP fragmentation-needed შეტყობინებები გამომგზავნამდე მივიდეს, ამიტომ მათი ჩამოგდების firewall დიდ გადაცემებს კვლავ გატეხავს სწორი შეზღუდვის შემთხვევაშიც. დაუშვით ეს შეტყობინებები გვირაბის გზისთვის, ან აღიარეთ, რომ შეზღუდვა ანაზღაურებს თქვენ მიერ არჩეულ პოლიტიკას.
ბოლოს, წინააღმდეგობა გაუწიეთ ცდუნებას, შეზღუდვას დაყენების ღილაკად მოეპყრათ. ის ზღუდავს სეგმენტის ზომას, რაც გამტარობას ხარჯავს იმ გზებზე, რომლებსაც ეს არასოდეს სჭირდებოდა. სამი შემოწმების შემდეგ გამოყენებული ეს მიზანმიმართული შეკეთებაა; პირველად გამოყენებული ეს ცვლილებაა, რომელიც მალავს თავდაპირველ ხარვეზს და მეორე ცვლადს უმატებს ყოველ შემდგომ ტესტს. ეს გაცვლა ღირს განზრახ გაკეთდეს, და არა ნაგულისხმევად.
ჩაიწერეთ გაზომილი path-MTU, გამოკლებული გვირაბის ხარჯი, დამატებული წესი და შემდეგ ნანახი MSS. ოთხი რიცხვი შემდეგ ინციდენტს გამოძიების ნაცვლად ძიებად აქცევს.