Примеры для объяснения и просмотра nsenter позволяют вам смотреть Интернет с «точки зрения Бога»

Аннотация: В этой статье основное внимание уделяется входу в целевой процесс с точки зрения «сети ns», то есть рассмотрению сетевого мира внутри контейнера с «точки зрения процесса в контейнере» и выполнению команд с этой точки зрения.

Эта статья опубликована в сообществе Huawei Cloud « Изучаем облачную сеть с учителем Тан» — nsenter Magic Wand , автор: 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, как следует из названия, «входит в различные пространства имен», то есть команда nsenter может войти в перспективу ns указанного целевого процесса.

Таким образом, nsenter может смотреть на мир с «точки зрения» указанного процесса.Эта статья посвящена «сетевой ns» перспективе входа в целевой процесс, то есть с «точки зрения процесса в контейнере», чтобы посмотреть на сетевой мир внутри контейнера и выполнить в этой перспективе порядок.

Во-первых, нам нужно найти идентификатор целевого процесса «целевого ns» для входа. То есть: корневой процесс в контейнере

[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, и входим в его «перспективу», и мы можем видеть мир внутри контейнера. А поскольку мы, как контроллер, в это время все еще находимся на хосте, мы можем выполнять на хосте различные командные строки.

следующее:

[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, связанные с сетью, могут быть выполнены.

Более того, все эти команды выполняются с точки зрения контейнера, поэтому эффект такой же, как и в контейнере (хотя сами они инициируются в хосте).

Подобно фильмам «Исходный код» и «Матрица», используйте «людей» во внешнем мире для управления поведением во «внутреннем мире» . Надеюсь, вы понимаете логику этой перспективы Бога :-)

Суммарное использование:

(1) Найдите PID целевого процесса

docker inspect xxx

(2) Выполнять определенные команды cli напрямую

nsenter -n -t 822647 ifconfig

(3) Войдите в перспективу контейнера и выполните интерактивный клик.

nsenter -n -t 822647
exit

 

Нажмите, чтобы подписаться и узнать о свежих технологиях Huawei Cloud впервые~

Выпускники Национального народного университета украли информацию обо всех студентах школы, чтобы создать веб-сайт для оценки красоты, и были задержаны в уголовном порядке.Официально выпущена новая версия QQ для Windows, основанная на архитектуре NT.Соединенные Штаты ограничат использование Китая Amazon, Microsoft и других облачных сервисов, обеспечивающих обучение моделей ИИ Проекты с открытым исходным кодом объявили о прекращении разработки функций функции изображения терминала Количество регистраций потоков превысило 30 миллионов. «Изменение» Deepin использует Asahi Linux, чтобы адаптироваться к рейтингу базы данных Apple M1 в июле: Oracle растет, снова открывая счет
{{о.имя}}
{{м.имя}}

рекомендация

отmy.oschina.net/u/4526289/blog/10086822