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

jay*_*100 7 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   -                   
Run Code Online (Sandbox Code Playgroud)

我有3个问题:

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

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

big*_*ian 8

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

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

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

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

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
Run Code Online (Sandbox Code Playgroud)

此接口是特殊的,从不连接到外部网络.当程序想要连接到本地计算机上的服务时使用它,因为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 
Run Code Online (Sandbox Code Playgroud)

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

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


Col*_*lau 5

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访问该服务器。

在客户端上,使用以下命令SSH到服务器:

ssh -L 12345:localhost:8020 myusername@10.20.30.40
Run Code Online (Sandbox Code Playgroud)

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

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

这里的窍门是SSH将客户端上的侦听套接字传输到服务器上的侦听套接字。为了清楚起见,我将端口号设置为不同。


Dav*_*rtz 2

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

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

  • 它是使用严格本地协议的连接,比 TCP 简单得多。它提供与 TCP 大致相同的行为,但它只能在两个端点位于同一台计算机上时使用。 (2认同)