好好的容器突然起不来,经定位是容器内无法访问外网了?测试又说没改网络配置,该如何定位网络问题

简介: 本文记录了一次解决前端应用集成到主应用后出现502错误的问题。通过与测试人员的沟通,最终发现是DNS配置问题导致的。文章详细描述了问题的背景、沟通过程、解决方案,并总结了相关知识点和经验教训,帮助读者学习如何分析和定位网络问题。

在工作中、团队协作时,可能遇到的问题,如集成测试等场景。但是作为偏前端的全栈,锅从天上来,不是你想甩就能甩,尤其面对测试等比较强势的团体(bug创造者),你必须有强大的心理承受能力+冷静的分析。

我会记录一次次的经历,复盘分析和分享,以便大家以后能不背锅而爱工作(#^.^#)

一 上下文环境描述

  • 部署使用docker compose
  • 应用是nodejs app
  • 数据库使用sqlite, prisma引擎
  • 宿主机 ubuntu server,一个远程的虚拟机内
  • 网络环境是内网nat
  • 前端应用使用iframe集成到主应用

二 问题沟通记录

  • 测试:提bug了,升级版本后看不到页面,报502,已截图

image.gif 编辑

  • 我:这关我啥事,我这边都没用到nginx
  • 测试:是你这边的页面打不开!而且是xx提交新版本之后,之前都没问题的
  • 我:那我看看
  • 我:是从jenkins下载的最新archive包吗?
  • 测试:是的啊!你看就是这儿
  • 我:(好像没错)看看你的部署yml文件
  • 测试:就改了个版本号(捣鼓了一阵)
  • 我:那你把版本改回去看看
  • 测试:之前是没问题的
  • 我:先回退看看是不是没问题
  • 测试:奇怪,也报错了(捣鼓一阵)
  • 我:这是网络问题(巴拉巴拉一阵,报错有prisma push的时候,无法访问一个地址)

这时候,锅其实在我们这边了,内网docker部署,按理说,不该还需要访问外网的。但之前不知道这个,心里分析了下,应该是同步schema的时候,命令还是配置不对,但我们可不能认怂,改或者亲自研究可需要不少时间,所以:必须甩出去,然后悄悄改好!

  • 我:你访问下这个网址,curl localhost:3000
  • 测试:连不上 (remote reset, nodejs没跑起来,能脸上才怪)
  • 我:curl一下这个报错的prisma地址
  • 测试:也连不上
  • 我:复制链接,在外面windows跑
  • 测试:可以访问
  • 我:这就是校验版本(我看页面是一个hash值,盲猜是校验hash确定版本完整性的)
  • 测试:该咋办?
  • 我:在里面ping一下baidu
  • 测试:咦,ping不通
  • 我:测试下route
  • 测试:route没问题啊,是xxx.254
  • 我:之前能启动?
  • 测试:是的
  • 我:是不是改什么网络配置了?巴拉巴拉(这时候一定要专业,脱口而出一大堆路由、防火墙、Nat的关键字)
  • 测试:我没改啊
  • 我:那可能是IT改了(反正不是我改的,而且网络都是IT部门控制的)
  • 测试:那这就不好办了,还要测试呢
  • 我:咦,你试着外面ping一下百度,拿到ip再里面ping ip
  • 测试:ip可以通(一通操作)
  • 我:那是dns出问题了
  • 测试:哦,我确实改过一点东西,改了dnsname(说着cat了一个文件)
  • 我:这里配置不对吧(虽然没见过这文件,但是个yml类似的,里面有route字段盲猜是路由配置to-via,还有个nameservices,我看就赔了一个本地的地址)
  • 测试:这是配的ad域得地址
  • 我:还加两行,114.114和8.8
  • 测试:之前也没啊,就把这个默认路由所在ip改成了现在这个
  • 我:先改了试试(我盲猜是因为以前默认路由作为dns服务时,它会把dns请求继续往上抛直到某个默认的DNS去)
  • 测试:好了,可以通了(佩服)
  • 我:那就好,以后改网络配置要注意啊(然后潇洒的走回去了)

三 复盘总结

  1. 先别接锅,没确定是我们的问题,不要假定是我们的问题(哪怕我们也有问题),不然会错过一些额外的原因,毕竟一次获得更多收获更好
  2. 别觉得麻烦,反正都是上班时间,就当离开休息下,毕竟指导人定位问题,比自己一直写代码会轻松一点点,尤其是写太久
  3. 要好好根据场景过一遍相关的知识点,哪怕不是很熟悉,关键字或者它的描述要记得

四 知识点解析

4.1 域名访问都需要DNS解析

       只要是通过非ip使用http,都需要经过dns解析,Domain Name Solve,它类似于一个将域名映射到某个ip地址(http是基于ip协议的,所以发送出去之前需要知道目的地ip)

4.2 DNS解析先经过主机配置的ip映射

       主机一般可以定义dns解析,例如windows的hosts文件,linux一般在/etc/hosts

4.3 DNS其次解析会经过DNS服务器

       如果主机的配置没有包含目标域名,则会请求dns服务器

     

五 DNS服务器配置

5.1 windows

       通过设置-网络和internet-连接界面配置

5.2 CentOS 配置自定义DNS服务器地址

5.2.1  编辑网络配置文件

在CentOS中,DNS服务器地址可以通过修改网络接口配置文件或全局的DNS配置文件来进行。

修改网络接口配置文件(适用于使用NetworkManager的系统):

一般网络配置文件位于 /etc/sysconfig/network-scripts/ifcfg-<interface_name>,例如:

sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

image.gif

在文件中,找到或添加如下的配置:

DNS1=8.8.8.8 
DNS2=8.8.4.4

image.gif

修改、增删、保存文件并退出。

5.2.2 重启网络服务

为了使更改生效,必须重启网络服务或系统。

sudo systemctl restart NetworkManager

image.gif

或者,针对特定的网络接口重启服务:

sudo ifdown eth0 && sudo ifup eth0

image.gif

5.2.3 验证DNS设置

可以通过以下命令验证DNS是否配置正确:

cat /etc/resolv.conf

image.gif

5.3 Ubuntu 配置自定义DNS服务器地址

Ubuntu系统上,特别是使用systemd-resolved的版本,可以通过Netplan或直接配置DNS进行设置。

5.3.1  使用Netplan配置(Ubuntu 18.04及以后)

Netplan是Ubuntu的新网络管理工具,配置文件通常位于 /etc/netplan/ 目录下。例如,编辑 50-cloud-init.yaml 文件:

sudo vi /etc/netplan/xxx.yaml

image.gif

在对应的网络接口下,找到 nameservers 部分,修改为你想要的DNS服务器地址:

network:
    version: 2
    ethernets:
        eth0:
            dhcp4: yes
            nameservers:
                addresses:
                    - 8.8.8.8
                    - 8.8.4.4

image.gif

保存并退出后,测试Netplan配置:

sudo netplan try

image.gif

如果没报错就可以应用配置:

sudo netplan apply

image.gif

5.3.2  通过 systemd-resolved 配置(推荐)

对于使用 systemd-resolved 的Ubuntu版本,可以通过 systemd-resolved 进行配置:

编辑 /etc/systemd/resolved.conf 文件:

sudo nano /etc/systemd/resolved.conf

image.gif

找到或取消注释 DNS= 行并添加自定义DNS服务器:

DNS=8.8.8.8 8.8.4.4

image.gif

保存并退出后,重启 systemd-resolved 服务:

sudo systemctl restart systemd-resolved

image.gif

5.3.3  验证DNS设置

与CentOS类似,可以通过以下命令查看配置是否生效:

cat /etc/resolv.conf

image.gif

如果你使用的是 systemd-resolved,可以使用 systemd-resolve --status 查看详细信息。

六 总结

6.1 修改DNS服务器地址要小心

如果需要指向自定义的域名,若是单个地址,修改hosts文件会更快更稳。指向某个自定义dns服务器时,不要去掉了原来的dns服务器地址,而是添加地址

6.2 url不可达先分析DNS其次是路由

如果不是ip的地址,切勿忘记先检查DNS,哪怕觉得没有改什么

希望从我这次经历,前端想转后端的小伙伴等,能够学会分析和定位网络问题哈。有什么想补充的,欢迎留言

相关文章
|
8月前
|
网络协议 Linux 虚拟化
配置VM网络:如何设定静态IP以访问主机IP和互联网
以上就是设定虚拟机网络和静态IP地址的基本步骤。需要注意的是,这些步骤可能会因为虚拟机软件、操作系统以及网络环境的不同而有所差异。在进行设定时,应根据具体情况进行调整。
575 10
|
9月前
|
Shell 开发工具 git
使用代理访问网络各项命令总结
工作中常需设置代理,容易导致环境混乱。本文总结了 SourceTree 无法拉取代码的问题,排查了环境变量、Git 全局配置及系统代理设置,最终通过清除 Git 代理配置解决。内容涵盖排查步骤、命令整理及脚本处理,帮助快速定位并解决代理相关网络问题。
496 3
|
Docker 容器
Docker网关冲突导致容器启动网络异常解决方案
当执行`docker-compose up`命令时,服务器网络可能因Docker创建新网桥导致IP段冲突而中断。原因是Docker默认的docker0网卡(172.17.0.1/16)与宿主机网络地址段重叠,引发路由异常。解决方法为修改docker0地址段,通过配置`/etc/docker/daemon.json`调整为非冲突段(如192.168.200.1/24),并重启服务。同时,在`docker-compose.yml`中指定网络模式为`bridge`,最后通过检查docker0地址、网络接口列表及测试容器启动验证修复效果。
1780 39
|
11月前
|
存储 Linux 容器
【Container App】在容器中抓取网络包的方法
本文介绍在Azure Container App中安装tcpdump抓取网络包,并通过Storage Account上传抓包文件的方法。内容包括使用curl和nc测试外部接口连通性、长Ping端口、安装tcpdump、抓取网络包、以及通过crul命令上传文件至Azure Storage。适用于需要分析网络请求和排查网络问题的场景。
310 0
|
域名解析 监控 网络协议
21.7K star!再见吧花生壳,没有公网ip,也能搞定所有网络访问!内网穿透神器NPS
“nps”是一款强大的内网穿透工具,支持多种协议与功能。它无需公网IP或复杂配置,可实现远程桌面、文件共享和私有云搭建等。项目采用Go语言开发,具有高性能与轻量级特点,适用于远程办公、物联网管理等场景。其核心亮点包括零配置穿透、多级代理网络、实时流量监控及企业级安全特性。对比同类工具,“nps”在安装复杂度、协议支持和管理界面方面表现优异。项目地址:https://github.com/ehang-io/nps。
2848 12
|
网络协议 Shell 网络安全
面试官想听的不仅是命令——如何结构化回答“容器无Shell时如何测试外网”?
“说说看,如果一个Pod的容器没有Shell,如何测试它能否访问外网?”
面试官想听的不仅是命令——如何结构化回答“容器无Shell时如何测试外网”?
|
Kubernetes Cloud Native 区块链
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
417 0
|
网络协议 网络安全
如何使用Traceroute定位网络问题?
`Traceroute` 是网络诊断工具,用于追踪数据包从源主机到目标主机的路径,帮助定位网络延迟、路由故障或中间节点问题。常用参数包括禁用DNS解析(`-n`)、指定最大跳数(`-m`)、每跳探测包数量(`-q`)等。结果解读涉及时间值、符号含义(如`*`表示未响应),并可进行高级用法如指定源接口、强制使用ICMP或TCP协议。常见问题包括中间节点高延迟、路径终点无法到达和路径环路,需根据具体情况进行排查和解决。
2786 1
|
安全 程序员 Linux
全球头号勒索软件来袭!即刻严控网络访问
全球头号勒索软件来袭!即刻严控网络访问
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
1069 2