实例讲解看nsenter带你“上帝视角”看网络
摘要:本文重点关注进入目标进程的“网络ns”视角,即站在「容器中的进程视角」看待容器里面的网络世界,并在那个视角中执行命令。
本文分享自华为云社区《《跟唐老师学习云网络》 - nsenter魔法棒》,作者:tsjsdbd 。
有时候Docker容器中缺少需要的软件。比如 curl,wget,ifconfig,ip,tcpdump 等基础软件包,什么都干不了,很是让人抓狂。
[root@tsjsdbd home]# docker exec -it 8402 /bin/bash
root@8402d89fe04a:/# ifconfig
bash: ifconfig: command not found
root@8402d89fe04a:/# ip
bash: ip: command not found
root@8402d89fe04a:/# tcpdump
bash: tcpdump: command not found
root@8402d89fe04a:/# curl
bash: curl: command not found
root@8402d89fe04a:/# nslookup
bash: nslookup: command not found
root@8402d89fe04a:/# wget
wget: missing URL
Usage: wget [OPTION]... [URL]...
面对这种容器镜像,定位问题就会很困难,因为你进入容器后,想执行命令还得重新安装各种基础软件,非常麻烦。
这个时候,我们要拿起“nsenter”这个根魔法棒,在主机上上面挥舞起来。
ns-enter,顾名思义,就是「进入各种namespace」,即nsenter命令可以进入到指定目标进程的ns视角。
所以nsenter可以站在指定进程的“视角”看世界,本文重点关注进入目标进程的“网络ns”视角,即站在「容器中的进程视角」看待容器里面的网络世界,并在那个视角中执行命令。
首先,我们要找到,要进入的「目标ns」的目标进程ID。即:容器里面的根进程
[root@tsjsdbd ubuntu]# docker inspect 8402d89fe04a
[
{
"Id": "8402d89fe04a7e161faf8a01a86c47f8402d4c8d7207b6897d8e6d661d670df4",
"State": {
"Status": "running",
"Pid": 18751,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-05-10T03:12:19.221460059Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
容器里的“老大”是进程18751号。
所以我们直接在Host主机上,跟踪这个进程,并进入它的“视角”,我们就可以看到容器里面的世界了。而且由于我们这个时候,作为控制者,还是处在Host主机上的,因此可以执行Host主机上的各种命令行。
如下:
[root@tsjsdbd ubuntu]# nsenter -t 18751 -n ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 1688355 bytes 194318903 (185.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 138826 bytes 146246172 (139.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 0 (Local Loopback)
RX packets 13939 bytes 13140220 (12.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13939 bytes 13140220 (12.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
其他命令,照搬都可以执行。
比如,容器里面没有nslookup命令,但是只有Host主机上有,咱就可在容器中执行它:
[root@tsjsdbd ubuntu]# nsenter -t 18751 -n nslookup www.baidu.com
Server: 10.129.2.34
Address: 10.129.2.34#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 14.119.104.254
Name: www.a.shifen.com
Address: 14.119.104.189
所以原本在容器里面,无法执行的调试行为,就这么可以完成调试。
更直接的,如果不带最后的执行命令参数,可以直接进到“目标视角”里面去,进行交互式执行cli:
[root@tsjsdbd ubuntu]# nsenter -t 18751 -n
#这里就进入交互模式,相当于没有填写cli时,默认执行[当前bash]
[root@tsjsdbd ubuntu]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
4261: eth0@if4262: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
[root@tsjsdbd ubuntu]# curl
curl: try 'curl --help' or 'curl --manual' for more information
[root@tsjsdbd ubuntu]# tcpdump
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
[root@tsjsdbd ubuntu]# exit
#执行exit,可退出“目标视角”
可以看到,所有的网络相关的cli命令行都可以执行。
并且,这些命令,都是站在容器内的“视角”执行的,所以效果与在容器中是一样的(虽然它们本身在Host中发起的)。
类似电影《源代码》《骇客帝国》中那样,用外面世界中的“人”,去控制“里面世界”中的行为。希望可以理解这种上帝视角的逻辑:-)
总结用法:
(1) 找到目标进程PID
docker inspect xxx
(2)直接执行特定的cli命令
nsenter -n -t 822647 ifconfig
(3)进入容器视角,进行交互式cli
nsenter -n -t 822647
exit
实例讲解看nsenter带你“上帝视角”看网络的更多相关文章
- 【JVM】上帝视角看JVM内存模型,分而治之论各模块详情
1. 上帝视角 [树看JVM] [图看JVM] 2. 分而治之 2.1 堆区 构成:堆区由新生代和老年代组成,新生代中包含伊甸区(Eden).幸存者区(survivor from .survivor ...
- 《奥威Power-BI案例应用:带着漫画看报告》腾讯课程开课啦
元旦小假期过去了,不管是每天只给自己两次下床机会的你,还是唱K看电影逛街样样都嗨的你,是时候重振旗鼓,重新上路了!毕竟为了不给国家的平均工资水平拖后腿,还是要努力工作的.话说2016年已经过去了,什么 ...
- 带着问题看redux源码
前言 作为前端状态管理器,这个比较跨时代的工具库redux有很多实现和思想值得我们思考.在深入源码之前,我们可以相关注下一些常见问题,这样带着问题去看实现,也能更加清晰的了解. 常见问题 大概看了下主 ...
- float实例讲解
float实例讲解 float是个强大的属性,在实际前端开发过程中,人们经常拿它来进行布局,但有时,使用的不好,也麻烦多多啊. 比如,现在我们要实现一个两列布局,左边的列,宽度固定:右边的列,宽度自动 ...
- 【MySQL】分页查询实例讲解
MySQL分页查询实例讲解 1. 前言 本文描述了团队在工作中遇到的一个MySQL分页查询问题,顺带讲解相关知识点,为后来者鉴.本文的重点不是"怎样"优化表结构和SQL语句,而是探 ...
- 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)(转)
前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将献上一份非常详细Retrofit v2.0的使用教程,希望你们会 ...
- 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)
前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将献上一份非常详细Retrofit v2.0的使用教程,希望你们会 ...
- [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)
linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...
- Python装饰器实例讲解(二)
Python装饰器实例讲解(二) Python装饰器实例讲解(一) 你最好去看下第一篇,虽然也不是紧密的链接在一起 参考B站码农高天的视频,大家喜欢看视频可以跳转忽略本文:https://www.bi ...
- Python装饰器实例讲解(三)
Python装饰器实例讲解(三) 本文多参考<流畅的python>,在此基础上增加了一些实例便于理解 姊妹篇 Python装饰器实例讲解(一),让你简单的会用 Python装饰器实例讲解( ...
随机推荐
- Java设计模式 —— 代理模式
15 代理模式 15.1 代理模式概述 Proxy Pattern: 给某一个对象提供一个代理或占位符,由代理对象来控制对原对象的访问. 代理对象是客户端和目标对象的之前的桥梁,它接收来自客户端的请求 ...
- idea快捷键--增强for循环
增强for循环,用于遍历:数组或单列集合 快捷键: 数组.for
- Semantic Kernel 入门系列:💾Native Function
语义的归语义,语法的归语法. 基础定义 最基本的Native Function定义只需要在方法上添加 SKFunction 的特性即可. using Microsoft.SemanticKernel. ...
- 随手记:lnmp 安装完 redis 后无法全局操作
说明redis-server不是全局命令,那么假如到全局即可 假设redis安装目录是:/usr/local/redis/bin/redis-cli ln -s /usr/local/redis/b ...
- Pytorch实现分类器
本文实现两个分类器: softmax分类器和感知机分类器 Softmax分类器 Softmax分类是一种常用的多类别分类算法,它可以将输入数据映射到一个概率分布上.Softmax分类首先将输入数据通过 ...
- 1748E Yet Another Array Counting Problem
1748E Yet Another Array Counting Problem 目录 1748E Yet Another Array Counting Problem 题目大意: 做法 code 题 ...
- SpringBoot开启日志级别
#开启logging logging.level.org.springframework.boot.autoconfigure: error logging: level: main.blog.map ...
- JS中的Map、Set、WeakMap和WeakSet
在JavaScript中,Map.Set.WeakMap和WeakSet是四个不同的数据结构,它们都有不同的特点和用途: 1. Map :Map是一种键值对的集合,其中的键和值可以是任意类型的.与对象 ...
- live555中ts流详细解析
live555中ts流详细解析 该文档主要是对live555源码下testProgs中testMPEG2TransportStreamer服务器端的详细分析.主要分析ts流实现的总体调用流程.(重新整 ...
- 开发 Diffusers 库的道德行为指南
我们正在努力让我们每次发布的库更加负责! 我们很荣幸宣布我们发布了 道德守则,并将作为一部分其放入 Diffusers 库的说明文档. 由于扩散模型在现实世界上的实际应用例子会对社会造成潜在的负面影 ...