SSH查看服务器端口使用情况,核心思路是用netstat、ss、lsof三个命令配合grep过滤,登录服务器后几秒就能看清端口占用和对应进程。
很多站长和运维新手在排查网络问题时,第一反应是登录简米云、酷番云控制台看安全组规则,但真正有效的做法是通过SSH连接服务器,在系统层面直接查看端口监听状态,下面这套方法适用于所有主流Linux发行版,包括CentOS、Ubuntu、Debian。
SSH连接后先确认当前环境
用SSH客户端(比如Xshell、PuTTY或终端)登录服务器后,先确认一下系统版本和权限,查看端口信息需要用到一些系统工具,虽然多数发行版自带,但精简系统可能没有。
cat /etc/os-release whoami
如果不是root用户,很多命令需要加sudo前缀,建议直接使用root账号或具备sudo权限的用户,否则端口和进程的对应关系可能看不全,行业共识认为,排查端口问题之前先确认用户权限,能避免大量误判。
ssh查看端口占用命令哪个更实用:netstat与ss对比
不少老教程还在教netstat,但新版Linux默认可能没装这个命令,ss是iproute2套件的一部分,几乎所有系统都自带,而且运行更快,两者核心参数很相似。
| 命令用途 | netstat(传统) | ss(推荐) |
|---|---|---|
| 查看所有监听端口 | netstat -tulnp |
ss -tulnp |
| 查看全部连接 | netstat -anp |
ss -anp |
| 按端口号过滤 | netstat -tulnp | grep :80 |
ss -tulnp | grep :80 |
| 按进程名过滤 | netstat -tulnp | grep nginx |
ss -tulnp | grep nginx |
如果执行ss时提示找不到命令,需要先安装iproute2:
# CentOS/RHEL yum install -y iproute # Ubuntu/Debian apt install -y iproute2
实际使用中,ss输出的内容比netstat更清晰,列的字段也更规范,新手只要记住ss -tulnp这一个组合,就能满足九成需求,其中t表示TCP协议,u表示UDP,l表示只显示监听状态的端口,n表示用数字显示地址和端口而不做域名解析,p表示显示对应的进程信息,如果想要快速掌握linux服务器端口使用情况查询的完整思路,建议把ss的命令参数背下来。
lsof命令:按程序或文件查端口
除了ss,lsof也能查看端口,而且更适合反向查询,已知某个进程占用端口,但不确定是哪个,或者知道进程名想知道它监听在哪些端口,用lsof最直接。
# 查看某个端口被哪个进程占用 lsof -i :8080 # 查看某个进程占用了哪些端口 lsof -i -P -n | grep nginx
输出结果中PID是进程ID,COMMAND是进程名,要杀掉占用端口的进程可以这样:
kill -9 进程PID
但不到万不得已不建议强杀,先确认进程用途再做决定。
ssh远程连接服务器查看端口,实操要按这个顺序走
大多数人通过ssh远程连接服务器查看端口时,容易东一榔头西一棒子,建议按以下步骤操作,不遗漏关键信息。
第一步:先看整体监听状态
登录服务器后,直接执行:
ss -tulnp
这时会输出所有正在监听的TCP和UDP端口,包括端口号、监听地址、进程名和PID,先整体扫一遍,心里有数。
第二步:按目标端口精确过滤
如果你只关心某个端口,比如网站用的80端口或者数据库用的3306端口,执行:
ss -tulnp | grep 3306
如果没有任何输出,说明该端口没有程序在监听,如果输出了监听信息但外部连不上,那就是安全组或防火墙挡了流量,这时候要检查云控制台的安全组规则,以及服务器内部防火墙:
# 查看防火墙规则 iptables -L -n firewall-cmd --list-all
第三步:找出进程的完整路径
很多安全扫描工具会提示端口被占用,但你想知道这个进程是从哪个目录启动的,可以先用ss拿到PID,再用以下命令定位:
ll /proc/进程PID/cwd/
这能看到进程的工作目录,这一步在排查可疑进程时特别关键。
第四步:确认连接状态
除了监听端口,还需要看当前建立的连接,用:
ss -anp | grep ESTAB
能列出所有已建立的连接,如果服务器被大量IP连接,可能是异常流量,再配合ss -s查看整体连接统计。
linux服务器端口使用情况查询的三种方式对比
如果把三种常用方法放到一起对比,选择起来就简单了。
| 方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| ss命令 | 常规端口监听状态 | 速度快、参数统一 | 需要记住参数组合 |
| netstat命令 | 服务器上已有该工具 | 兼容老脚本 | 占用资源略高 |
| lsof命令 | 按进程查端口或反向查 | 信息详细全面 | 需要安装、读取慢 |
很多老运维习惯用netstat,因为它存在时间久,脚本兼容性好,但新装系统建议优先使用ss,如果你在一台运行很久的国内云服务器上操作,可能两种命令都装好了,那直接用ss -tulnp就行。
常见端口问题的快速定位方法
实际运维中,最常遇到的是端口被占用和端口不通,分别说说快速处理思路。
端口被占用了怎么办
启动服务时提示端口已被占用,比如启动Tomcat时提示8080端口被占用,先执行:
ss -tulnp | grep 8080
看到PID后,再确认进程是不是自己的旧服务,如果是残留进程,直接kill掉再重启,如果是不认识的进程,用ll /proc/PID/exe查看可执行文件路径,谨慎处理。
端口明明监听着,但外网访问不了
这种情况多数不是端口问题,而是链路问题,按顺序排查:
- 先确认服务监听地址是0.0.0.0还是127.0.0.1,如果监听的是127.0.0.1,外网肯定访问不了,需要修改服务配置,比如Nginx的listen 80改成listen 0.0.0.0:80。
- 再看云安全组是否放行了对应端口,很多云平台默认只开放22、80、443。
- 最后检查服务器防火墙,CentOS 7以上用firewalld,老版本用iptables,临时放行一个端口可以执行:
firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload
怎样快速判断端口数量是否异常
一个中型网站通常只会监听少量端口,比如22、80、443,最多再加数据库和缓存端口,如果你执行ss -tulnp后发现几十个端口处于监听状态,就要警惕了,逐一确认这些进程的用途。
业内专家指出,绝大多数被入侵的服务器都会在异常端口上运行后门程序,定期检查监听端口是安全运维的基本功。
SSH查看端口使用情况时的几个小技巧
掌握下面几个技巧,操作效率能提升不少。
- 使用watch命令持续刷新输出:
watch -n 1 'ss -tulnp',每秒自动更新。 - 配合sort排序查看占用连接最多的IP:
ss -anp | awk '{print $5}' | sort | uniq -c | sort -n。 - 用grep同时匹配多个条件:
ss -tulnp | grep -E '80|443'。 - 在简米云、酷番云等国内云服务器上,SSH连接本身可能因为安全组未放行22端口而失败,这时只能通过VNC或管理后台登录,先解决网络问题。
实用组合:一条命令输出端口和进程对应表
想要一份完整的端口和进程对应关系,可以执行:
ss -tulnp | awk 'NR>1 {print $1, $4, $6, $7}'
输出结果第一列是协议,第四列是监听地址和端口,第六列是进程名,第七列是PID,想要更友好的展示可以写成:
ss -tulnp | grep LISTEN | awk '{print $4, $6, $7}' | column -t
这在排查多端口应用时非常有用,如果平时习惯图形界面,也可以用神器IPFM或者智控服务器管理面板,但那些属于额外工具,基础命令仍然是最可靠的。
Q&A:ssh查看端口情况的常见疑问
为什么ss命令输出结果里看不到进程名?
如果没有加-p参数,或者当前用户权限不够,就一定看不到,用root身份执行ss -tulnp,或者对非root用户加上sudo再执行。
用ssh查看端口使用情况需要安装额外软件吗?
多数情况下不需要,ss命令集成在iproute2中,CentOS和Ubuntu默认都有,lsof可能需要单独安装,执行apt install lsof或yum install lsof即可,有时候也可以安装nmap做更深入的端口扫描,比如nmap -sT -O localhost,但日常排查用ss已经足够。
查看端口占用后怎么确认端口是否对外开放?
在服务器上用ss -tulnp只能看到本机监听状态,想要知道外部是否可达,换个思路,用另一个SSH会话或者本地电脑执行telnet 服务器IP 端口,能连通说明防火墙放行了,否则就是被安全组或防火墙拦截,telnet没有安装时,可以用cURL的telnet协议替代:curl -v telnet://服务器IP:端口。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/699760.html





