网络端口科普

最近一部分时间一直在研究 nas, 家庭服务器, 内网, 软路由这些玩意儿, 发现网络知识真的是重要的基础, 而网络端口作为服务对外暴露的访问方式更是重中之重, 本文总结了下网络端口的一些知识点

在 Internet 上, 各主机间通过 TCP/TP 协议发送和接收数据报, 各个数据报根据其目的主机的 IP 地址来进行互联网络中的路由选择. 可见, 把数据报顺利的传送到目的主机是没有问题的. 我们知道大多数操作系统都支持多程序 (进程) 同时运行, 那么目的主机应该把接收到的数据报传送给众多同时运行的进程中的哪一个? 显然这个问题有待解决, 端口机制便由此被引入了进来.

本地操作系统会给那些有需求的进程分配协议端口 (protocal port, 即我们常说的端口), 每个协议端口由一个正整数标识, 如: 80, 139 等等. 当目的主机接收到数据报后, 将根据报文首部的目的端口号, 把数据发送到相应端口, 而与此端口相对应的那个进程将会领取数据并等待下一组数据的到来.

端口分类

逻辑意义上的端口有多种分类标准, 下面是两种常见的分类:

  1. 按端口号分布划分
    • 知名端口 (Well-Known Ports): 知名端口即众所周知的端口号, 范围从 0 到 1023, 这些端口号一般固定分配给一些服务. 比如 25 端口分配给 SMTP(简单邮件传输协议) 服务, 80 端口分配给 HTTP 服务, 135 端口分配给 RPC(远程过程调用) 服务等等.
    • 动态端口 (Dynamic Ports): 动态端口的范围从 102465535, 这些端口号一般不固定分配给某个服务, 也就是说许多服务都可以使用这些端口. 只要运行的程序向系统提出访问网络的申请, 那么系统就可以从这些端口号中分配一个供该程序使用.

      比如 1024 端口就是分配给第一个向系统发出申请的程序. 在关闭程序进程后, 就会释放所占用的端口号

  2. 按协议类型划分: 可以分为 TCP, UDP, IP 和 ICMP(Internet 控制消息协议) 等端口.
    • TCP 端口: 即传输控制协议端口, 需要在客户端和服务器之间建立连接, 这样可以提供可靠的数据传输. 常见服务与对应的端口包括如下:
      • FTP 服务: 21
      • SSH 服务: 22
      • Telent 服务: 23
      • SMTP 服务: 25
      • HTTP 服务: 80
      • HTTPS 服务: 443
    • UDP 端口: 即用户数据包协议端口, 无需在客户端和服务器之间建立连接, 安全性得不到保障. 常见服务与对应的端口包括如下:
      • DNS 服务: 53
      • SNMP(简单网络管理协议) 服务: 161
      • QQ: 8000 和 4000

端口屏蔽

腾讯云默认限制 TCP:25 端口:

部分端口存在安全隐患, 尽管腾讯云未做限制, 但运营商仍会将其拦截, 从而导致无法访问. 为避免此情况发生, 我们建议您更换端口, 不要使用如下端口监听:

  • TCP: 42, 80, 135, 137, 138, 139, 443, 445, 593, 1025, 1434, 1068, 3127, 3128, 3129, 3130, 4444, 5554, 5800, 5900, 9996
  • UDP: 135~139, 1026, 1027, 1028, 1068, 1433, 1434, 4789, 4791, 5554, 9996

天翼云针对新服务器的 80 / 443 / 8080 / 8443 端口都是屏蔽的, 必须在天翼云平台进行备案才会开通. 即使是网站之前已经备案, 并且在其他云服务器厂商正常运行了很久, 一旦迁移到天翼云后还是需要重新备案

这里说一下, 天翼云算是我用过的国内云服务器厂商中体验最差的. 管理页面做的和屎一样, 用阿里云腾讯云的管理页面的时候没感觉有多好, 但是用了天翼云之后才知道原来可以做这么差

  1. 不支持 Safari, 用 Safari 下单显示不了订单, 用 safari 看不到购买过的服务器
  2. 系统稳定性差, 经常打开页面就报错了, 重试了几次后某次就又好了. 某些时候, 没有任何用户操作下自动返回首页, 导致整个备案提交流程中断
  3. 默认封闭 80 443 8080 8443 端口, 但是没有在关键的页面节点处给予提示. 导致我迁移到天翼云后始终访问不了我的站点. 然后查安全组开放端口, 查nginx 配置, 重启服务器, 能用的方法都用了, 就是访问不了. 最后看到网上有人说迁移到天翼云必须重新备案, 浪费了我一个网上的时间啊 😤

端口状态检查

  • netstat -a -n: 可以看到以数字形式显示的系统中的 TCP 和 UDP 连接的端口号及状态.
  • nc -zv remote.hanleylee.com 5900: 检查远程端口是否开启 (如果一直没结果可能是被运营商禁用了)
  • nc -zvu remote.hanleylee.com 5900: 检查远程 udp 端口是否开启 (由于 udp 可以没有回复, 因此数据被拒绝表示一定关闭了, 发送成功表示可能开启也可能没开启)
  • nmap -p 35900 remote.hanleylee.com: 检查远程端口是否开启
  • nmap -p 1-100 remote.hanleylee.com: 检查远程端口 1~100 是否开启
  • nmap remote.hanleylee.com: 检查远程端口 1~1000 是否开启
  • https://www.yougetsignal.com/tools/open-ports/: 在线检查公网 ip 的指定端口是否开启
  • curl curl ipinfo.io: 检查当前 ip 信息
  • telent remote.hanleylee.com 445: 检查远程端口 445 是否开启

telnet 状态分析

telnet remote.hanleylee.com 445 的结果有多种可能, 我们可以根据不同结果做出分析

  • 连接成功
    zsh
      telnet 127.0.0.1 22
      Trying 127.0.0.1...
      Connected to 127.0.0.1.
      Escape character is '^]'.
  • 连接不知道什么原因, 一直处于夯住状态

    zsh
      telnet  127.0.0.1 10000
      Trying 127.0.0.1..

    分析:

    • 该端口是否被运营商屏蔽了
    • 防火墙是否开启阻挡了网络请求的通信
    • 在 2 者间的网络中是否有一个路由器故障了
  • 连接拒绝了

    zsh
      telnet 127.0.0.1 4455
      Trying 127.0.0.1...
      telnet: connect to address 127.0.0.1: Connection refused
      telnet: Unable to connect to remote host

    分析:

    • 该端口是否没有被任何服务监听
    • 服务器运行监听的端口是否正确
    • 服务是否已经运行并处于监听状态
  • 连接被服务器拒绝

    zsh
      telnet samba.example.com 445
      Trying 172.31.55.33...
      Connected to samba.example.com.
      Escape character is '^]'.
      Connection closed by foreign host.

    分析:

    • 最后一行显示被服务器关闭了, 这个可能是服务器的安全配置导致的, 意味这个连接被服务器主动终止. 这样你需要看看服务器安全策略, 是否允许当前 IP 访问连接.

端口在入侵中的作用

有人曾经把服务器比作房子, 而把端口比作通向不同房间 (服务) 的门. 入侵者要占领这间房子, 势必要破门而入 (物理入侵另说), 那么对于入侵者来说, 了解房子开了几扇门, 都是什么样的门, 门后面有什么东西就显得至关重要.

入侵者通常会用扫描器对目标主机的端口进行扫描, 以确定哪些端口是开放的, 从开放的端口, 入侵者可以知道目标主机大致提供了哪些服务, 进而猜测可能存在的漏洞, 因此对端口的扫描可以帮助我们更好的了解目标主机, 而对于管理员, 扫描本机的开放端口也是做好安全防范的第一步.

端口的一些其他知识点

在 linux 中如何查看知名端口号?

cat /etc/services

一个进程是否可以 bind 多个端口号?

可以. 因为一个进程可以打开多个文件描述符, 而每个文件描述符都对应一个端口号, 所以一个进程可以绑定多个端口号.

Linux 内核会给每一个 socket 分配一个唯一的文件描述符, 进程通过该文件描述符来区分对应的套接字.

TCP UDP 可以同时绑定同一个端口吗?

TCP, UDP 可以同时绑定一个端口 8888, 但是一个端口在同一时刻不可以被 TCP 或者 UDP 绑定 2 次. 原因如下:

  • tcp 的端口不是物理概念, 仅仅是协议栈中的两个字节
  • TCP 和 UDP 的端口完全没有任何关系, 完全有可能又有一种 XXP 基于 IP, 也有端口的概念, 这是完全可能的
  • TCP 和 UDP 传输协议监听同一个端口后, 接收数据互不影响, 不冲突.

一个端口号是否可以被多个进程绑定?

同种协议通常不可以

但有一种情况可以: 如果进程先绑定一个端口号, 然后在 fork 一个子进程, 这样的话就可以是实现多个进程绑定一个端口号, 但是两个不同的进程绑定同一个端口号是不可以的.

Ref

本博客文章采用 CC 4.0 协议,转载需注明出处和作者。

鼓励作者