ერთ ლეპტოპზე, ერთი დაკავშირებული VPN კლიენტით, Linux კონტეინერები ერთმანეთთან საუბარს აგრძელებენ, Windows კონტეინერები კი ჩერდებიან. ცვლადი გამოსახულება არ არის, არამედ გზა, რომლითაც პაკეტები ჰოსტში შედის. ნაგულისხმევ ქსელში Windows კონტეინერები ჰოსტის მარშრუტიზაციის ცხრილსა და ტრანსლაციას სესხულობენ, ამიტომ ჰოსტის მარშრუტიზაციის შემცვლელი პოლიტიკა მათაც ცვლის. დაადასტურეთ ეს მარშრუტის ძიებით, სანამ რაიმეს ხელახლა დააყენებთ.

სად შედის Windows კონტეინერის პაკეტები ჰოსტში

ნაგულისხმევ nat ქსელში მყოფი კონტეინერი მისამართს Host Networking Service-ის პრეფიქსიდან იღებს, ჩვეულებრივ სადღაც 172.16.0.0/12-ის შიგნით, და ჰოსტს ვირტუალური ადაპტერის მეშვეობით აღწევს. ჰოსტი ფლობს ამ პრეფიქსის მარშრუტს და ტრაფიკს იმ ადაპტერისკენ თარგმნის, რომელიც ამჟამად აქტიურია. ამ გზის შუაში ცალკე ვირტუალური მანქანა არ არის.

სწორედ ეს დიზაინი ხდის ხარვეზს მექანიკურად. როცა კონტეინერი პაკეტს აგზავნის, ჰოსტი კონტეინერის პრეფიქსისთვის მარშრუტის ძიებას ასრულებს. რომელი მარშრუტიც მოიგებს, იქ მიდის პაკეტი და კონტეინერს ამაზე აზრი არ აქვს.

რას ცვლის VPN კლიენტი ამ გზაზე

კორპორატიული კლიენტი ხშირად აყენებს მარშრუტების ფართო კრებულს და ფილტრს, რომელიც გვირაბის აქტიურობისას ლოკალურ ქვექსელზე წვდომას უარყოფს. განზრახვა თავდაცვითია: დაზიანებული ლოკალური ქსელი დაცულ მანქანამდე არ უნდა მივიდეს. გვერდითი ეფექტი ისაა, რომ ჰოსტის მარშრუტი კონტეინერის პრეფიქსამდე უკვე აღარ არის ლოკალური NAT ქსელი.

ამის ნაცვლად ძიება გვირაბს ემთხვევა და პაკეტი კარიბჭეს გადაეცემა, რომელსაც ამ კონტეინერის მისამართზე არასოდეს სმენია. Ping ვერ ადის, აპლიკაციის დრო იწურება და კონტეინერი გატეხილად გამოიყურება, სანამ VPN-ის ხატულა ანათებს. შეხედეთ ჰოსტის ცხრილს დაკავშირებისას და კონკურენტი მარშრუტი ჩანს.

Container modeOutbound pathTypical result behind the VPN
Windows, default natHost routes and translates container trafficContainer prefix follows the tunnel and fails
Windows, transparentContainer sits on the physical linkDepends on the local subnet being allowed
Linux engine on Docker DesktopVM egress proxied by a host processOften keeps working

რატომ იქცევიან Linux კონტეინერები სხვანაირად

Linux ძრავი კონტეინერებს მსუბუქი ვირტუალური მანქანის შიგნით ამუშავებს და ამ მანქანიდან გამავალ კავშირებს ჰოსტის მხარეს არსებული პროქსი ხსნის კონტეინერის სახელით. სოკეტს ჰოსტი იწყებს, ამიტომ VPN-ის წესი კონტეინერის პრეფიქსზე მასზე იმავე გზით არ ვრცელდება და დატვირთვა ქსელამდე აღწევას აგრძელებს.

ეს სხვაობა ასევე ხსნის, რატომ არ გადადის Linux-ის რეცეპტები. Linux კონტეინერს, რომელსაც საკუთარი გვირაბი სჭირდება, ეძლევა TUN მოწყობილობა და NET_ADMIN შესაძლებლობა. Windows კონტეინერები არცერთ ინტერფეისს მოწყობილობად არ ამჟღავნებს, ამიტომ ამ ნიმუშს იმ მხარეს ანალოგი არ აქვს.

დაამტკიცეთ მარშრუტი, შემდეგ აირჩიეთ დიზაინი

მტკიცებულებები ჰოსტიდან შეაგროვეთ, კონტეინერიდან არა, რადგან ძიებას ჰოსტი ასრულებს:

docker network inspect nat --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"
route print -4
Get-NetRoute -AddressFamily IPv4 | Where-Object DestinationPrefix -like "172.16.*"

მარშრუტების გამომავალი ერთხელ გაუშვით VPN-ის დაკავშირებამდე და ერთხელ შემდეგ. თუ მეორე გამომავალში კონტეინერის პრეფიქსი გვირაბის ადაპტერზე მიუთითებს, დიაგნოზი დასრულებულია და კონტეინერების გადატვირთვა არ დაეხმარება.

პირველი ვარიანტი პოლიტიკის გადაწყვეტილებაა: ჰკითხეთ ქსელის მფლობელს, შეიძლება თუ არა ამ მოწყობილობისთვის ლოკალურ LAN-ზე წვდომის დაშვება. რამდენიმე კორპორატიული კლიენტი ამას პარამეტრად გვთავაზობს, მაგრამ ეს განზრახ დაწესებულ საზღვარს ასუსტებს. მოითხოვეთ ის როგორც დოკუმენტირებული გამონაკლისი მფლობელით და გადასინჯვის თარიღით. თითო მოწყობილობის გადამრთველი, რომელზეც არავინ ბრუნდება, იმის გზაა, რომ თავდაცვითი პოლიტიკა ჩუმად ქრება.

სადაც პოლიტიკა უნდა დარჩეს, გადაიტანეთ დატვირთვა მარშრუტთან ბრძოლის ნაცვლად. გამჭვირვალე ქსელი ცხადი ქვექსელით და კარიბჭით კონტეინერებს ლოკალურ რგოლზე აყენებს, Linux დატვირთვა ვირტუალური მანქანის პროქსის უკან მუშაობს და ცალკე ვირტუალური მანქანა საკუთარი კლიენტით ინარჩუნებს საკუთარ პოლიტიკას. აირჩიეთ ერთი განზრახ და გამოსცადეთ კონტეინერის შიგნიდან, რადგან მომხმარებლის მოთხოვნა სწორედ იქ იბადება.

დაკავშირებული სტატიები