前言

在 Linux 上,端口的使用是有一定的规范:

  1. 端口号 0 不使用;

  2. 端口号 1 - 1023,系统默认只给 root 使用;

  3. 端口号 1024 - 4999 由客户端程序自由分配;

  4. 端口号 5000 - 65535 由服务器端程序自由分配;

端口号名称注册

在 Linux 下有一个 /etc/services 的文件,记录着服务名和他们对应的端口和协议。

在一些应用中可以直接使用协议名称来操作对应的端口,比如 iptables 添加规则的时候可以直接写 http,https,来代替对应的 80,443。(当然是默认的配置),如果名称对应的端口号变了,重新查找的时候就添加规则后的端口就会随着改变。

/etc/services 文件格式

这个文件的每一行对应一种服务,由三个字段组成,中间用 TAB 或者空格分隔,从左到右,分别对应 服务名称 使用端口/协议名称 别名:

例如:

cat  /etc/services
...
ftp-data           20/tcp
ftp-data           20/udp
ftp-data           20/sctp
ftp                21/tcp
ftp                21/udp
ftp                21/sctp
ssh                22/tcp    ssh2
ssh                22/udp
ssh                22/sctp
telnet             23/tcp
telnet             23/udp
smtp               25/tcp
smtp               25/udp
...

这里我们给 ssh 加一个 ssh2 的别名,这样子在 iptables 中我们可以指定端口是 ssh2 端口

iptables -A INPUT -p tcp --dport ssh2 -j ACCEPT

其他地方的应用

我们在使用 netstat 或者 ss 命令常看网络连接的时候如果不加-n 参数,默认就会解析端口对应的服务名称。

例如

ss -ltp

State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port
LISTEN   0         128                 0.0.0.0:ssh              0.0.0.0:*
LISTEN   0         5                 127.0.0.1:ipp              0.0.0.0:*
LISTEN   0         128                    [::]:ssh                 [::]:*
LISTEN   0         5                     [::1]:ipp                 [::]:*

总结

/etc/services 对我们一些端口操作有一定的遍历和直观,但是也存在被篡改的风险。因此,建议不要随便去修改这个文件,我们平时操作对应的端口的时候直接写上对应的端口号,防止因/etc/services 这个文件被修改,出现异常或者安全问题。