是否可以 ping 地址:端口?

And*_*ili 232 networking linux ping

我不喜欢网络,我有以下与 Linux ping命令相关的问题。

我只能ping一个地址吗?例如:

miner@raspberrypi ~ $ ping onofri.org
PING onofri.org (67.222.36.105) 56(84) bytes of data.
64 bytes from onofri.org (67.222.36.105): icmp_req=1 ttl=47 time=202 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=2 ttl=47 time=206 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=3 ttl=47 time=215 ms
Run Code Online (Sandbox Code Playgroud)

或者我也可以 ping 一个address:port,例如:onofri.org:80

如果我尝试这个它不起作用:

miner@raspberrypi ~ $ ping onofri.org:80
ping: unknown host onofri.org:80
Run Code Online (Sandbox Code Playgroud)

是否可以 ping 之类的地址:端口?如果可能,为什么我尝试的方法不起作用?

Ben*_*ebe 322

端口是UDPTCP的概念。Ping 消息在技术上称为ICMP Echo RequestICMP Echo Reply,它们是ICMP 的一部分。ICMP、TCP 和 UDP 是“兄弟”;它们不是基于彼此,而是运行在 IP 之上的三个独立协议。

因此你不能ping一个端口。你可以做的是使用像nmap.

nmap -p 80 onofri.org
Run Code Online (Sandbox Code Playgroud)

您也可以使用telnet onofri.org 80其他答案之一中的建议(如果端口已关闭或过滤,则会出现错误)。

  • +1 你理解正确。ICMP 建立在 IP 之上,IP 有 IP 地址的概念,但没有端口的概念。TCP 和 UDP 也位于 IP 之上,并且是那些添加“端口”的协议。ICMP、TCP 和 UDP 就它们所承载的协议而言都处于同一“级别”。 (26认同)
  • +1。很多很多人认为,如果他们无法 ping 某些东西,他们就无法连接到它……但是正如您所说,ICMP 与 TCP 和 UDP 不同:如果您打算提供服务,例如,TCP 80 上的网页,比你只需要在防火墙上打开 TCP 80,没有别的(所以 Ping 到同一个 IP 可以(......应该!)被阻止,例如) (14认同)
  • 为了保持信息准确,ICMP 不是像 TCP 或 UDP 那样的传输层协议。像许多协议一样,它并不完全适合网络概念模型,但它通常被认为是网络/互联网层协议,IP 也是如此。它有时也被称为 L3.5 协议。 (6认同)
  • @OlivierDulac 我不知道你是否应该**阻止它。我认识的大多数网络服务器都将其打开。ICMP 使互联网运转起来。为什么你希望人们认为如果他们可以联系到你,他们就无法联系到你? (4认同)
  • @BenjiWiebe,同意,但同样,为了准确起见,应该做出声明,这就是我添加它的原因。到目前为止所说的只是 ICMP、TCP 和 UDP 是相关的。投票最高的评论甚至可以说它们都处于同一“水平”。虽然这对普通用户没有影响,但仍有大量非普通用户访问此站点。 (2认同)

Fra*_*mas 92

我使用Telnet,因为它内置于许多平台中,无需额外下载。

只需使用 telnet 命令连接到您要测试的端口即可。如果您收到以下消息或来自服务本身的消息,则该端口处于活动状态。

Minty16 ~ $ telnet localhost 139
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Run Code Online (Sandbox Code Playgroud)

如果您知道要连接的服务的命令序列,则可以键入命令(例如HTTP/FTP GET)并观察终端中的响应和输出。这对于测试服务本身非常有用,因为它会向您显示发送到客户端的错误信息,例如 HTTP 500 错误。

如果您收到连接被拒绝的消息,则端口已关闭。

Minty16 ~ $ telnet localhost 5000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Run Code Online (Sandbox Code Playgroud)

  • 此外,如果屏幕完全变黑,则表明您也已连接。 (8认同)

d33*_*tah 51

是的,使用HPing来做到这一点:

$ sudo hping -S -p 80 google.com
HPING google.com (p5p1 77.237.27.37): S set, 40 headers + 0 data bytes
len=46 ip=77.237.27.37 ttl=58 id=25706 sport=80 flags=SA seq=0 win=29200 rtt=7.5 ms
len=46 ip=77.237.27.37 ttl=58 id=25707 sport=80 flags=SA seq=1 win=29200 rtt=7.4 ms
len=46 ip=77.237.27.37 ttl=58 id=25708 sport=80 flags=SA seq=2 win=29200 rtt=8.5 ms
len=46 ip=77.237.27.37 ttl=58 id=25709 sport=80 flags=SA seq=3 win=29200 rtt=7.8 ms
^C
--- google.com hping statistic ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 7.4/7.8/8.5 ms
Run Code Online (Sandbox Code Playgroud)

请注意,它需要 root 权限(或 SELinux 功能)来创建原始 IP 数据包,就像 ping(这很可能是您系统上的 suid)。

  • 我希望这是“接受的答案”。hping 在多个 repos 中很容易找到,不像 paping 是古老的笨拙代码,不能在 ARM 上编译。同样与 NMAP 不同的是,haping 返回一个可以从 shell 脚本中轻松测试的状态代码,因此它是您在其他情况下使用 ping 的完美替代品。感谢您的回答,很遗憾我没有向下滚动到足够远的地方才能看到它,而不得不在另一个网站上找到它。 (3认同)

Fal*_*mes 50

您可以使用 netcat 连接到特定端口以查看是否获得连接。-v 标志将增加详细程度以显示端口是打开还是关闭。-z 标志将导致 netcat 在建立连接后退出。然后您可以通过 $? 查看连接是否建立。

$ nc -zv localhost 22
localhost [127.0.0.1] 22 (ssh) open
$ echo $?
0
$ nc -zv localhost 23
localhost [127.0.0.1] 23 (telnet) : Connection refused
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

此外,您可以将 mtr 与 tcp 的 -T 标志和 -P 标志一起使用来指定端口。这将执行类似于 TCP 上的跟踪路由,而不仅仅是 ICMP。然而,这可能是矫枉过正。

叹息 我必须编辑以添加这一点,因为我们不能将代码放在注释中。Knoppix 可能正在用它的 netcat 版本做一些不同的事情,但这就是我从 Linux Mint 中得到的

$ date;nc -z -w 1 www.google.com 8000;date
Fri Jun 20 15:55:26 PDT 2014
Fri Jun 20 15:55:27 PDT 2014
$ date;nc -z -w 4 www.google.com 8000;date
Fri Jun 20 15:55:33 PDT 2014
Fri Jun 20 15:55:37 PDT 2014

$ nc -h
[v1.10-40]
Run Code Online (Sandbox Code Playgroud)


小智 25

您可以使用Paping,一个跨平台的 TCP 端口测试,模拟 ping(端口 ping)的功能

(另请参阅Github,因为 code.google.com 已折旧)

paping -p 80 google.com
Run Code Online (Sandbox Code Playgroud)

  • 对于任何找到这个答案的人,就像我一样,只是发现 paping 不在任何存储库中,并且是甚至无法在 ARM 上编译的古老代码 - 进一步向下滚动到“hping”答案。当您需要测试端口时,它是 ping 的完美替代品,并且可以在包括 ARM 在内的各种存储库(即 Ubuntu、Arch)中轻松访问。 (23认同)
  • 对这个程序的作用的一些解释会有所帮助。 (8认同)

nyu*_*a7h 21

您还可以使用nping(部分nmap):

$ nping -p 80 localhost

Starting Nping 0.6.00 ( http://nmap.org/nping ) at 2014-06-23 11:57 CEST
SENT (0.0015s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (0.0016s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (1.0027s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (1.0027s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (2.0038s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (2.0039s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (3.0050s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (3.0050s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (4.0061s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (4.0062s) Handshake with localhost:80 (127.0.0.1:80) completed

Max rtt: 0.032ms | Min rtt: 0.008ms | Avg rtt: 0.012ms
TCP connection attempts: 5 | Successful connections: 5 | Failed: 0 (0.00%)
Tx time: 4.00575s | Tx bytes/s: 99.86 | Tx pkts/s: 1.25
Rx time: 4.00575s | Rx bytes/s: 49.93 | Rx pkts/s: 1.25
Nping done: 1 IP address pinged in 4.01 seconds
Run Code Online (Sandbox Code Playgroud)

  • `nping --tcp -p 80 本地主机` (6认同)

AXE*_*abs 10

您可以在 shell 中使用 Python 作为一个不那么短的衬里来执行此操作:

$ portping() { python <<<"import socket; socket.setdefaulttimeout(1); socket.socket().connect(('$1', $2))" 2> /dev/null && echo OPEN || echo CLOSED; }
$ portping 8.8.8.8 54
CLOSED
$ portping 8.8.8.8 53
OPEN
Run Code Online (Sandbox Code Playgroud)


小智 8

仅供参考,想分享一个 Vivek Gite 的帖子:https : //www.cyberciti.biz/faq/ping-test-a-specific-port-of-machine-ip-address-using-linux-unix/#评论-920398

他列出了各种方法,其中一些已经张贴在这里。但对我来说最令人惊讶的是bash

(echo >/dev/tcp/{host}/{port}) &>/dev/null && echo "opened" || echo "closed"
(echo >/dev/udp/{host}/{port}) &>/dev/null && echo "opened" || echo "closed"
(echo >/dev/tcp/www.cyberciti.biz/22) &>/dev/null && echo "Opened 22" || echo "Closed 22"
(echo >/dev/tcp/www.cyberciti.biz/443) &>/dev/null && echo "Opened 443" || echo "Closed 443"
Run Code Online (Sandbox Code Playgroud)

或者一个超级简单的版本:只需查看以下命令模式的输出:

echo >/dev/{tcp|udp}/{host}/{port}
Run Code Online (Sandbox Code Playgroud)

在使用随机 docker 容器时很有用。