Μετάβαση στο περιεχόμενο

Προώθηση θυρών από τερματικό

Ένας διακομιστής που ξεκινάς στο τερματικό μιας συνομιλίας δημοσιεύεται μόνο για αυτόν τον χώρο. Ο πίνακας θυρών εντοπίζει τις θύρες ακρόασης που ξεκίνησε αυτή η εφαρμογή εκεί, τις αντιστοιχίζει και σου δίνει μια διεύθυνση για κάθε σημείο από το οποίο μπορεί να θέλεις να τις προσεγγίσεις. Δύο χώροι μπορούν να ακούν και οι δύο στη 5173· οι χάρτες τους δεν αναμειγνύονται ποτέ.

Τίποτα εδώ δεν ανοίγει τη μηχανή προς τα έξω: κάθε διαδρομή δημιουργείται από τον διακομιστή, κατ’ αίτηση, και πεθαίνει μαζί με το τερματικό ή τον σταθμό.

  1. Άνοιξε το Τερματικό (VM) της συνομιλίας ή ένα κέλυφος ξενιστή (σε έναν χώρο ή σε μια σελίδα PR).
  2. Ξεκίνα τον διακομιστή σου — pnpm dev, python -m http.server 8000, ό,τι θέλεις.
  3. Μέσα σε λίγα δευτερόλεπτα, το εικονίδιο βύσματος στην επάνω δεξιά γωνία του τερματικού αποκτά μια κουκκίδα. Κάνε κλικ πάνω του.

Ο πίνακας παραθέτει κάθε θύρα ακρόασης μαζί με τη διεργασία που την κατέχει, ως 3000 → 3000: στα αριστερά η θύρα όπου έδεσε η διεργασία, στα δεξιά η θύρα στην οποία απαντά τοπικά (ο ίδιος αριθμός όποτε ήταν ελεύθερη στη μηχανή σου). Κάθε γραμμή λέει επίσης αν μπορούν να τη φτάσουν το localhost της επιφάνειας εργασίας, ο Περιηγητής (VM) και το Android.

Η ανακάλυψη είναι περιορισμένη: ένα Τερματικό (VM) ελέγχεται μέσα σε εκείνο το φιλοξενούμενο· ένα κέλυφος ξενιστή ελέγχεται από το δέντρο διεργασιών PTY εκείνης της συνεδρίας. Άλλοι χώροι, και άλλες διεργασίες στον Mac σου, δεν καταγράφονται.

Οι νέες θύρες σε αυτό το τερματικό προωθούνται αυτόματα. Απενεργοποίησε την Αυτόματη προώθηση θυρών στον ίδιο πίνακα αν θέλεις μόνο όσες προσθέτεις εσύ.

Χρησιμοποίησε την Αντιγραφή τοπικού URL στη γραμμή — http://localhost:3000. Η προώθηση ακούει μόνο στη διεπαφή loopback, οπότε τίποτα άλλο στο δίκτυό σου δεν μπορεί να τη δει.

Αν δύο χώροι εκθέτουν και οι δύο τη θύρα 5173 του φιλοξενούμενου και η μηχανή σου κατέχει ήδη τη 127.0.0.1:5173, ο δεύτερος χώρος κρατά τη 5173 του φιλοξενούμενου και παίρνει μια εφήμερη τοπική θύρα. Η Αντιγραφή τοπικού URL χρησιμοποιεί τον αριθμό στα δεξιά.

Σε ένα κέλυφος ξενιστή, η διεργασία βρίσκεται ήδη στη μηχανή σου. Η αντιστοίχιση της ίδιας τοπικής θύρας δεν έχει αποτέλεσμα· η επιλογή μιας διαφορετικής τοπικής θύρας δένει έναν proxy loopback σε αυτήν που διάλεξες.

Το --host (ή το δέσιμο στη 0.0.0.0) δεν κάνει έναν περίκλειστο Περιηγητή (VM) ικανό να φτάσει έναν διακομιστή στον Mac. Το φιλοξενούμενο έχει το δικό του loopback· ο διακομιστής φυτεύει μια σήραγγα μέσα σε εκείνο το φιλοξενούμενο όταν η καρτέλα του Περιηγητή βρίσκεται στον ίδιο χώρο.

Άνοιξε τον περίκλειστο περιηγητή στην ίδια συνομιλία. Πληκτρολόγησε localhost:<left-hand port> — τον αριθμό όπου έδεσε η διεργασία. Μια επαναντιστοίχιση (5173 → 3000) απαντά επίσης στον δεξιό αριθμό μέσα σε αυτόν τον περιηγητή, οπότε η Αντιγραφή τοπικού URL λειτουργεί και εκεί. Το browser_use ενός πράκτορα μπορεί να πλοηγηθεί σε οποιοδήποτε από τα δύο. Ένας διακομιστής στον Χώρο Α δεν εμφανίζεται ποτέ ως localhost:5173 στον περιηγητή του Χώρου Β.

Χρησιμοποίησε localhost, όχι διεύθυνση IP του LAN και όχι --host. Το φιλοξενούμενο έχει το δικό του loopback· η σήραγγα ακούει εκεί και σε IPv4 και σε IPv6.

Οι σελίδες που ανοίγουν πολλές συνδέσεις ταυτόχρονα (δεκάδες πόροι, ένα socket ζωντανής επαναφόρτωσης) μοιράζονται την ίδια σήραγγα. Ο Περιηγητής (VM) τις πολυπλέκει σε ένα μόνιμο exec, οπότε ένας καταιγισμός αιτημάτων δεν είναι μια εκκίνηση διεργασίας ανά σύνδεση και δεν καταλήγει σε λευκή σελίδα λόγω λήξης του χρόνου αναμονής.

Μέσα σε έναν χώρο, μια προώθηση του Τερματικού (VM) υπερισχύει ενός κελύφους ξενιστή στον ίδιο αριθμό. Μεταξύ χώρων δεν υπάρχει προτεραιότητα — είναι ξεχωριστοί χάρτες.

Άνοιξε την καρτέλα Android αυτού του χώρου. Το localhost:<port> του εξομοιωτή αντιστρέφεται τότε στη δημοσιευμένη θύρα αυτού του χώρου (adb reverse). Ένας εξομοιωτής είναι καθολικός για τη συσκευή: η σύνδεση του Χώρου Β ανακατευθύνει το :5173 στον Β και ρίχνει αυτό του Α. Κλείσε την καρτέλα και οι αντιστροφές που φύτεψε αυτός ο σταθμός αφαιρούνται.

Ο Προσομοιωτής iOS είναι ήδη ο Mac — καμία αντιστροφή. Ένα φυσικό iPhone εξακολουθεί να χρειάζεται κοινή χρήση στο LAN.

Η διαδρομή ⋯ → Κοινή χρήση στο τοπικό δίκτυο δημοσιεύει τη θύρα στη διεύθυνση <server-ip>:<random port> — χρήσιμη για να ανοίξεις τη σελίδα στο τηλέφωνό σου ή όταν ο διακομιστής εκτελείται σε άλλη μηχανή.

  • Η θύρα LAN εκχωρείται πάντα από το λειτουργικό σύστημα, ποτέ δεν είναι ο αριθμός του φιλοξενούμενου, οπότε η έκθεση είναι μια σκόπιμη, ορατή διεύθυνση και όχι μια διεύθυνση που μπορεί να μαντέψει κανείς.
  • Παραμένει ιδιωτική (μόνο loopback) μέχρι να την ενεργοποιήσεις, και η διαδρομή ⋯ → Μόνο τοπικά την αφαιρεί ξανά από το δίκτυο.

Η διαδρομή ⋯ → Ορισμός τομέα περιηγητή (.test) εκχωρεί στη θύρα έναν τομέα ανάπτυξης, όπως myapp.test. Μέσα στον Περιηγητή (VM), το https://myapp.test φορτώνει τότε τον διακομιστή σου με έγκυρο λουκέτο — χρήσιμο για οτιδήποτε συμπεριφέρεται διαφορετικά σε ένα επώνυμο origin ή σε ασφαλές πλαίσιο (cookies, service workers, callbacks OAuth).

  • Οι τομείς πρέπει να τελειώνουν σε .test ή .localhost — τους δύο TLD που είναι δεσμευμένοι για ανάπτυξη, ώστε ένα όνομα ανάπτυξης να μην μπορεί ποτέ να επισκιάσει έναν πραγματικό ιστότοπο.
  • Τα ονόματα τομέων είναι μοναδικά στον διακομιστή· οι αριθμοί θυρών δεν είναι. Δύο χώροι μπορούν να χρησιμοποιούν και οι δύο τη 5173, αλλά δεν μπορούν να διεκδικήσουν και οι δύο το myapp.test.
  • Το πιστοποιητικό προέρχεται από μια τοπική αρχή έκδοσης πιστοποιητικών που παράγεται στον διακομιστή σου την πρώτη φορά που χρειάζεται. Τα κλειδιά της φιλοξενούνται στον κατάλογο δεδομένων του διακομιστή και δεν μπαίνουν ποτέ σε κανένα φιλοξενούμενο· ο περίκλειστος περιηγητής εμπιστεύεται ακριβώς αυτό το ένα κλειδί, οπότε το TLS προς το πραγματικό διαδίκτυο εξακολουθεί να επικυρώνεται κανονικά.
  • Ο τομέας επιλύεται μόνο μέσα στον Περιηγητή (VM). Ο δικός σου περιηγητής στον ξενιστή χρησιμοποιεί αντ’ αυτού localhost:<port>.
  • Το απλό http://myapp.test λειτουργεί επίσης.

Η Προσθήκη θύρας στο κάτω μέρος του πίνακα αντιστοιχίζει μια θύρα πριν (ή ανεξάρτητα από το αν) ακούει κάτι σε αυτήν. Μια χειροκίνητη προώθηση διατηρεί τη διεύθυνσή της όσο ο διακομιστής σου επανεκκινείται — η γραμμή δείχνει δεν ακούει μέχρι να επανέλθει — ενώ οι αυτόματες προωθήσεις εξαφανίζονται όταν εξαφανιστεί η θύρα τους. Σε ένα κέλυφος ξενιστή μπορείς επίσης να ορίσεις διαφορετική τοπική θύρα.

Οι θύρες κλειδώνονται ανά χώρο εργασίας και ανά χώρο. Ο ίδιος ο χάρτης θυρών του υπερεπόπτη είναι σταθερός όταν εκκινεί μια μηχανή, οπότε ένα Τερματικό (VM) ταξιδεύει σε δύο στενά κανάλια που ελέγχει ο διακομιστής: ένα προδημιουργημένο κανάλι εισερχόμενων προς το φιλοξενούμενο που αρνείται να συνδεθεί σε οποιαδήποτε θύρα δεν ακούει στην πραγματικότητα το φιλοξενούμενο, και αντίστροφες σήραγγες που ο διακομιστής κρατά ανοιχτές για τον Περιηγητή (VM) και το Android. Ένα κέλυφος ξενιστή δεν σαρώνει ποτέ ολόκληρη τη μηχανή. Κανένας ακροατής δεν δημιουργείται ποτέ μέσα σε ένα φιλοξενούμενο που δεν έβαλε εκεί ο διακομιστής, και τα πάντα καταστρέφονται μαζί με το τερματικό ή τον σταθμό. Ο σχεδιασμός εξηγείται στο Σταθμοί και περιβλήματα· οι ακριβείς δεσμευμένες θύρες και οι κανόνες τομέων βρίσκονται στην αναφορά σταθμών.