VPN psql-ს არ ბლოკავს: თქვენი კლიენტი სხვაგან უკავშირდება
psql და GUI კლიენტი შეიძლება ერთი მოწყობილობიდან სხვადასხვა დანიშნულებას მიმართავდეს. VPN-ის დადანაშაულებამდე შეადარეთ ჰოსტი, სოკეტი, როლი და TLS.
ორივე კლიენტი ერთსა და იმავე ლეპტოპზეა, ერთი და იმავე გვირაბში გადის და მათგან მხოლოდ ერთი უკავშირდება. ეს შედარება VPN-ის შერჩევითობის მტკიცებულებად ჩანს, თუმცა ბევრად უფრო გავრცელებული ახსნაა, რომ ორი კლიენტი სხვადასხვა დანიშნულების წერტილს უკავშირდება. GUI ინახავს საკუთარ ჰოსტს, პორტს, როლს და TLS პარამეტრებს და საჭიროებისას ჩუმად აშენებს SSH გადაგზავნას, ხოლო psql კავშირს აწყობს libpq-ის ნაგულისხმევი მნიშვნელობებიდან, რომლებიც თქვენმა shell-მა შეიძლება უკვე დააყენა. სამუშაო კავშირის გამეორება GUI-ის პარამეტრების წაკითხვაა და არა გვირაბის ხელახლა დაყენება.
მითი: ერთი მუშა კლიენტი გზას ამტკიცებს
თუ GUI უკავშირდება, გვირაბი ტრაფიკს გადაიტანს და ეს არის ერთადერთი, რასაც GUI ამტკიცებს. ის არაფერს ამბობს იმაზე, თუ რომელ მისამართს ხსნის psql, რომელი როლით ახდენს ავთენტიფიკაციას ან ტოვებს თუ არა მის მიერ გახსნილი სოკეტი მოწყობილობას. გზა საერთოა; პარამეტრები არა.
ლოკალური გადაგზავნა შუალედს აფართოებს. GUI შეიძლება დაუკავშირდეს 127.0.0.1-ს იმ პორტზე, რომელიც SSH-ით გადასცა, და ეს მსმენელი მხოლოდ GUI-ის სესიის განმავლობაში არსებობს. გადაგზავნის გარეშე localhost-ზე მიმართული psql უარყოფილ კავშირს იღებს, რომელსაც VPN-თან არაფერი აქვს საერთო.
წაიკითხეთ ის დანიშნულება, რომელსაც GUI რეალურად იყენებს
გახსენით კავშირის თვისებები და დააკოპირეთ ოთხი მნიშვნელობა: ჰოსტი, პორტი, მონაცემთა ბაზა და როლი. შემდეგ მოძებნეთ გვირაბის ჩანართი, რადგან SSH გადაგზავნა კერძო მისამართს ლოკალურ პორტად აქცევს და ცვლის იმას, რაც psql-ს უნდა ვუთხრათ.
| Setting | What the GUI holds | What psql uses when the value is absent |
|---|---|---|
| Destination | A saved hostname, sometimes behind a forward | A local Unix socket, not the remote endpoint |
| Port | The direct port or a forwarded local port | 5432, or the port from a service file |
| Role and database | Stored per connection profile | Your operating-system user name |
| TLS identity | Its own CA bundle and verification mode | Whatever PGSSLMODE or the service file says |
| Startup files | Not read at all | Read unless -X is passed |
თითოეული სტრიქონი სხვადასხვა დონეზე ფერხდება და მიღებული შეტყობინება ამ დონეს ასახელებს. შენახული პროფილის მეგობრული სახელის psql-ში ჩასმა ზემოთ მოცემულ არც ერთ მნიშვნელობას არ გადაიტანს, ხოლო სერვისის სახელი ფაილით იხსნება, რომელსაც ტერმინალი შეიძლება არასდროს წაიკითხოს.
რას მემკვიდრეობით იღებს libpq თქვენი shell-იდან
psql არის თხელი კლიენტი libpq-ის ზემოთ და libpq გარემოს ყველაფერზე ადრე კითხულობს. PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE და PGSSLMODE ცვლადებს თითოეულს შეუძლია კავშირის ნაწილი სხვა მიმართულებით გადაამისამართოს. ისინი მემკვიდრეობით მიიღება და არ იწერება, ამიტომ თქვენს გაშვებულ ბრძანებაში არც ერთი მათგანი არ ჩანს. ექსპორტირებულ PGSSLMODE-საც შეუძლია შეცვალოს ის, რასაც კლიენტი იღებს, ბრძანების სტრიქონზე ერთი სიტყვის გარეშე.
ამ ცვლადებიდან ორი პირველ რიგში ეჭვს იმსახურებს. PGHOSTADDR იძლევა რიცხვით დანიშნულებას, რომელიც სახელების ამოხსნას გვერდს უვლის, მაშინ როცა ჰოსტის სახელი კვლავ წყვეტს სერტიფიკატის იდენტობას, ხოლო PGSERVICE ჰოსტს, მონაცემთა ბაზას და TLS-ის არჩევანს სერვისის ფაილიდან იღებს. ამის გამართვისთვის მთელი გარემოს გამოტანა ცუდი ჩვევაა, რადგან შეიძლება შეიცავდეს პაროლებს და უკავშირო ტოკენებს; სამაგიეროდ აირჩიეთ ის ცვლადები, რომლებიც გაინტერესებთ.
host-ისა და hostaddr-ის ერთად გამოტოვება ქსელური მისამართის ნაცვლად Unix დომენის სოკეტს ირჩევს. ამიტომ -h-ის გარეშე psql გამოძახება შეიძლება ლოკალურად წარმატდეს ან სოკეტის შეცდომით ჩავარდეს, GUI-ის მიერ გამოყენებულ მარშრუტს არასდროს შეხებოდეს.
გაგზავნეთ იგივე პარამეტრები ხელით
GUI-ის მნიშვნელობები რომ გაქვთ, გადაეცით ისინი ცალსახად და გამოტოვეთ საწყისი ფაილი, რომელსაც გადაფარვები შეიძლება დაემატოს. ქვემოთ მოცემული კავშირის სტრიქონი საილუსტრაციოა: შეცვალეთ დანიშნულება, პორტი, მონაცემთა ბაზა და როლი თქვენი ადმინისტრატორის მიერ დამტკიცებული მნიშვნელობებით და შეინარჩუნეთ უკვე მომუშავე ნდობის კონფიგურაცია.
psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"სამი დეტალი ამ ბრძანებაში განზრახ არის. -X თრგუნავს psql-ის საწყის ფაილს, თუმცა არ თრგუნავს libpq-ის გარემოს ან სერვისის განსაზღვრებას. connect_timeout=5 ხელს უშლის ცარიელ მარშრუტს ტერმინალის წუთობით ჩამოკიდებაში. sslmode=verify-full სერტიფიკატისა და ჰოსტის სახელის შემოწმებებს ჩართულს ტოვებს, რაც ზუსტად ის ნაწილია, რომელსაც ხალხი გამორთავს, როცა TLS შეცდომა ჩნდება.
თუ დამტკიცებული დანიშნულება pooler-ის უკანაა, 6432 პორტი და 5432 პორტი შეიძლება ერთსა და იმავე მონაცემებს მიაღწიოს სხვადასხვა სერვერის იდენტობით, და შემოწმება შეიძლება ჩავარდეს pooler-ის სახელზე და არა მონაცემთა ბაზისაზე. გაასწორეთ სახელი კავშირის სტრიქონში და არ დაასუსტოთ რეჟიმი.
ნება დართეთ შეცდომის შეტყობინებას აირჩიოს შემდეგი ნაბიჯი
ჩავარდნის ტექსტი ამბობს, რამდენად შორს მივიდა მცდელობა და ეს გვირაბის შესახებ ყველა ვარაუდს სჯობს. სახელი, რომელიც არ იხსნება, სოკეტის არსებობამდე ფერხდება, დროის ამოწურვა ნიშნავს, რომ მარშრუტმა ან firewall-მა პაკეტები ჩამოყარა, უარი ნიშნავს, რომ რაღაცამ უპასუხა და თავი შეიკავა, ხოლო ავთენტიფიკაციის შეცდომა ნიშნავს, რომ ქსელი უკვე მუშაობდა.
psql -X -w "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5" -c '\conninfo'
env | grep -E '^PG'
psql --versionშეადარეთ \conninfo-ის გამოტანა GUI-ის ცოცხალ სესიას: იგივე ჰოსტი, იგივე პორტი, იგივე როლი, იგივე TLS მდგომარეობა. როცა ეს ოთხი ემთხვევა, VPN-ს აღარაფერი რჩება ასახსნელი. სანამ ისინი არ დაემთხვევა, გვირაბის ყოველი დამატებითი ცვლილება ვარაუდია იმ კავშირზე, რომელიც ტერმინალს არასდროს გაუკეთებია.