首页 > 其他分享 >实例讲解看nsenter带你“上帝视角”看网络

实例讲解看nsenter带你“上帝视角”看网络

时间:2023-07-06 15:03:14浏览次数:50  
标签:容器 视角 tsjsdbd nsenter 实例 ubuntu root

摘要:本文重点关注进入目标进程的“网络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

 

点击关注,第一时间了解华为云新鲜技术~

标签:容器,视角,tsjsdbd,nsenter,实例,ubuntu,root
From: https://www.cnblogs.com/huaweiyun/p/17532141.html

相关文章

  • ASP.NET Core 6框架揭秘实例演示[42]:检查应用的健康状况
    现代化的应用及服务的部署场景主要体现在集群化、微服务和容器化,这一切都建立在针对部署应用或者服务的健康检查上。ASP.NET提供的健康检查不仅可能确定目标应用或者服务的可用性,还具有健康报告发布功能。ASP.NET框架的健康检查功能是通过HealthCheckMiddleware中间件完成的。我们......
  • C#图片按比例缩放实例
    下面是关于C#图片按比例缩放实例的详细攻略。步骤一:导入命名空间和设置窗口首先,在代码中导入必要的命名空间,以使用Image类和Bitmap类。usingSystem.Drawing;usingSystem.Drawing.Imaging;接着,在窗口中添加PictureBox控件,用于显示缩放后的图片。在属性中将SizeMode设置为Zo......
  • ASP.NET Core 6框架揭秘实例演示[41]:跨域资源的共享(CORS)N种用法
    同源策略是所有浏览器都必须遵循的一项安全原则,它的存在决定了浏览器在默认情况下无法对跨域请求的资源做进一步处理。为了实现跨域资源的共享,W3C制定了CORS规范。ASP.NET利用CorsMiddleware中间件提供了针对CORS规范的实现。(本文提供的示例演示已经同步到《ASP.NETCore6框架揭......
  • keepalived高可用服务搭建——单实例
    准备四台机器hostnameIP说明lb0110.0.0.30keepalived主服务器(nginx主负载均衡)lb0210.0.0.60Keepalived备服务器(Nginx辅负载均衡)www0110.0.0.40www01www0210.0.0.50www02安装keepalived(lb01,lb02)[root@lb01~]#yuminstallkeepalived-y[roo......
  • 用 IaC 的方式管理 EC2 实例 - 每天5分钟玩转 GPT 编程系列(1)
    目录写在前面你听我说HelloDevChat第一轮第二轮第三轮成果检验总结一下写在前面咳咳,开个系列吧,就叫《每天5分钟玩转GPT编程》。在这个系列里我们将分享各种借助GPT解决实际工作问题的经验,包括但不限于让GPT辅助写代码。咳咳,敲黑板:本系列文章欢迎大家投稿,分享出你使用G......
  • spring启动流程 (2) Bean实例化流程
    本文通过阅读Spring源码,分析Bean实例化流程。Bean实例化入口上一篇文章已经介绍,Bean实例化入口在AbstractApplicationContext类的finishBeanFactoryInitialization方法:protectedvoidfinishBeanFactoryInitialization(ConfigurableListableBeanFactorybeanFactory){ //Ini......
  • 光脚丫思考Vue3与实战:第03章 Vue实例
    下面是本文的屏幕录像的在线视频:03-Vue实例04-生命周期示意图+钩子函数温馨提示:1、视频下载:线上视频被压缩处理,可以下载高清版本:03-Vue实例:https://pan.baidu.com/s/1O9lUFm2jRIlBeFrBjXPZIA 提取码:nbzt03-生命周期示意图+钩子函数:https://pan.baidu.com/s/1D4ndTSgPBNGE8D4_......
  • 选读SQL经典实例笔记01_检索和排序
    1. 在WHERE子句中引用别名列1.1. 当表里的某些列没有被恰当命名的时候,这个技巧尤其有用1.2. sqlselectsalassalary,commascommissionfromempwheresalary<50001.3. 内嵌视图1.3.1.  sqlselect*from(selectsalassalary,commascommission......
  • docker学习三 实例部署
    1、nginx的docker部署1.1、下载nginx镜像dockerpullnginx1.2、运行nginx镜像[root@iZbp10j4antmyah3ya8nioZ~]#dockerrun-d-p80:80--namemynginx01nginx1c48fb6b753f73e59740c4dbd86006e68f09d8c83ba2fe8c666cb3422ec56af7[root@iZbp10j4antmyah3ya8nioZ~]#do......
  • C# opc ua客户端实例源码,带ef6+sqlite
    C#opcua客户端实例源码,带ef6+sqlite。代码有完整的注解,及包括所有的链接库和程序结构思维图。纯学习资料原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/638904489888.html......