我试图连接到一个服务,并进行debugging,我跑了
netstat -nap | grep LISTEN
结果应该有两种types的行:
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进程只允许与其他本地进程进行通信。
2)“tcp 0”netstatlogging和“unix 2”logging有什么区别? 我有点天真的networking,所以随意超过这一个:)
1)您需要修改服务器以绑定到可公开访问的地址(或0.0.0.0)或运行本地代理来处理连接。
2)TCP连接使用TCP协议,即用于Internet上面向连接的流量的协议。 UNIX连接使用的严格本地协议比TCP简单得多(因为它不必处理丢包,路由丢失,数据损坏,无序包等等)。
简而言之,您的进程绑定到一个无法接收来自外部网络的数据包的环回接口。 您将需要重新配置绑定到端口8020的进程绑定到一个外部接口,以便能够从另一个主机连接到它。
漫长的回答是,你站点的两个地址(127.0.0.1和0.0.0.0)在某些方面都是特殊的,理解你所看到的是有用的。
127.0.0.0/8互联网协议地址块中的地址(127.0.0.1是其中的一个)保留在主机内部使用。 有关详细信息,请参阅rfc5735 ,但是除了所有IP主机使用相同的规则,并没有设置将这些地址路由到主机或路由器之外,这些地址没有什么特别之处。
在你的计算机上,你通常会看到一个特殊的“loopback”网络接口,它被分配了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来侦听连接。
但是,在你的情况下,你报告的netstat输出列表0.0.0.0描述了处于LISTEN状态的TCP套接字。 在这种情况下,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)不绑定到0.0.0.0,仍然可以通过隧道访问服务。 这与David Schwartz提到的使用代理类似。 我为这个例子做了一些假设:
在客户端上,使用以下命令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将客户端上的侦听套接字通过隧道传输到服务器上的侦听套接字。 为了清楚起见,我已经使端口号不同。
1)你不能(如果你的意思是从另一台机器 – 127.0.0.1是本地主机,根据定义,你只能从本地机器连接到它
2)第一列显示了套接字的域 – tcp是tcp套接字,而unix是unix域套接字。
至于你的问题的答案3 😉
3)42