2011-10-31 17 views
5

Sto provando a connettermi a un servizio e per eseguire il debug, ho eseguitoCome posso connettermi esternamente a un servizio in esecuzione su 127.0.0.1 (anziché su 0.0.0.0)?

netstat -nap | grep LISTEN

I risultati dovrebbero file di due tipi:

tcp 0 0 127.0.0.1:8020 0.0.0.0:*  LISTEN  
tcp 0 0 0.0.0.0:57140 0.0.0.0:*  LISTEN  
tcp 0 0 0.0.0.0:11000 0.0.0.0:*  LISTEN  
tcp 0 0 0.0.0.0:8088 0.0.0.0:*  LISTEN 
unix 2 [ ACC ] STREAM LISTENING  4512 -     
unix 2 [ ACC ] STREAM LISTENING  9760 -     

ho 3 domande:

1) Voglio connettersi al processo in esecuzione sul 127.0.0.1 --- come posso farlo esternamente? Ho letto altrove che i processi 127.0.0.1 sono autorizzati a comunicare solo con altri processi localhost.

2) Qual è la differenza tra i record netstat "tcp 0" e quelli "unix 2"? Sono un po 'ingenuo sul networking, quindi sentitevi liberi di sovrascrivere questo :)

risposta

2

1) Dovreste o modificare il server per collegarlo a un indirizzo pubblicamente accessibile (o 0.0.0.0) o eseguire un proxy locale per gestire il connessione.

2) Le connessioni TCP utilizzano il protocollo TCP, quello utilizzato per il traffico orientato alla connessione su Internet. Le connessioni UNIX usano un protocollo strettamente locale che è molto più semplice di TCP (perché non ha a che fare con pacchetti scartati, percorsi persi, dati corrotti, pacchetti fuori ordine e così via).

+0

Che cos'è una "connessione unix"? – jayunit100

+2

Si tratta di una connessione che utilizza un protocollo strettamente locale molto più semplice di TCP.Fornisce all'incirca lo stesso comportamento di TCP, tranne che può essere utilizzato solo quando entrambi gli endpoint si trovano sulla stessa macchina. –

+0

Intendi un socket di dominio Unix? Qual è una cosa diversa da 127.0.0.1? E cosa c'entra questo con la domanda? – EJP

2

1) Non è possibile (se si intende da un altro computer - 127.0.0.1 è localhost e, per definizione, è possibile connettersi solo dalla macchina locale

2) La prima colonna mostra il dominio delle prese - tcp sono socket tcp e unix sono socket di dominio unix.

E per quanto riguarda la risposta alla domanda 3 si ;-)

3) 42

7

In breve, il processo è legato ad un'interfaccia di loopback che non può ricevere pacchetti da una rete esterna. Dovrai riconfigurare il processo associato alla porta 8020 per collegarlo a un'interfaccia esterna per potersi connettere da un altro host.

La risposta lunga è che i due indirizzi del sito (127.0.0.1 e 0.0.0.0) sono entrambi speciali in determinati modi, ed è utile capire cosa stai vedendo.

Gli indirizzi nel blocco indirizzo del protocollo Internet 127.0.0.0/8 (di cui 127.0.0.1 è uno) sono riservati per l'uso interno su un host. Vedere rfc5735 per i dettagli, ma non c'è nulla di speciale su questi indirizzi, tranne che tutti gli host IP usano le stesse regole e non sono configurati per instradare questi indirizzi all'esterno di un host o router.

Sul computer, di solito viene visualizzata un'interfaccia di rete "loopback" speciale assegnata a 127.0.0.1.

lo  Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0 

Questa interfaccia è speciale e mai connessa a una rete esterna. Viene utilizzato quando un programma desidera connettersi a un servizio sul computer locale poiché 127.0.0.1 viene quasi sempre configurato come un'interfaccia di rete attiva. I pacchetti arriveranno su questa interfaccia solo se inviati da un processo locale.

L'altro indirizzo del sito, 0.0.0.0 è speciale e di solito rappresenta tutti gli indirizzi IP associati a qualsiasi interfaccia di rete sul tuo computer. Quando un programma vuole ascoltare le connessioni che arrivano su qualsiasi interfaccia di rete o indirizzo IP, vincolerà una porta TCP/UDP a 0.0.0.0 per ascoltare le connessioni.

Nel tuo caso, tuttavia, stai segnalando l'output di netstat che elenca 0.0.0.0 su righe che descrivono socket TCP in uno stato LISTEN. In questo caso, netstat elenca i socket che ascoltano le connessioni e utilizza 0.0.0.0:* come segnaposto per il campo di indirizzo esterno del suo output. In questo caso, 0.0.0.0:* significa che il socket è in attesa di una connessione da qualsiasi host.

Per quanto riguarda la domanda su "tcp 0" e "unix 2", queste sono le prime due colonne del proprio output netstat. Uno sguardo alle intestazioni delle colonne dal vostro comando netstat è utile:

# netstat -nap | head -2 
Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address    Foreign Address    State  PID/Program name 

Cosa stai segnalando come "tcp 0" significa semplicemente una presa di corrente utilizzando il protocollo TCP ha zero byte nella coda ricevuto attesa per il programma collegato a questa presa da consumare. Allo stesso modo, "unix 2" è quello che viene chiamato un socket unix con due byte in attesa nella coda di ricezione per il processo connesso a consumare.

I socket TCP fanno parte dello stack TCP/IP che può essere utilizzato localmente o attraverso reti IP affinché i processi possano comunicare. I socket UNIX, d'altra parte, sono più semplici e vengono utilizzati solo per ciò che viene chiamato IPC o comunicazione tra processi che avviene solo tra due processi in esecuzione sul sistema locale, e non c'è nessuna connessione in rete (nessun indirizzo e nessuna porta). I socket UNIX sono considerati più efficienti dei socket TCP, ma sono ovviamente più limitati nella loro funzione. Sui sistemi UNIX i socket UNIX sono implementati come file sul file system di uno speciale tipo "socket" che entrambi utilizzano il socket read e write come canale di comunicazione.

3

1) Senza vincolare a 0.0.0.0, è ancora possibile accedere al servizio attraverso un tunnel. Questo è simile all'utilizzo di un proxy come menzionato da David Schwartz. Ci sono alcune supposizioni che sto facendo per questo esempio:

  1. Il server sta eseguendo un servizio associato a 127.0.0.1:8020, lo chiameremo "myservice".
  2. Il server sta eseguendo il server OpenSSH 'sshd' sulla porta predefinita di TCP 22 e l'utente può accedere con lo username 'myusername'.
  3. Il client esegue un sistema con il client OpenSSH installato.
  4. Il server è accessibile tramite l'indirizzo IP 10.20.30.40.

Sul client, SSH al server con il seguente comando:

ssh -L 12345:localhost:8020 [email protected] 

Una volta che si accede, a ridurre al minimo la finestra di SSH. In un'altra finestra del client, eseguire netstat per trovare le porte di ascolto. Dovresti vedere 127.0.0.1:12345, proprio come sul server.

Sul client, connettersi al servizio su 127.0.0.1:12345. Ora dovresti essere connesso all'istanza 'myservice' sul server, anche se hai effettuato la connessione all'interfaccia di loopback locale del client.

Il trucco qui è che SSH sta eseguendo il tunneling di una presa di ascolto sul client alla presa di ascolto sul server. Ho reso i numeri di porta diversi per chiarezza.

Problemi correlati