关于端口你需要知道的-迷你版

0X00 基本内容

你应该听人跟你说过类似于「你看 2333 这个端口在没在监听」这句话吧,也应该听过「我可以 ping 通所以肯定不是网络的问题」这种话吧。虽然听的多了,但实际上它漏洞百出。

首先我们都知道端口号是一个数字,从 0 到 65535 其中 0~2013 叫 well-known ports 知名端口,也就是说通常某个端口就固定给某个服务使用,比如你见到 22 就第一反应该是 ssh 而非 MySQL,见到 80 就知道是 HTTP 而非 smtp。也正是如此,在 Linux 中你自己开发的程序平时监听 8080 没啥问题,但是想监听 80 的时候就要校验你的 root 权限了。

其次要知道端口是 IP 地址上的,并非电脑上的。也就是说当你电脑同时拥有 192.168.2.123192.168.2.234 两个 IP 的时候,你可以启动两个 Nginx 分别监听他们的 80 端口。

最后要知道端口也是分类型的,即使是同一地址的统一端口也可以 tcp 和 udp 分开监听,也就是说你可以同时监听:

1
2
3
4
192.168.2.123:80 tcp
192.168.2.123:80 udp
192.168.2.234:80 tcp
192.168.2.234:80 udp

SCR-20230331-paqh

0X01 如何检查

通常来说有什么服务直接用就试了,不过有时候我们需要自底向上的检查问题,那么第一步就是检查服务端的监听是否正常,正常的话客户端的连通是否顺利。首先保证我们的 TCP 和 UDP 通信时正确的,再来排查上层的程序,否则可能你调了半天程序最终发现网络压根就没通。

ss 命令

首先介绍一下用 ss 命令(socket statistics)来查看自己机器上的端口开放情况,比较常见的用法是 ss -apnl

  • a 是所有 socket,包含了 tcp udp 的,也可以单独使用 t 或者 u 筛选
  • p 显示进程名和 PID 这些
  • n 不解析服务名,这样不仅速度更快而且也更便于筛选端口号
  • l 仅显示监听状态

SCR-20230331-ohke

nc 命令

这个 nc 命令一般会随系统附带,没有的话需要安装 netcat 软件包。它可以快速绑定一个地址和端口并进行监听,也可以快速向指定 ip 和端口发送数据。

1
2
3
4
5
6
7
8
9
10
11
# 监听 tcp 0.0.0.0 2333
nc -l 0.0.0.0 -p 2333

# 监听 udp 0.0.0.0 2333
nc -ul 0.0.0.0 -p 2333

# 向 tcp 127.0.0.1 2333 发内容
echo "hello, world" | nc 127.0.0.1 2333

# 向 udp 127.0.0.1 2333 发内容
echo "hello, world" | nc -u 127.0.0.1 2333

用法应该很好理解,其中 -l 是 Listen 也就是监听,-u 是指 UDP(默认情况下是 TCP)

好了,现在可以和以前那个只知道用 ping 来判断网络通不通的自己说再见了👋