如何从外部连接到运行在127.0.0.1(而不是0.0.0.0)上的服务?

时间:2011-10-31 02:49:20

标签: linux networking tcp

我正在尝试连接服务,并进行调试,我跑了

netstat -nap | grep LISTEN

结果应该是两种类型的行:

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   -                   

我有3个问题:

1)我想连接到127.0.0.1上运行的进程---如何在外部执行此操作?我在别处读过127.0.0.1进程只允许与其他localhost进程通信。

2)“tcp 0”netstat记录与“unix 2”记录有什么区别?我有点天真的网络,所以随意过度解释这个:)

4 个答案:

答案 0 :(得分:8)

简而言之,您的进程绑定到无法从外部网络接收数据包的环回接口。您需要重新配置绑定到端口8020的进程以绑定到外部接口,以便能够从另一个主机连接到该外部接口。

答案很长,你站点的两个地址(127.0.0.1和0.0.0.0)在某些方面都很特殊,而且了解你所看到的内容很有用。

127.0.0.0/8 Internet协议地址块(其中127.0.0.1为1)中的地址保留在主机内部使用。有关详细信息,请参阅rfc5735,但除了所有IP主机使用相同的规则并且未设置为在主机或路由器外部路由这些地址之外,这些地址没有什么特别之处。

在您的计算机上,您通常会看到一个特殊的“环回”网络接口,该接口已分配127.0.0.1。

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

此接口很特殊,从不连接到外部网络。当程序想要连接到本地计算机上的服务时使用它,因为127.0.0.1几乎总是被配置为活动网络接口。只有从本地进程发送数据包时,数据包才会到达此接口。

您站点的其他地址0.0.0.0是特殊的,通常表示映射到计算机上任何网络接口的所有IP地址。当程序想要侦听到达任何网络接口或IP地址的连接时,它会将TCP / UDP端口绑定到0.0.0.0以侦听连接。

但是,在您的情况下,您在描述处于LISTEN状态的TCP套接字的行上报告netstat输出列表0.0.0.0。在这种情况下,netstat列出了侦听连接的套接字,并使用0.0.0.0:*作为其输出的外部地址字段的占位符。在这种情况下,0.0.0.0:*表示套接字正在等待来自任何主机的连接。

关于“tcp 0”与“unix 2”的问题,这些是netstat输出的前两列。查看netstat命令中的列标题非常有用:

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

您报告的内容为“tcp 0”仅表示使用TCP协议的套接字在接收队列中具有零字节,等待连接到此套接字的程序使用。类似地,“unix 2”是所谓的unix套接字,其两个字节在其接收队列中等待连接进程使用。

TCP套接字是TCP / IP堆栈的一部分,可以在本地或跨IP网络使用,以便进行通信。另一方面,UNIX套接字更简单,仅用于所谓的IPC或进程间通信,这只发生在本地系统上运行的两个进程之间,并且不涉及网络(无论如何都没有地址和端口)。 UNIX套接字被认为比TCP套接字更有效,但它们在功能上显然更受限制。在类UNIX系统上,UNIX套接字在一个特殊“套接字”类型的文件系统上实现,该套接字使用套接字读写作为通信通道。

答案 1 :(得分:4)

1)如果不将其绑定到0.0.0.0,您仍然可以通过隧道访问服务。这与David Schwartz提到的使用代理类似。我正在为这个例子做一些假设:

  1. 服务器正在运行绑定到127.0.0.1:8020的服务,我们称之为'myservice'。
  2. 服务器在默认端口TCP 22上运行OpenSSH服务器'sshd',用户可以使用用户名'myusername'登录。
  3. 客户端正在运行安装了OpenSSH客户端的系统。
  4. 可通过IP地址10.20.30.40访问服务器。
  5. 在客户端上,使用以下命令通过SSH连接到服务器:

    ssh -L 12345:localhost:8020 myusername@10.20.30.40
    

    登录后,最小化SSH窗口。在客户端的另一个窗口中,运行netstat以查找侦听端口。您应该看到127.0.0.1:12345,就像在服务器上一样。

    在客户端上,连接到127.0.0.1:12345上的服务。您现在应该连接到服务器上的“myservice”实例,即使您已连接到客户端的本地环回接口。

    这里的技巧是SSH将客户端上的侦听套接字隧道连接到服务器上的侦听套接字。为清晰起见,我将端口号设置为不同。

答案 2 :(得分:2)

1)您需要修改服务器以绑定到可公开访问的地址(或0.0.0.0)或运行本地代理来处理连接。

2)TCP连接使用TCP协议,该协议用于Internet上面向连接的流量。 UNIX连接使用严格的本地协议,它比TCP简单得多(因为它不必处理丢弃的数据包,丢失的路由,损坏的数据,乱序数据包等)。

答案 3 :(得分:2)

1)您不能(如果您的意思是来自另一台机器 - 127.0.0.1是localhost,根据定义,您只能从本地计算机连接到它

2)第一列显示套接字的域名 - tcp是tcp套接字,unix是unix域套接字。

至于问题3的答案; - )

3)42