17、网络连接拒绝与日志排查全解析

网络连接拒绝与日志排查全解析

在网络服务的运行过程中,我们常常会遇到连接被拒绝的情况,而且往往没有明显的原因。下面我们就来详细探讨如何解决这类问题,以及如何通过日志来排查故障。

连接拒绝场景分析

有时候,服务会拒绝连接,却不给出明确原因。例如,内部 API 报告高错误率,使用该 API 的其他服务也出现大量错误。应用日志中的错误信息可能如下:

Failed to connect to api.smith.lab port 8080: Connection refused

这表明用户在尝试连接 API 服务器时收到了“连接被拒绝”的错误。已知 Docker 容器正在运行,否则会收到容器停止的警报。为了解决这个问题,我们可以使用以下几个命令来识别网络或配置相关的问题。

常用命令排查
  • curl 命令 :当需要检查 Web 服务器是否响应请求,或者只想获取一些数据或文件时,可以使用 curl 命令。为了验证端点是否对所有用户都不可用,而不仅仅是其他主机的路由问题,可以使用以下命令:
$ curl http://api.smith.lab:8080

如果输出显示“连接被拒绝”的错误,通常意味着主机未在该端口监听,或者防火墙正在拒绝数据包。

curl: (7) Failed to connect to api.smith.lab port 8080: Connection refused
  • ss 命令 ss (套接字统计)命令用于转储主机上的套接字信息。为了查看主机上是否有应用程序在端口 8080 上监听请求,可以使用以下命令:
$ sudo ss -l -n -p | grep 8080

输出示例:

... 0.0.0.0:8080 0.0.0.0:* users:(("docker-proxy",pid=1448197,fd=4))

其中, -l 标志显示主机上所有监听的套接字, -n 标志指示 ss 不解析服务名称, -p 标志显示使用该套接字的进程。需要注意的是,使用 ss 确定套接字所属进程时,需要 sudo 或提升权限。此输出表明 docker-proxy 进程正在所有接口上监听端口 8080。

ss 之前,有一个名为 netstat 的工具,两者功能基本相同,但按照现代标准, netstat 已被视为过时工具。尽管仍能在一些教程和博客文章中看到使用 netstat 的情况,但建议今后使用 ss

  • tcpdump 命令 tcpdump 命令可以验证主机上的网络流量,它有许多选项,可以捕获一个或所有接口上的流量,甚至可以将网络捕获结果写入文件以便后续分析。它不仅适用于排查网络问题,还可用于安全审计。为了捕获发往 api.smith.lab 主机端口 8080 的网络流量,可以使用以下命令:
$ sudo tcpdump -ni any tcp port 8080

输出示例:

IP 192.168.50.26.50563 > 192.168.50.4.8080: Flags [S], seq 3446688967, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 157893401 ecr 0,sackOK,eol], length 0
IP 192.168.50.4.8080 > 192.168.50.26.50563: Flags [R.], seq 0, ack 3446688968, win 0, length 0
IP 192.168.50.26.50563 > 192.168.50.4.8080: Flags [S], seq 3446688967, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 157893501 ecr 0,sackOK,eol], length 0
IP 192.168.50.4.8080 > 192.168.50.26.50563: Flags [R.], seq 0, ack 1, win 0, length 0

其中, -n 标志确保不尝试解析任何主机或端口名称, -i 标志指定要监听的网络接口, any 表示监听所有接口。最后一个参数 tcp port 8080 表示只捕获包含端口 8080 的 TCP 数据包。

从输出可以看出,客户端发送同步(S)数据包尝试建立连接,而服务器返回重置(R)数据包,这表明连接不正常。正常的 TCP 连接是通过三次握手建立的,即客户端发送 SYN 数据包,服务器返回 SYN - ACK 数据包,客户端再发送 ACK 数据包。

graph LR
    A[客户端 192.168.50.26] -->|SYN| B[服务器 192.168.50.4]
    B -->|SYN - ACK| A
    A -->|ACK| B

虽然通过 tcpdump 验证了连接已到达服务器,但仍不清楚被拒绝的原因。

下一步排查方向

目前已知服务正在端口 8080 上监听(通过 ss 命令验证),并且流量已到达服务器(通过 tcpdump 捕获验证)。接下来需要检查 Docker 容器和应用程序配置。可能是 docker - proxy 存在问题,未能将流量转发到运行 API 的容器;也可能是容器启动时内部端口映射配置错误。可以通过查看 Docker 的系统日志以查找代理错误,或者运行以下命令检查端口映射:
- docker ps <container id>
- docker inspect <container_id>

日志搜索与分析

在几乎所有的故障排查场景中,都需要检查日志。系统和应用程序日志包含了大量可以从命令行查看的信息。现代 Linux 发行版使用 systemd ,它有一个名为 journal 的日志收集机制,可以从多个源(如 syslog auth.log kern.log )收集日志事件,这使得可以在单个流中查看和搜索日志。

常见日志文件

大多数 Linux 主机上的系统和应用程序日志存储在 /var/log 目录中。以下是一些常见的日志文件及其用途:
| 日志文件 | 用途 | 示例 |
| ---- | ---- | ---- |
| /var/log/syslog | 包含 Linux 操作系统的一般全局系统消息 | Jun 11 00:00:03 box systemd[1]: Finished Rotate log files. |
| /var/log/auth.log | 包含授权和认证事件的信息,可用于调查用户登录、暴力攻击或跟踪用户的 sudo 命令 | Jan 15 20:57:35 box sshd[27162]: Invalid user aiden from 192.168.1.133 port 59876 |
| /var/log/kern.log | 可用于查找 Linux 内核消息,如硬件问题或与 Linux 内核相关的一般信息 | Jan 16 19:18:47 box kernel: [2397.472979] Out of memory: Killed process 20371 (nginx) total-vm:571408kB, anon-rss:524540kB, file-rss:456kB, shmem-rss:8kB, UID:0 pgtables:1100kB oom_score_adj:1000 |
| /var/log/dmesg | 包含自上次启动以来主机的启动消息,可用于多种故障排查场景,如端口耗尽、硬件故障和内存不足 | [1.036655] kernel: e1000: Intel(R) PRO/1000 Network Driver - version 7.3.21 - k8 - NAPI |

journalctl 常用命令

在使用 systemd 的主机上,所有这些常见日志都存储在一个名为 journal 的单个二进制流中,可以使用 journalctl 命令行应用程序访问。以下是一些常见的 journalctl 命令:
- 按最新行优先查看所有日志

$ sudo journalctl -r
  • 查看特定时间段内的日志
$ sudo journalctl -r --since "2 hours ago"
  • 按系统服务名称过滤日志
$ sudo journalctl -r -u ssh
  • 按日志级别显示日志
$ sudo journalctl -r -u ssh -p err
  • 使用正则表达式匹配特定消息
$ sudo journalctl -r -u ssh -g "session opened"

如果使用的是较旧版本的 journald ,可能不包含 grep 模式匹配功能,此时可以使用以下命令将搜索结果通过管道传递给 grep 命令:

sudo journalctl -r -u ssh | grep "session opened"

通过合理使用这些日志和命令,可以更高效地排查网络连接和服务故障。后续我们还会介绍如何使用 grep awk 命令进一步解析日志。

网络连接拒绝与日志排查全解析

日志解析工具

在故障排查过程中,解析日志是一项关键技能。除了 journalctl 之外, grep awk 也是非常实用的日志解析工具。

grep 命令

grep 命令用于在文本或文件中快速搜索特定模式。以下是一些常见的使用场景及操作步骤:

  • 搜索特定 IP 地址 :要在 /var/log/syslog 中查找所有包含 10.0.2.33 的日志行,可以使用以下命令:
$ grep "10.0.2.33" /var/log/syslog

示例输出:

... box postfix/smtpd[6520]: connect from unknown[10.0.2.33]
... box postfix/smtpd[6520]: disconnect from unknown[10.0.2.33] ehlo=1 auth=0/1 quit=1 commands=2/3
  • 查找无权限执行 sudo 命令的用户 :在 /var/log/auth.log 中搜索尝试执行 sudo 命令但没有权限的用户,可以使用以下命令:
$ grep "user NOT in sudoers" /var/log/auth.log

示例输出:

Jan 31 17:37:40 box sudo: akira : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/akira ; USER=root ; COMMAND=/usr/bin/cat /etc/passwd
  • 获取匹配行前后的额外日志行 :使用 -A 标志可以获取匹配行之后的指定数量的日志行, -B 标志可以获取匹配行之前的指定数量的日志行, -C 标志可以同时获取匹配行前后的指定数量的日志行。例如,要获取用户 akira 无权限执行 sudo 命令的日志行之前的 5 行日志,可以使用以下命令:
$ grep -B 5 "user NOT in sudoers" /var/log/auth.log

示例输出:

Jan 31 17:37:35 box sshd[64646]: pam_unix(sshd:session): session opened for user akira by (uid=0)
Jan 31 17:37:35 box systemd-logind[632]: New session 169 of user akira.
Jan 31 17:37:35 box systemd: pam_unix(systemd-user:session): session opened for user akira by (uid=0)
Jan 31 17:37:38 box sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jan 31 17:37:40 box sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jan 31 17:37:40 box sudo: akira : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/akira ; USER=root ; COMMAND=/usr/bin/cat /etc/passwd
awk 命令

awk 命令不仅可以像 grep 一样搜索特定模式,还可以从任何列中过滤信息。以下是一些常见的使用场景及操作步骤:

  • 提取特定列信息 :要从 /var/log/nginx/access.log 中提取所有请求的源 IP 地址(通常是日志行的第一列),可以使用以下命令:
$ sudo awk '{print $1}' /var/log/nginx/access.log

示例输出:

127.0.0.1
192.168.1.44

如果要提取日志中的日期时间戳(通常是第四列),可以使用以下命令:

$ sudo awk '{print $4}' /var/log/nginx/access.log

如果要同时提取多个列的信息,可以使用逗号分隔列号,例如:

$ sudo awk '{print $1,$4}' /var/log/nginx/access.log
  • 根据特定列的内容过滤日志 :要在 /var/log/nginx/access.log 中搜索所有返回 HTTP 500 响应代码的请求(通常在第九列),可以使用以下命令:
$ sudo awk '($9 ~ /500/)' /var/log/nginx/access.log

示例输出:

10.0.2.15 - - [15/Feb/2022:19:41:46 +0000] "GET / HTTP/1.1" 500 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
总结

在网络服务故障排查过程中,我们可以按照以下流程进行操作:

graph LR
    A[发现连接拒绝错误] --> B[使用 curl 验证服务响应]
    B --> C{连接是否被拒绝}
    C -- 是 --> D[使用 ss 检查端口监听情况]
    C -- 否 --> E[排查其他问题]
    D --> F[使用 tcpdump 捕获网络流量]
    F --> G{流量是否到达服务器}
    G -- 是 --> H[检查 Docker 容器和应用配置]
    G -- 否 --> I[排查网络路由问题]
    H --> J[查看 Docker 系统日志和端口映射]
    J --> K[使用日志搜索和解析工具排查问题]
    K --> L[使用 journalctl 搜索日志]
    K --> M[使用 grep 解析日志]
    K --> N[使用 awk 解析日志]

通过使用 curl ss tcpdump 等命令可以初步定位网络连接问题,而查看 Docker 容器和应用程序配置可以进一步排查可能的故障点。同时,合理利用 journalctl grep awk 等日志搜索和解析工具,可以更高效地从系统和应用程序日志中获取有用信息,从而快速解决网络连接和服务故障。

总之,掌握这些工具和方法可以帮助我们在面对复杂的网络和服务故障时,有条不紊地进行排查和解决,确保系统的稳定运行。

【语音分离】基于平均谐波结构建模的无监督单声道音乐声源分离(Matlab代码实现)内容概要:本文介绍了基于平均谐波结构建模的无监督单声道音乐声源分离方法,并提供了相应的Matlab代码实现。该方法通过对音乐信号中的谐波结构进行建模,利用音源间的频率特征差异,实现对混合音频中不同乐器或人声成分的有效分离。整个过程无需标注数据,属于无监督学习范畴,适用于单通道录音场景下的语音音乐分离任务。文中强调了算法的可复现性,并附带完整的仿真资源链接,便于读者学习验证。; 适合人群:具备一定信号处理基础和Matlab编程能力的高校学生、科研人员及从事音频处理、语音识别等相关领域的工程师;尤其适合希望深入理解声源分离原理并进行算法仿真实践的研究者。; 使用场景及目标:①用于音乐音频中人声伴奏的分离,或不同乐器之间的分离;②支持无监督条件下的语音处理研究,推动盲源分离技术的发展;③作为学术论文复现、课程项目开发或科研原型验证的技术参考。; 阅读建议:建议读者结合提供的Matlab代码网盘资料同步运行调试,重点关注谐波建模频谱分解的实现细节,同时可扩展学习盲源分离中的其他方法如独立成分分析(ICA)或非负矩阵分解(NMF),以加深对音频信号分离机制的理解。
内容概要:本文系统介绍了新能源汽车领域智能底盘技术的发展背景、演进历程、核心技术架构及创新形态。文章指出智能底盘作为智能汽车的核心执行层,通过线控化(X-By-Wire)和域控化实现驱动、制动、转向、悬架的精准主动控制,支撑高阶智能驾驶落地。技术发展历经机械、机电混合到智能三个阶段,当前以线控转向、线控制动、域控制器等为核心,并辅以传感器、车规级芯片、功能安等配套技术。文中还重点探讨了“智能滑板底盘”这一创新形态,强调其高度集成化、模块化优势及其在成本、灵活性、空间利用等方面的潜力。最后通过“2025智能底盘先锋计划”的实车测试案例,展示了智能底盘在真实场景中的安性能表现,推动技术从研发走向市场验证。; 适合人群:汽车电子工程师、智能汽车研发人员、新能源汽车领域技术人员及对智能底盘技术感兴趣的从业者;具备一定汽车工程或控制系统基础知识的专业人士。; 使用场景及目标:①深入了解智能底盘的技术演进路径系统架构;②掌握线控技术、域控制器、滑板底盘等关键技术原理应用场景;③为智能汽车底盘研发、系统集成技术创新提供理论支持实践参考。; 阅读建议:建议结合实际车型和技术标准进行延伸学习,关注政策导向行业测试动态,注重理论实车验证相结合,面理解智能底盘从技术构想到商业化落地的过程。
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的技术资源,重点围绕电力系统中连锁故障的传播路径展开研究,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法,用于提升电力系统在复杂故障条件下的安鲁棒性。该模型通过Matlab代码实现,具备较强的工程应用价值和学术参考意义,适用于电力系统风险评估、脆弱性分析及预防控制策略设计等场景。文中还列举了大量相关的科研技术支持方向,涵盖智能优化算法、机器学习、路径规划、信号处理、电力系统管理等多个领域,展示了广泛的仿真复现能力。; 适合人群:具备电力系统、自动化、电气工程等相关背景,熟悉Matlab编程,有一定科研基础的研究生、高校教师及工程技术人员。; 使用场景及目标:①用于电力系统连锁故障建模风险评估研究;②支撑高水平论文(如EI/SCI)的模型复现算法验证;③为电网安分析、故障传播防控提供优化决策工具;④结合YALMIP等工具进行数学规划求解,提升科研效率。; 阅读建议:建议读者结合提供的网盘资源,下载完整代码案例进行实践操作,重点关注双层优化结构场景筛选逻辑的设计思路,同时可参考文档中提及的其他复现案例拓展研究视野。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值