服务器查看SSH端口命令
直接查看当前生效的SSH端口命令是:ss -tlnp | grep sshd 或 netstat -tlnp | grep sshd,此命令列出所有监听状态的TCP端口并过滤出sshd进程使用的端口,通常显示为 0.0.0:22 或 ::22,22 即为默认SSH端口(若已修改则显示实际端口号)。
核心命令详解与验证
-
ss -tlnp | grep sshd(推荐使用)ss: 更现代且高效的 socket 统计工具,替代传统的netstat。-t: 仅显示 TCP sockets。-l: 仅显示监听 (LISTEN) 状态的 sockets。-n: 以数字形式显示地址和端口号 (不进行 DNS 解析和服务名转换)。-p: 显示使用该 socket 的进程信息 (需要 root 权限才能查看其他用户的进程)。| grep sshd: 将ss的输出通过管道 () 传递给grep命令,筛选出包含sshd(SSH 服务进程名) 的行。- 输出示例:
LISTEN 0 128 0.0.0.0:2222 0.0.0.0: users:(("sshd",pid=1234,fd=3)) LISTEN 0 128 [::]:2222 [::]: users:(("sshd",pid=1234,fd=4))关键信息是
0.0.0:2222和[::]:2222,表示 SSH 服务在 IPv4 和 IPv6 上都监听在 2222 端口。
-
netstat -tlnp | grep sshd(传统方法)netstat: 网络统计工具,功能强大但性能略逊于ss。-t,-l,-n,-p: 参数含义与ss命令中的相同。| grep sshd: 同样用于过滤出sshd进程相关的行。- 输出示例:
tcp 0 0 0.0.0.0:2222 0.0.0.0: LISTEN 1234/sshd: /usr/sbi tcp6 0 0 :::2222 ::: LISTEN 1234/sshd: /usr/sbi同样,查看
0.0.0:2222和::2222即可知 SSH 端口为 2222。
-
验证命令输出解读
- 监听地址 (
0.0.0或 ):0.0.0表示监听所有 IPv4 地址, (或[::]) 表示监听所有 IPv6 地址,这通常是需要的配置,表示服务器接受来自任何网络接口的 SSH 连接。 - 端口号 (
xxxx): 冒号 () 后面的数字 (xxxx) SSH 服务实际监听的 TCP 端口号,如果显示22,说明是默认端口;如果显示如2222、8822等,则说明管理员已修改了默认 SSH 端口。 - 进程信息 (
sshd): 确认该监听端口确实由sshd进程打开,避免与其他服务混淆。
- 监听地址 (
查看SSH配置文件中的端口设置
命令:grep -i port /etc/ssh/sshd_config
/etc/ssh/sshd_config: SSH 服务端的主配置文件。grep -i port: 在配置文件中搜索包含port关键字的行 (-i表示忽略大小写)。- 输出示例:
#Port 22 Port 2222 #GatewayPorts no - 解读:
#Port 22: 以 开头的行是注释,说明默认端口是 22,但当前未生效。Port 2222: 这是实际生效的配置行,明确指定 SSH 服务使用 2222 端口。- 配置文件中可能有多条
Port指令(非注释),SSH 会监听所有指定的端口。
- 重要提示:
- 此方法显示的是 配置文件中的设定值,服务器运行时实际监听的端口以第一节的
ss或netstat命令输出为准,如果修改了配置文件但未重启sshd服务 (sudo systemctl restart sshd),配置不会生效。
- 此方法显示的是 配置文件中的设定值,服务器运行时实际监听的端口以第一节的
扫描服务器开放端口(外部视角)
命令示例:nmap -sT -p- <服务器IP或域名>
- 目的: 从网络上的另一台机器扫描目标服务器,验证哪些端口(尤其是 SSH 端口)确实对外开放并可连接,这对于检查防火墙规则是否生效(是否放行了自定义 SSH 端口)非常有用。
- 参数解释:
nmap: 强大的网络探测和安全扫描工具。-sT: 进行 TCP Connect 扫描(建立完整 TCP 连接),结果相对准确可靠。-p-: 扫描所有 65535 个 TCP 端口,范围过大时可指定如-p 1-10000, 2222, 3389。<服务器IP或域名>: 替换为目标服务器的实际 IP 地址或域名。
- 输出解读: 在扫描结果中找到
ssh服务对应的状态为open的端口,注意服务识别 (ssh) 可能不完全准确,仍需结合端口号判断。 - 替代简单命令:
nc -zv <服务器IP或域名> <端口号>(如nc -zv example.com 2222),快速测试特定 TCP 端口是否开放。
关键注意事项与安全最佳实践
- 权限要求: 使用
ss -tlnp或netstat -tlnp查看进程信息 (-p选项) 通常需要 root 权限 (sudo),不加-p可看到端口但无法关联进程名,降低准确性。 - 默认端口与安全: SSH 默认端口 22 是自动化攻击的主要目标。强烈建议修改为 1024-65535 范围内的非默认端口。 这是服务器安全加固的基本步骤(但非唯一措施)。
- 配置 vs 运行时: 务必区分
sshd_config中的配置和ss/netstat显示的实际运行状态,修改配置后必须重启 SSH 服务 (sudo systemctl restart sshd) 才能生效。 - 防火墙协同: 修改 SSH 端口后,必须同步更新服务器防火墙(如
iptables,nftables,firewalld, 云平台安全组)规则,允许新端口的入站连接,并拒绝旧端口(通常是默认 22),否则会导致 SSH 无法连接。 - 多端口监听:
sshd_config支持配置多个Port行(如Port 22和Port 2222),服务会同时监听这些端口,生产环境通常建议只保留一个自定义端口。
常用命令对比与选择建议
| 命令/方法 | 主要用途 | 优势 | 劣势/注意 | 推荐度 |
|---|---|---|---|---|
ss -tlnp \| grep sshd |
查看当前实际监听的SSH端口 | 高效、现代、输出清晰 | 需要 root 权限查看进程信息 | ⭐⭐⭐⭐⭐ |
netstat -tlnp \| grep sshd |
查看当前实际监听的SSH端口 (传统方法) | 广泛可用、熟悉度高 | 性能稍逊于 ss,未来可能被弃用 |
⭐⭐⭐⭐ |
grep -i port /etc/ssh/sshd_config |
查看SSH服务配置文件中设定的端口 | 明确显示配置意图 | 仅显示配置,不一定反映当前运行状态 | ⭐⭐⭐⭐ |
nmap -sT -p- <server> |
从外部网络扫描验证SSH端口开放性 | 真实反映外部可连接性,验证防火墙规则 | 需要额外机器,扫描所有端口耗时 | ⭐⭐⭐⭐ (特定场景) |
nc -zv <server> <port> |
快速测试特定端口是否开放 | 简单、快速 | 只能测试单个指定端口 | ⭐⭐⭐ (特定场景) |
总结与安全加固建议
准确查看服务器 SSH 端口的核心在于 ss -tlnp | grep sshd 命令,它能直接反映 sshd 进程当前实际监听的 TCP 端口,结合查看配置文件 /etc/ssh/sshd_config 可以理解管理员的设置意图,而使用 nmap 进行外部扫描则是验证端口对外开放性和防火墙配置有效性的关键步骤。
专业的SSH安全加固建议:
- 修改默认端口: 立即将默认的 22 端口改为 1024-65535 范围内的高位端口。
- 禁用root登录: 在
sshd_config中设置PermitRootLogin no,强制使用普通用户登录后再su/sudo。 - 使用密钥认证: 彻底禁用密码登录 (
PasswordAuthentication no),强制使用更安全的 SSH 密钥对认证。 - 限制用户与IP: 使用
AllowUsers/AllowGroups限制可登录的用户/组,利用DenyUsers/DenyGroups封禁特定用户,结合防火墙或sshd_config的Match Address限制来源 IP。 - 保持更新: 定期更新操作系统和
openssh-server软件包以修复安全漏洞。 - 使用Fail2ban: 部署 Fail2ban 工具自动封锁多次尝试失败的 IP 地址。
- 限制协议版本: 在
sshd_config中明确指定Protocol 2,禁用老旧不安全的 SSHv1。
您通常使用哪些策略来进一步加强服务器的SSH访问安全?是否有遇到过因端口或配置问题导致的连接故障?欢迎在评论区分享您的实战经验和解决方案。
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/30644.html