eth0:0 იარლიყია და არა მოწყობილობა: გაასწორე SNAT-ის დამთხვევა
ნულოვანი მრიცხველი ნიშნავს, რომ წესი ასახელებს ინტერფეისს, რომელიც ვერ იარსებებს. წაიკითხე ნამდვილი მოწყობილობა, გაასწორე -o დამთხვევა და შემდეგ განზრახ აირჩიე თარგმნილი მისამართი.
NAT წესი, რომელსაც ერთი VPN კლიენტთა პულისთვის საკუთარი საჯარო მისამართი უნდა მიეცა, ნულ პაკეტზე დგას, სანამ იგივე პული კვლავ არასწორი წყაროთი გადის. წესი ჩვეულებრივ მისამართში არ ცდება; ის ინტერფეისში ცდება. -o eth0:0 მიუთითებს მოწყობილობაზე, რომელიც არ არსებობს, რადგან eth0:0 იარლიყია, რომელიც მიმაგრებულია მისამართზე eth0. მრიცხველებზე ყურება ამის დადასტურების ყველაზე სწრაფი გზაა და შესწორება უფრო პატარაა, ვიდრე გამოძიება გვიკარნავს.
შეამოწმე, რას ეძახის ბირთვი მოწყობილობას
სანამ რამეს შეცვლი, ორივე ხედი ცალკე წაიკითხე:
ip link show
ip address show dev eth0
ip route get 203.0.113.20
ბმულების სია ინტერფეისებს აჩვენებს. მისამართების სიამ შეიძლება აჩვენოს მეორე IPv4 მისამართი, რომელსაც იარლიყი უჭირავს eth0:0, და ამ მისამართის მოწყობილობა კვლავ eth0 არის. iproute2-ის მისამართების სახელმძღვანელო იარლიყს მისამართის სახელად თვლის და არა მეორე ბმულად, და სწორედ ამ განსხვავებაზე დგას მთელი პრობლემა.
ისტორია ხსნის დაბნეულობას. ძველი ifconfig eth0:0 სინტაქსი ნამდვილად ახალ ინტერფეისს ჰგავდა და იმ ეპოქის სკრიპტები კვლავ მასზე მიუთითებენ. თანამედროვე სისტემაში ალიასი მისამართზე დადებული იარლიყია და არც მარშრუტიზაციის და არც netfilter-ის გზაზე არაფერი თვლის მას ცალკე გამომავალ წერტილად.
შეამოწმე, რას დაემთხვა წესი სინამდვილეში
მრიცხველები წესების სიასთან ერთად წაიკითხე და არა მეხსიერებიდან:
iptables -t nat -L POSTROUTING -v -n --line-numbers
წესი, რომლის პაკეტების მრიცხველიც ნულზე რჩება, სანამ შესაბამისი ტრაფიკი მიედინება, არ ფასდება, და გამომავალი ინტერფეისის პირობა, რომელიც ასახელებს eth0:0 ხშირი მიზეზია. მარშრუტის მიერ არჩეული გამომავალი მოწყობილობა eth0 არის, ამიტომ სხვა სახელის მაძიებელი პირობა არასოდეს გახდება ჭეშმარიტი, რომელი წყაროს მისამართიც არ უნდა აირჩიოს ბირთვმა.
შეცვალე პირობა ნამდვილ მოწყობილობაზე და იარლიყი მის გარეთ დატოვე. თუ ორი კლიენტთა პული უნდა გაარჩიო, რომლებიც ამ მოწყობილობას იზიარებენ, წყაროს პრეფიქსით გაარჩიე და არა ინტერფეისის სახელით, რომელიც ვერ იარსებებს. ორი წესი არადამთხვევი -s დამთხვევებით იკითხება და საცდელია; ერთი წესი გამოგონილი მოწყობილობით არც ერთია და არც მეორე. თითოეულ წესს დაუმატე კომენტარი, რომელიც პულს ასახელებს, რადგან ნახევარი წლის შემდეგ პრეფიქსი მარტო ვერავის ეტყვის, რატომ დგას ის იქ.
შეამოწმე მარშრუტი, რომელმაც მოწყობილობა აირჩია
Postrouting NAT მუშაობს მას შემდეგ, რაც მარშრუტმა უკვე აირჩია გამომავალი ინტერფეისი, ამიტომ წესში ინტერფეისი ის უნდა იყოს, რომელიც მარშრუტმა აირჩია. ბირთვს პირდაპირ ჰკითხე ip route get -ით წარმომადგენლობითი კლიენტის მისამართისთვის და წაიკითხე როგორც მოწყობილობა, ისე მოხსენებული წყარო.
თუ პასუხი ასახელებს eth0, წესის ინტერფეისის ნაწილი გარკვეულია. თუ ის გვირაბის მოწყობილობას ასახელებს, პაკეტი ვერასოდეს მიაღწევს იმ წესს, რომელსაც არედაქტირებ, და ძებნა გადადის მარშრუტიზაციის ცხრილსა და მის პრიორიტეტებზე. წესი, რომელიც არასოდეს ემთხვევა, რადგან პაკეტი სხვაგან გავიდა, მრიცხველების გამონატანში ისე გამოიყურება, როგორც არასწორად დაწერილი მოწყობილობის წესი. სანამ რამეს შეცვლი, დაადასტურე, რომელია შენი შემთხვევა, რადგან მეორეს ტექსტის შეცვლა კი არა, მარშრუტიზაციის შეცვლა სჭირდება.
განზრახ აირჩიე თარგმნილი წყარო
როცა მოწყობილობა სწორია, წყაროს მისამართი ცალკე გადაწყვეტილებაა. ეს მხოლოდ საილუსტრაციო IPv4 პული და მაგალითი მისამართია:
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 \
-j SNAT --to-source 203.0.113.20
მისამართის ჩაწერა --to-source -ში არავის არ აიძულებს, ის შენკენ დაამარშრუტოს. ზედა პროვაიდერმა ან მისამართის მფლობელმა ამ მისამართის პასუხები სწორედ ამ ჰოსტს უნდა მიაწოდოს, და მისამართი ის უნდა იყოს, რომლის გამოყენების უფლებაც გაქვს. თუ არ არის, წესი დაემთხვევა და თარგმნის, და პასუხები მაინც სხვაგან წავა.
წყაროს მისამართის შეცვლა არ არის იგივე, რაც ზედა ბმულის შეცვლა. როცა ნამდვილი მოთხოვნა სხვა ფიზიკური გზაა, მარშრუტიზაციის პოლიტიკამ ჯერ ეს გზა უნდა აირჩიოს; შემდეგ SNAT გადაწერს წყაროს იმ მოწყობილობაზე, რომელიც პოლიტიკამ აირჩია. მეტი იარლიყი eth0 -ზე არც მარშრუტს იძლევა და არც ნებართვას.
შეამოწმე ახლახან გახსნილი კავშირით
გახსენი ახალი კლიენტის კავშირი და ნუ გამოიყენებ არსებულს ხელახლა. კავშირების თვალის დევნება ინახავს იმ თარგმანს, რომელიც ნაკადის დაწყებისას ჩაწერა, ამიტომ ძველ სესიას შეუძლია ისევ წინა წყაროს მისამართი გამოიყენოს და სწორი ახალი წესი გატეხილად აჩვენოს. დააკვირდი მრიცხველის ზრდას და შემდეგ დააკვირდი თარგმნილ წყაროს ხაზზე ან შორეულ ბოლოში.
როცა რამდენიმე პული ერთ ინტერფეისს იზიარებს, თითოეულს მიეცი ცხადი წყაროს დამთხვევა და საკუთარი თარგმანის მისამართი, შეინახე ისინი ფაირვოლის მართულ კონფიგურაციაში და ჩაწერე, რა თანმიმდევრობით ფასდებიან. შემდეგ ჩაწერე, რაც შეამოწმე: მოწყობილობა ip route get-იდან, მრიცხველი, რომელიც დაიძრა, და წყარო, რომელიც შორეულმა მხარემ დაინახა. ეს ჩანაწერი პასუხობს შემდეგ მოხსენებას ალიასის დაბნეულობის გამეორების გარეშე.