检测服务端口是否开放的常用方法
文章目录
- 检测服务端口是否开放的常用方法
- 背景
- 使用`nc`命令
- 使用 `telnet` 命令
- 使用 `curl` 命令
- 使用 `openssl` 命令
- 使用 Python 脚本,socket连接
- 使用 `bash` 内建命令:
- 使用 `nmap`:
- 总结
背景
有时候需要测试网络是否连通,端口是否开放,需要用一些常用的命令来测试. 有时候并没有 telnet , nc 这样的命令 ,我们使用其他办法来测试 ,当然这里提供的方法 也仅供参考,根据服务器的情况来选择 不同的命令来测试 。下面总结一下 一些常用的命令 来方便策驰网络连通性的命令。
使用nc
命令
nc -zv ip port
nc -zv domain port
~/ nc -zv baidu.com 443
Connection to baidu.com port 443 [tcp/https] succeeded!
~/
如果成功 会返回 相应的信息
使用 telnet
命令
telnet [主机名或IP地址] [端口号]
~/ telnet baidu.com 80
Trying 110.242.68.66...
Connected to baidu.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
上面显示 是成功状态
~/ telnet baidu.com 81
Trying 39.156.66.10...
Connection failed: Operation timed out
Trying 110.242.68.66...
上面显示是失败状态 。
使用 curl
命令
如果服务器上有 curl
,你可以尝试用它来测试HTTPS端口(443)或HTTP端口(80)。对于6443端口,如果这是一个HTTPS服务的非标准端口,你可以这样做:
curl -v http://ip:port
curl -v https://ip:port
curl -v https://172.19.127.13:6443
-v
选项会显示详细的输出,包括连接过程中的信息,这有助于判断端口是否开放。
curl -v https://172.19.127.13:6443
* About to connect() to 172.19.127.13 port 6443 (#0)
* Trying 172.19.127.13...
* Connected to 172.19.127.13 (172.19.127.13) port 6443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* Server certificate:
* subject: CN=kube-apiserver-c85ad7b2e9eb242b1ac68840c6101b85b
* start date: Sep 05 06:25:00 2024 GMT
* expire date: Aug 29 06:25:00 2054 GMT
* common name: kube-apiserver-c85ad7b2e9eb242b1ac68840c6101b85b
* issuer: CN=kubernetes,O=hangzhou+O=alibaba cloud
* NSS error -8172 (SEC_ERROR_UNTRUSTED_ISSUER)
* Peer's certificate issuer has been marked as not trusted by the user.
* Closing connection 0
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn't adequate, you can specify an alternate file
using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
the -k (or --insecure) option.
使用 openssl
命令
如果端口443是为TLS/SSL服务(如HTTPS、SMTPS等)使用的,你可以使用 openssl
来测试连接:
openssl s_client -connect www.baidu.com:443
使用 openssl s_client 测试端口是否开放是可行的,但前提是目标端口运行的是 SSL/TLS 服务
openssl s_client -connect www.baidu.com:443
CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
verify return:1
depth=0 C = CN, ST = beijing, L = beijing, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.com
verify return:1
---
Certificate chain
0 s:C = CN, ST = beijing, L = beijing, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.com
i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Jul 8 01:41:02 2024 GMT; NotAfter: Aug 9 01:41:01 2025 GMT
1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Nov 21 00:00:00 2018 GMT; NotAfter: Nov 21 00:00:00 2028 GMT
2 s:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Sep 19 00:00:00 2018 GMT; NotAfter: Jan 28 12:00:00 2028 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIJ7DCCCNSgAwIBAgIMTkADpl62gfh/S9jrMA0GCSqGSIb3DQEBCwUAMFAxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSYwJAYDVQQDEx1H
bG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODAeFw0yNDA3MDgwMTQxMDJaFw0y
NTA4MDkwMTQxMDFaMIGAMQswCQYDVQQGEwJDTjEQMA4GA1UECBMHYmVpamluZzEQ
MA4GA1UEBxMHYmVpamluZzE5MDcGA1UEChMwQmVpamluZyBCYWlkdSBOZXRjb20g
U2NpZW5jZSBUZWNobm9sb2d5IENvLiwgTHRkMRIwEAYDVQQDEwliYWlkdS5jb20w
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1wFMskJ2dseOqoHptNwot
FOhdBERsZ4VQnRNKXEEXMQEfgbNtScQ+C/Z+IpRAt1EObhYlifn74kt2nTsCQLng
jfQkRVBuO/6PNGKdlCYGBeGqAL7xR+LOyHnpH9mwCBJc+WVt2zYM9I1clpXCJa+I
tsq6qpb1AGoQxRDZ2n4K8Gd61wgNCPHDHc/Lk9NPJoUBMvYWvEe5lKhHsJtWtHe4
QC3y58Vi+r5R0PWn2hyTBr9fCo58p/stDiRqp9Irtmi95YhwkNkmgwpMB8RhcGoN
h+Uw5TkPZVj4AVaoPT1ED/GMKZev0+ypmp0+nmjVg2x7yUfLUfp3X7oBdI4TS2hv
AgMBAAGjggaTMIIGjzAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADCBjgYI
KwYBBQUHAQEEgYEwfzBEBggrBgEFBQcwAoY4aHR0cDovL3NlY3VyZS5nbG9iYWxz
aWduLmNvbS9jYWNlcnQvZ3Nyc2FvdnNzbGNhMjAxOC5jcnQwNwYIKwYBBQUHMAGG
K2h0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2dzcnNhb3Zzc2xjYTIwMTgwVgYD
VR0gBE8wTTBBBgkrBgEEAaAyARQwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cu
Z2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQICMD8GA1UdHwQ4MDYw
NKAyoDCGLmh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vZ3Nyc2FvdnNzbGNhMjAx
OC5jcmwwggNhBgNVHREEggNYMIIDVIIJYmFpZHUuY29tggxiYWlmdWJhby5jb22C
DHd3dy5iYWlkdS5jboIQd3d3LmJhaWR1LmNvbS5jboIPbWN0LnkubnVvbWkuY29t
ggthcG9sbG8uYXV0b4IGZHd6LmNuggsqLmJhaWR1LmNvbYIOKi5iYWlmdWJhby5j
b22CESouYmFpZHVzdGF0aWMuY29tgg4qLmJkc3RhdGljLmNvbYILKi5iZGltZy5j
b22CDCouaGFvMTIzLmNvbYILKi5udW9taS5jb22CDSouY2h1YW5rZS5jb22CDSou
dHJ1c3Rnby5jb22CDyouYmNlLmJhaWR1LmNvbYIQKi5leXVuLmJhaWR1LmNvbYIP
Ki5tYXAuYmFpZHUuY29tgg8qLm1iZC5iYWlkdS5jb22CESouZmFueWkuYmFpZHUu
Y29tgg4qLmJhaWR1YmNlLmNvbYIMKi5taXBjZG4uY29tghAqLm5ld3MuYmFpZHUu
Y29tgg4qLmJhaWR1cGNzLmNvbYIMKi5haXBhZ2UuY29tggsqLmFpcGFnZS5jboIN
Ki5iY2Vob3N0LmNvbYIQKi5zYWZlLmJhaWR1LmNvbYIOKi5pbS5iYWlkdS5jb22C
EiouYmFpZHVjb250ZW50LmNvbYILKi5kbG5lbC5jb22CCyouZGxuZWwub3JnghIq
LmR1ZXJvcy5iYWlkdS5jb22CDiouc3UuYmFpZHUuY29tgggqLjkxLmNvbYISKi5o
YW8xMjMuYmFpZHUuY29tgg0qLmFwb2xsby5hdXRvghIqLnh1ZXNodS5iYWlkdS5j
b22CESouYmouYmFpZHViY2UuY29tghEqLmd6LmJhaWR1YmNlLmNvbYIOKi5zbWFy
dGFwcHMuY26CDSouYmR0anJjdi5jb22CDCouaGFvMjIyLmNvbYIMKi5oYW9rYW4u
Y29tgg8qLnBhZS5iYWlkdS5jb22CESoudmQuYmRzdGF0aWMuY29tghEqLmNsb3Vk
LmJhaWR1LmNvbYISY2xpY2suaG0uYmFpZHUuY29tghBsb2cuaG0uYmFpZHUuY29t
ghBjbS5wb3MuYmFpZHUuY29tghB3bi5wb3MuYmFpZHUuY29tghR1cGRhdGUucGFu
LmJhaWR1LmNvbTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0j
BBgwFoAU+O9/8s14Z6jeb48kjYjxhwMCs+swHQYDVR0OBBYEFK3KAFTK2OWUto+D
2ieAKE5ZJDsYMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdgCvGBoo1oyj4KmK
TJxnqwn4u7wiuq68sTijoZ3T+bYDDQAAAZCQAGzzAAAEAwBHMEUCIFwF5Jc+zyIF
Gnpxchz9fY1qzlqg/oVrs2nnuxcpBuuIAiEAu3scD6u51VOP/9aMSqR2yKHZLbHw
Fos9U7AzSdLIZa8AdgAS8U40vVNyTIQGGcOPP3oT+Oe1YoeInG0wBYTr5YYmOgAA
AZCQAG3iAAAEAwBHMEUCIBBYQ6NP7VUDgfktWRg5QxT23QAbTqYovtV2D9O8Qc0T
AiEA2P7+44EvQ5adwL1y56oyxv/m+Gujeia7wpo7+Xbhv6MAdwAN4fIwK9MNwUBi
EgnqVS78R3R8sdfpMO8OQh60fk6qNAAAAZCQAGy+AAAEAwBIMEYCIQDU7Hxtx4c9
p9Jd+cr+DCMtyRYSc0b8cktCcbMmtDE9ygIhAIpJd4yb7jtxnaEC8oLWDushbK1v
0BIuZu6YrQvsf1nQMA0GCSqGSIb3DQEBCwUAA4IBAQCh9DfewC012/+fHZpmSpCn
y+h3/+ClAZ8cJVO+LCmYz9r6bkyhcFquJ5qUpyoW8AYtU0oUFlqH6zLIyujW+7lq
wFxB6NsXKKdwBKmMbmnZr2Fca5f+TtwD/GDJgG/egr7fI1u8194j9KEl8cK8Fujm
+UsoWklEzd1It9xkLazJR/6SwbhSR4k610pvj8rQrS4wAewuYFDaDOfqsHtDIsx1
tZfIfoB/O1wGWZQJU2M9wC8uYq0jQ2Q0MQJXuyJz04MFiGrPAS1Uk8mWd8M+3p65
Xy4iAf8uWzs1M+fcwBE8BNBghkQgE+FSUsldm+5ZBCazU0joJswzldWisXMLTagI
-----END CERTIFICATE-----
subject=C = CN, ST = beijing, L = beijing, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.com
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 5414 bytes and written 445 bytes
Verification error: unable to get local issuer certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 6A43A459770A4FC6918EA7BFF3004ECFB94F6960911314356A048A2AF074998B
Session-ID-ctx:
Master-Key: 2370DEA3AACC0D869E337B8B99C80C44A190B31AB9F2DEE58CD16F0CE1EA8AC0E23CB0063A0587099EF2F5F557417EC8
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket:
0000 - cc 95 13 98 05 87 6f 12-cd de d9 e9 cc e0 cc f7 ......o.........
0010 - 0e 0a 9d 46 76 4b d9 a0-8d da be 48 7a 69 cb cc ...FvK.....Hzi..
0020 - 00 b7 2e 5f e9 c9 08 0a-05 57 f9 8d 8c 8c 7a 3d ..._.....W....z=
0030 - 77 45 fd 6c fa 59 0e 35-b1 35 a7 58 2e 02 e5 eb wE.l.Y.5.5.X....
0040 - 35 af 92 ad 62 58 88 12-39 ed 02 fd 25 c5 e4 89 5...bX..9...%...
0050 - 7e 8a bf 9e 87 02 4b d7-39 be c7 fc 09 27 7e 5d ~.....K.9....'~]
0060 - c6 af 8d 48 13 f1 97 fe-58 fa 4b 17 01 77 f5 4d ...H....X.K..w.M
0070 - d4 fd 1d b6 01 69 83 2d-df e7 c3 a3 45 eb c5 f9 .....i.-....E...
0080 - 9c 50 cd f6 60 41 d5 44-cb ce 2a 3a af 08 92 c9 .P..`A.D..*:....
0090 - 11 d0 d5 39 f9 be c0 60-3f 2f 59 bf 71 a0 76 d7 ...9...`?/Y.q.v.
Start Time: 1740298678
Timeout : 7200 (sec)
Verify return code: 20 (unable to get local issuer certificate)
Extended master secret: no
---
HTTP/1.1 400 Bad Request
closed
-
命令成功连接到目标服务器(
CONNECTED(00000003)
),说明目标端口(443)是开放的。使用 Python 脚本,socket连接
如果服务器上安装了Python,你可以编写一个简单的Python脚本来测试端口连接。以下是一个Python3的例子:
import socket def check_tcp_port(ip, port, timeout=5): """ 检查指定的 TCP 端口是否开放。 参数: - ip (str): 目标主机的 IP 地址。 - port (int): 要检查的端口号。 - timeout (int): 设置超时时间(秒),默认为 5 秒。 返回值: - 如果端口开放,返回 True;否则返回 False。 """ try: # 创建一个 TCP 套接字 # socket.SOCK_STREAM:表示使用 TCP 协议(面向连接的流式协议) # socket.AF_INET:表示使用 IPv4 协议 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.settimeout(timeout) # 设置超时时间 result = sock.connect_ex((ip, port)) # 尝试连接目标地址和端口 if result == 0: print(f"端口 {port} 是开放的") return True else: print(f"端口 {port} 可能被关闭或无法访问") return False except Exception as e: # 捕获异常并打印错误信息 print(f"发生错误: {e}") return False # 示例调用 if __name__ == "__main__": target_ip = '139.xxx.xxx.235' target_port = 22 is_open = check_tcp_port(target_ip, target_port) if is_open: print(f"端口状态:{target_port} 开放") else: print("端口状态:关闭或不可访问")
使用
bash
内建命令:您也可以利用 bash 的
/dev/tcp
功能来检查端口(请注意,这种方法在某些版本的 bash 中可能不工作,例如在基于 BusyBox 的系统中):timeout 5 bash -c "echo > /dev/tcp/172.19.127.13/6443" && echo "端口6443是开放的" || echo "端口6443可能被关闭或无法访问"
timeout 5
timeout
是 Linux 系统中的一个命令,用于限制后续命令的执行时间。- 在这里,
timeout 5
表示后续命令最多运行 5 秒钟,如果超过这个时间,就会被强制终止
这个命令是用来测试一个特定的TCP端口是否开放的。我们可以将它分解为几个部分来详细解释其功能和原理:
命令分解
-
timeout 5
timeout
是 Linux 系统中的一个命令,用于限制后续命令的执行时间。- 在这里,
timeout 5
表示后续命令最多运行 5 秒钟,如果超过这个时间,就会被强制终止。
-
bash -c “echo > /dev/tcp/172.19.127.13/6443”
bash -c
允许我们直接在 bash 中执行一段命令字符串。/dev/tcp/<host>/<port>
是 Bash 提供的一种伪文件系统,用于简化 TCP 连接的操作。通过写入/dev/tcp/<host>/<port>
,实际上是在尝试与指定的主机和端口建立一个 TCP 连接。echo > /dev/tcp/172.19.127.13/6443
的作用是向目标地址172.19.127.13
的端口6443
发起连接请求,并尝试发送空数据(echo
输出为空)。
-
&& echo “端口6443是开放的”
&&
是逻辑“与”操作符。只有当前面的命令成功执行时(即返回状态码为 0),后面的命令才会被执行。- 如果连接成功,则输出
"端口6443是开放的"
。
-
|| echo “端口6443可能被关闭或无法访问”
||
是逻辑“或”操作符。如果前面的命令失败(返回状态码非 0),则执行后面的命令。- 如果连接失败,则输出
"端口6443可能被关闭或无法访问"
。
原理解析
-
TCP 连接机制
当使用/dev/tcp/<host>/<port>
时,Bash 会尝试与指定的主机和端口建立一个 TCP 连接。如果目标端口开放且网络可达,连接会成功;否则,连接会失败或超时。 -
超时机制
使用timeout
命令是为了避免在网络不可达或目标端口响应缓慢的情况下,命令长时间挂起。设置超时时间为 5 秒可以有效控制等待时间。 -
状态码判断
Bash 命令执行后会返回一个状态码:- 状态码为 0 表示命令成功执行。
- 状态码非 0 表示命令执行失败。
根据状态码的不同,选择性地执行不同的输出。
注意事项
-
Bash 版本要求
/dev/tcp/<host>/<port>
是 Bash 内置的功能,因此需要确保使用的 Shell 是 Bash,并且版本支持该功能。
-
权限问题
- 某些情况下,可能需要足够的权限才能发起网络连接。如果命令失败,可以检查当前用户的权限。
-
防火墙或网络限制
- 即使目标端口本身是开放的,也可能因为防火墙、路由器规则或其他网络配置导致连接失败。
这条命令的核心功能是通过 Bash 的内置 TCP 功能测试某个远程主机的指定端口是否开放,并结合 timeout
控制超时时间,最后根据连接结果输出相应的信息。
写一个 shell 脚本来检测
#!/bin/bash
# 设置目标主机和端口
HOST="172.19.127.13"
PORT="6443"
TIMEOUT=5
# 尝试连接目标主机的指定端口,并设置超时时间
if timeout $TIMEOUT bash -c "echo > /dev/tcp/$HOST/$PORT" &>/dev/null; then
# 如果连接成功,输出端口开放的消息
echo "端口$PORT是开放的"
else
# 如果连接失败或超时,输出端口关闭或无法访问的消息
echo "端口$PORT可能被关闭或无法访问"
fi
使用 nmap
:
如果发现命令不存在, 手动安装一下这个命令
sudo yum install -y nmap
如果服务器上有 nmap
,可以使用它来扫描端口:
nmap -p <port> <host>
-p 6443
:指定要扫描的端口号为6443
。
# nmap -p 6443 172.19.127.13
Starting Nmap 6.40 ( http://nmap.org ) at 2025-02-23 16:11 CST
Nmap scan report for 172.19.127.13
Host is up (0.0024s latency).
PORT STATE SERVICE
6443/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 0.55 seconds
nmap -p 443 www.zhiexa.com
Starting Nmap 6.40 ( http://nmap.org ) at 2025-02-23 16:10 CST
Nmap scan report for www.zhiexa.com (106.15.73.115)
Host is up (0.00053s latency).
PORT STATE SERVICE
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 0.56 seconds
总结
本文简单总结常用的测试端口的命令, 方便以后忘记了来看看,做个记录,最常用的 nc
telnet
其次我喜欢用 curl
如果你喜欢欢迎点赞或关注!