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

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

摘要:本文重点关注进入目标进程的“网络ns”视角,即站在「容器中的进程视角」看待容器里面的网络世界,并在那个视角中执行命令。
本文分享自华为云社区《《跟唐老师学习云网络》 - nsenter魔法棒》,作者:tsjsdbd 。
有时候Docker容器中缺少需要的软件。比如 curl,wget,ifconfig,ip,tcpdump 等基础软件包,什么都干不了,很是让人抓狂。
  1. [root@tsjsdbd home]# docker exec -it 8402 /bin/bash
  2. root@8402d89fe04a:/# ifconfig
  3. bash: ifconfig: command not found
  4. root@8402d89fe04a:/# ip
  5. bash: ip: command not found
  6. root@8402d89fe04a:/# tcpdump
  7. bash: tcpdump: command not found
  8. root@8402d89fe04a:/# curl
  9. bash: curl: command not found
  10. root@8402d89fe04a:/# nslookup
  11. bash: nslookup: command not found
  12. root@8402d89fe04a:/# wget
  13. wget: missing URL
  14. Usage: wget [OPTION]... [URL]...
复制代码
面对这种容器镜像,定位问题就会很困难,因为你进入容器后,想执行命令还得重新安装各种基础软件,非常麻烦。
这个时候,我们要拿起“nsenter”这个根魔法棒,在主机上上面挥舞起来。
ns-enter,顾名思义,就是「进入各种namespace」,即nsenter命令可以进入到指定目标进程的ns视角。
所以nsenter可以站在指定进程的“视角”看世界,本文重点关注进入目标进程的“网络ns”视角,即站在「容器中的进程视角」看待容器里面的网络世界,并在那个视角中执行命令。
首先,我们要找到,要进入的「目标ns」的目标进程ID。即:容器里面的根进程
  1. [root@tsjsdbd ubuntu]# docker inspect 8402d89fe04a
  2. [
  3.     {
  4.         "Id": "8402d89fe04a7e161faf8a01a86c47f8402d4c8d7207b6897d8e6d661d670df4",
  5.         "State": {
  6.             "Status": "running",
  7.             "Pid": 18751,
  8.             "ExitCode": 0,
  9.             "Error": "",
  10.             "StartedAt": "2023-05-10T03:12:19.221460059Z",
  11.             "FinishedAt": "0001-01-01T00:00:00Z"
  12.         },
复制代码
容器里的“老大”是进程18751号。
所以我们直接在Host主机上,跟踪这个进程,并进入它的“视角”,我们就可以看到容器里面的世界了。而且由于我们这个时候,作为控制者,还是处在Host主机上的,因此可以执行Host主机上的各种命令行。
如下:
  1. [root@tsjsdbd ubuntu]# nsenter -t 18751 -n ifconfig
  2. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
  3. inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
  4.         ether 02:42:ac:11:00:02 txqueuelen 0  (Ethernet)
  5.         RX packets 1688355  bytes 194318903 (185.3 MiB)
  6.         RX errors 0  dropped 0  overruns 0  frame 0
  7.         TX packets 138826  bytes 146246172 (139.4 MiB)
  8.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  9. lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
  10. inet 127.0.0.1  netmask 255.0.0.0
  11. loop  txqueuelen 0  (Local Loopback)
  12.         RX packets 13939  bytes 13140220 (12.5 MiB)
  13.         RX errors 0  dropped 0  overruns 0  frame 0
  14.         TX packets 13939  bytes 13140220 (12.5 MiB)
  15.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
复制代码
其他命令,照搬都可以执行。
比如,容器里面没有nslookup命令,但是只有Host主机上有,咱就可在容器中执行它:
  1. [root@tsjsdbd ubuntu]# nsenter -t 18751 -n nslookup www.baidu.com
  2. Server:       10.129.2.34
  3. Address:   10.129.2.34#53
  4. Non-authoritative answer:
  5. www.baidu.com canonical name = www.a.shifen.com.
  6. Name:  www.a.shifen.com
  7. Address: 14.119.104.254
  8. Name:  www.a.shifen.com
  9. Address: 14.119.104.189
复制代码
所以原本在容器里面,无法执行的调试行为,就这么可以完成调试。
更直接的,如果不带最后的执行命令参数,可以直接进到“目标视角”里面去,进行交互式执行cli:
  1. [root@tsjsdbd ubuntu]# nsenter -t 18751 -n
  2. #这里就进入交互模式,相当于没有填写cli时,默认执行[当前bash]
  3. [root@tsjsdbd ubuntu]# ip addr
  4. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
  5. 4261: eth0@if4262: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
  6. [root@tsjsdbd ubuntu]# curl
  7. curl: try 'curl --help' or 'curl --manual' for more information
  8. [root@tsjsdbd ubuntu]# tcpdump
  9. listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
  10. ^C
  11. 0 packets captured
  12. 0 packets received by filter
  13. 0 packets dropped by kernel
  14. [root@tsjsdbd ubuntu]# exit
  15. #执行exit,可退出“目标视角”
复制代码
可以看到,所有的网络相关的cli命令行都可以执行。
并且,这些命令,都是站在容器内的“视角”执行的,所以效果与在容器中是一样的(虽然它们本身在Host中发起的)。
类似电影《源代码》《骇客帝国》中那样,用外面世界中的“人”,去控制“里面世界”中的行为。希望可以理解这种上帝视角的逻辑:-)
总结用法:
(1) 找到目标进程PID
  1. docker inspect xxx
复制代码
(2)直接执行特定的cli命令
  1. nsenter -n -t 822647 ifconfig
复制代码
(3)进入容器视角,进行交互式cli
  1. nsenter -n -t 822647
  2. exit
复制代码
 
点击关注,第一时间了解华为云新鲜技术~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表