nsenter에서 Linux 네임 스페이스를 터치합니다.
네임스페이스 나열
lsns
에서 네임스페이스 목록을 볼 수 있습니다. 컨테이너에서 bash 를 실행하는 컨테이너를 만든 상태에서 lsns
를 실행한 결과가 아래와 같습니다. 여러 TYPE의 네임 스페이스가 만들어 졌음을 알 수 있습니다.# lsns -o NS,TYPE,PATH,NPROCS,PID,PPID,COMMAND,UID,USER
NS TYPE PATH NPROCS PID PPID COMMAND UID USER
4026531835 cgroup /proc/1/ns/cgroup 126 1 0 /sbin/init 0 root
4026531836 pid /proc/1/ns/pid 124 1 0 /sbin/init 0 root
4026531837 user /proc/1/ns/user 126 1 0 /sbin/init 0 root
4026531838 uts /proc/1/ns/uts 124 1 0 /sbin/init 0 root
4026531839 ipc /proc/1/ns/ipc 124 1 0 /sbin/init 0 root
4026531840 mnt /proc/1/ns/mnt 120 1 0 /sbin/init 0 root
4026531861 mnt /proc/19/ns/mnt 1 19 2 kdevtmpfs 0 root
4026531993 net /proc/1/ns/net 124 1 0 /sbin/init 0 root
4026532157 mnt /proc/446/ns/mnt 1 446 1 /lib/systemd/systemd-udevd 0 root
4026532167 mnt /proc/490/ns/mnt 1 490 1 /lib/systemd/systemd-networkd 100 systemd-network
4026532168 mnt /proc/518/ns/mnt 1 518 1 /lib/systemd/systemd-resolved 101 systemd-resolve
4026532193 mnt /proc/27142/ns/mnt 2 27142 27104 bash 0 root
4026532194 uts /proc/27142/ns/uts 2 27142 27104 bash 0 root
4026532195 ipc /proc/27142/ns/ipc 2 27142 27104 bash 0 root
4026532196 pid /proc/27142/ns/pid 2 27142 27104 bash 0 root
4026532198 net /proc/27142/ns/net 2 27142 27104 bash 0 root
컨테이너 내에서 실행 중인 프로세스의 PID(이 예에서는 27142)가
lsns
와 일치함을 알 수 있습니다.# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef0425afad12 nicolaka/netshoot "bash" 54 minutes ago Up 54 minutes vigilant_hopper
# docker inspect --format {{.State.Pid}} ef0425afad12
27142
네임스페이스로 들어가기
nsenter
커멘드를 사용하면(자) namespace 안에 들어가 커멘드를 실행할 수 있어 편리합니다. 예를 들어, 컨테이너 내에는 netstat 명령이 들어 있지 않지만, 실행하고 싶을 때는 이하와 같이, --target PID
로 대상 프로세스를 지정합니다.network namespace 에 들어가는 경우는 --net
지정합니다.# nsenter --target 27142 --net netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 172.17.0.2:53400 172.217.175.238:80 TIME_WAIT
--mount
를 지정하면 mount namespace가됩니다. --all
로 모든 타입의 namespace 에 들어갑니다.# nsenter --target 27142 --all cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.13.2
PRETTY_NAME="Alpine Linux v3.13"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
네트워크 계층 구조 모델 및 네임 스페이스
네임 스페이스의 영향을받는 것
netstat
명령은 namespace 에 의해 보이는 범위가 바뀝니다. 예를 들어, 컨테이너 내에서 curl http://google.com/
를 실행한 직후의 상태입니다.# nsenter --target 27142 --all netstat -ant | grep 80
tcp 0 0 172.17.0.2:34148 216.58.197.206:80 TIME_WAIT
# netstat -ant | grep 80
# 何も表示されない
arp
명령도 마찬가지입니다.# nsenter --target 27142 --all arp
? (172.17.0.1) at 02:42:b0:b9:9b:50 [ether] on eth0
# arp
Address HWtype HWaddress Flags Mask Iface
172.17.0.2 ether 02:42:ac:11:00:02 C docker0
10.0.2.3 ether 52:54:00:12:35:03 C eth0
_gateway ether 52:54:00:12:35:02 C eth0
네임 스페이스의 영향을받지 않는 것
반면에
tcpdump
명령은 네임스페이스의 영향을 받지 않습니다. 컨테이너내에서 curl http://google.com/
를 실행했을 때의 결과입니다. tcpdump
는 보다 낮은 레이어(데이터 링크 레이어 L2)의 정보를 취득하기 때문입니다.# コンテナ内部で tcpdump を実行した結果
13:19:41.076077 IP a8c89c57d8ef.40442 > nrt12s36-in-f14.1e100.net.80: Flags [P.], seq 0:74, ack 1, win 64240, length 74: HTTP: GET / HTTP/1.1
# コンテナ外部で tcpdump を実行した結果
13:19:41.076207 IP vagrant.40442 > nrt12s36-in-f14.1e100.net.http: Flags [P.], seq 0:74, ack 1, win 64240, length 74: HTTP: GET / HTTP/1.1
컨테이너 외부에서
iptraf-ng
를 사용하면 컨테이너 내에서 긴 TCP 연결을 나열할 수 있어 편리합니다.참고
htps : // 코 m / 미나미 조요 / ms / 9d d59109 9 1000
htps : // 기주 b. 코 m / 니코 / 네 t 쇼오 t
Reference
이 문제에 관하여(nsenter에서 Linux 네임 스페이스를 터치합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hiromitsu7/items/4a7f9f29c7d995b3b691텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)