Linux 端口完全指南

Linux 端口完全指南

在 Linux 网络管理中,端口 是通信的入口与出口,是服务与外界交互的“门牌号”。无论是 Web 服务器、数据库还是 SSH 远程登录,都离不开端口的正确配置。本文将系统讲解 Linux 端口的概念、查看方法、防火墙管理及常见故障排查。


1. 端口基础

什么是端口?

端口是一个 16 位整数(0~65535),用于标识主机上不同的网络服务或进程。IP 地址定位主机,端口定位主机上的具体应用。例如:

  • 192.168.1.100:22 → SSH 服务
  • 192.168.1.100:80 → HTTP 服务

端口分类

范围 类型 说明
0 – 1023 知名端口(Well-known) 系统预留,通常需要 root 权限才能绑定。例如 22 (SSH), 80 (HTTP), 443 (HTTPS)
1024 – 49151 注册端口(Registered) 用户进程或非系统服务常用,如 3306 (MySQL), 8080 (Tomcat)
49152 – 65535 动态/私有端口(Dynamic/Private) 客户端临时分配,用于短期通信

TCP vs UDP

  • TCP:面向连接、可靠传输(如 HTTP、FTP、SSH)
  • UDP:无连接、高效但可能丢包(如 DNS、NTP、SNMP)

2. 查看端口使用情况

2.1 使用 ss(推荐)

ss 是新一代 socket 统计工具,速度远快于 netstat

# 查看所有监听端口(TCP + UDP)
ss -tuln

# 查看所有 TCP 连接(包括已建立、监听等)
ss -tan

# 查看特定端口(例如 80)的进程
ss -tlnp | grep :80

参数说明:

  • -t TCP
  • -u UDP
  • -l 仅显示监听状态
  • -n 数字显示(不解析服务名)
  • -p 显示进程 PID 和名称(需 root)

2.2 使用 netstat(传统)

# 查看所有监听端口
netstat -tuln

# 查看端口与进程(需 root)
netstat -tulnp

# 查看指定端口占用
netstat -anp | grep 3306

2.3 使用 lsof

lsof 可列出打开的文件,网络连接也是文件的一种。

# 查看所有监听端口
lsof -i -P -n | grep LISTEN

# 查看特定端口(如 22)
lsof -i :22

# 查看某进程占用的端口
lsof -i -a -p <PID>

2.4 查看 /proc 文件系统

cat /proc/net/tcp | awk '{print $2}'  # 显示本地地址与端口(十六进制)

一般不常用,ss 更友好。


3. 防火墙与端口管理

Linux 主流防火墙工具:firewalld(RHEL/CentOS 7+)、iptables(旧版)、ufw(Ubuntu/Debian)。

3.1 firewalld(动态防火墙)

# 查看防火墙状态
firewall-cmd --state

# 查看当前开放端口
firewall-cmd --list-ports

# 永久开放 TCP 8080 端口
firewall-cmd --permanent --add-port=8080/tcp

# 开放服务(例如 http)
firewall-cmd --permanent --add-service=http

# 重新加载配置
firewall-cmd --reload

# 关闭端口(移除规则)
firewall-cmd --permanent --remove-port=8080/tcp

3.2 iptables(底层工具)

# 查看当前规则(带端口)
iptables -L -n -v

# 开放 TCP 8080(入站)
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

# 保存规则(不同发行版命令不同)
service iptables save   # CentOS 6

3.3 ufw(Ubuntu 简易防火墙)

# 启用/禁用
ufw enable
ufw disable

# 允许 22/tcp(SSH)
ufw allow 22/tcp

# 允许 8080 端口
ufw allow 8080

# 允许特定 IP 访问 3306
ufw allow from 192.168.1.10 to any port 3306

# 删除规则
ufw delete allow 8080

# 查看状态
ufw status verbose

3.4 临时关闭防火墙(调试用)

# systemd 系统
systemctl stop firewalld   # firewalld
systemctl stop ufw         # ufw

# 注意:生产环境不建议永久关闭

4. 端口转发(重定向)

将到达某端口的流量转发到另一个端口或主机。

4.1 使用 iptables 实现本地端口转发

# 将访问 80 的流量转发到 8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

4.2 使用 socat 工具

# 监听 8080,转发到本机 22
socat TCP-LISTEN:8080,fork TCP:localhost:22

4.3 使用 ssh 隧道(远程转发)

ssh -L 8080:localhost:80 user@remote_host
# 将本机 8080 映射到 remote_host 的 80 端口

5. 常见端口列表(速查)

端口 协议 服务
20,21 TCP FTP
22 TCP SSH
23 TCP Telnet
25 TCP SMTP
53 TCP/UDP DNS
67,68 UDP DHCP
80 TCP HTTP
110 TCP POP3
123 UDP NTP
143 TCP IMAP
161 UDP SNMP
443 TCP HTTPS
3306 TCP MySQL
3389 TCP RDP
5432 TCP PostgreSQL
6379 TCP Redis
8080 TCP HTTP 代理 / 备用 Web
27017 TCP MongoDB

6. 故障排查指南

6.1 端口被占用(Address already in use)

# 查找占用进程
ss -tlnp | grep <端口>
# 或
lsof -i :<端口>

# 杀死进程
kill -9 <PID>

6.2 连接被拒绝(Connection refused)

原因可能有:

  • 服务未启动
  • 防火墙阻止
  • 服务只监听 127.0.0.1(localhost),而非 0.0.0.0(所有接口)

检查监听地址:

ss -tlnp | grep <端口>
# 如果显示 127.0.0.1:端口,则外部无法访问

修改服务配置文件(如 /etc/ssh/sshd_config 中的 ListenAddress),重启服务。

6.3 端口可达性测试

# 本地测试
telnet localhost 22

# 远程测试(需安装 nc/nmap)
nc -zv 192.168.1.100 22

# 使用 nmap 扫描
nmap -p 22 192.168.1.100

6.4 查看端口历史连接(统计)

ss -s          # 汇总统计
netstat -s     # 详细统计

7. 安全性建议

  • 最小开放原则:仅开放业务必需的端口。
  • 修改默认端口:例如将 SSH 22 改为高位端口,降低暴力破解风险。
  • 使用防火墙白名单:限制允许访问的 IP 范围。
  • 定期审查开放端口
    ss -tuln | grep -v "127.0.0.1"   # 查看对外监听的端口
    
  • 配合 fail2ban 动态拦截恶意 IP。

8. 总结

端口是 Linux 网络服务的基石,掌握端口的查看、开放、转发和排错是运维与开发的基本功。建议熟记常用命令:

  • ss -tulnp 快速查看所有服务端口
  • firewall-cmdufw 管理防火墙规则
  • lsof -i :port 精准定位进程

理解端口范围、协议类型和监听地址,能让你更从容地配置服务、排查网络问题。在实际工作中,请始终遵循安全准则,保障系统与数据安全。