을 사용하여 네트워크 네임스페이스를 만듭니다 unshare --map-root-user --net --mount --keep-caps "do_stuff"
.
저는 네임스페이스를 인터넷에 연결하는 데 사용합니다 slirp4netns --configure --mtu=65520 $ns-id tap0
. 또한 이를 통해 네임스페이스 내에서 액세스할 수 있으므로
호스트 컴퓨터에서 웹 서버를 실행하고 네임스페이스 내에서 연결할 수 있습니다.localhost
10.0.2.2
웹서버 운영이 가능한가요?네임스페이스에서, 호스트 시스템에서 연결하시겠습니까? 포트 포워딩 같은 거요?
답변1
이는 네임스페이스 제한을 완전히 우회하여 TCP 포트를 전달하는 방법입니다.
socat
및 UNIX 소켓
네임스페이스에 의해 방해받지 않는 통신 유형 중 하나는 표준(이름이 지정된) UNIX 소켓입니다(오직추상적인UNIX 소켓은 네트워크 네임스페이스에 의존합니다. socat
호스트에서 사용자/네트워크 네임스페이스로의 통신은 한 쌍의 명령을 사용하여 UNIX 소켓을 통해 TCP를 프록시함으로써 쉽게 수행될 수 있습니다.
OP의 변수 ( 올바른 구문을 갖도록 $ns_id
a로 변경됨 )에 올바른 PID 내용이 있다고 가정합니다. _
다음은 두 개의 추가 터미널을 사용하여 대화형으로 실행하는 예입니다.
term1: (사용자/네트워크 네임스페이스 부분)
socat
."do_stuff"
nsenter
여기서는 호스트/초기 네임스페이스에서 실행됩니다.
nsenter
최근에 생성된 네임스페이스에 가입하세요.nsenter --preserve-credentials --user --mount --net -t $ns_id -- socat UNIX-LISTEN:/tmp/conduit,unlink-early,fork TCP4:127.0.0.1:80
term2(호스트/초기 네임스페이스 부분):
socat TCP4-LISTEN:8080,reuseaddr,fork UNIX-CONNECT:/tmp/conduit
이제 http://<host>:8080/에 연결하여 포트 80에서 수신 대기 중인 user/net 네임스페이스의 웹 서버에 연결할 수 있습니다. 트래픽은 UNIX 소켓을 통과합니다 /tmp/conduit
.
노트
사용자/네트워크 네임스페이스가 TCP/IP를 사용 가능하게 만드는 명령을 수신하는 한 이 설정은
slirp4netns
전혀 실행될 필요조차 없습니다.ip link set dev lo up
어딘가에. 웹 서버를 구성하는 것을 상상할 수도 있습니다(아마도nginx
그런 다음) 자체는 TCP 포트 80 대신 UNIX 소켓에서 직접 수신하고 두 번째socat
명령만 보유합니다(어떤 명령의 올바른 처리를 보장하지는 않지만).소켓 자격 증명이것이 사용되는 경우).마찬가지로 제한된 방식으로 UDP 트래픽을 프록시할 수 있어야 하지만 UDP 사용에 따라 다양한 주의 사항이 있습니다. 일부 용도에서는 단순히
socat
명령의 TCP 부분을 UDP로 변경해야 하고, 다른 용도에서는 UNIX 소켓 부분을 스트림 소켓에서 데이터그램 소켓(UNIX-LISTEN
->UNIX-RECVFROM
등)으로 변경해야 합니다. 시간 초과 옵션이 필요할 수도 있습니다-T
.socat
검증되지 않은.
답변2
좋다소켓 상자별도의 설정 없이 격리된 네트워크 네임스페이스 내에서 서비스를 노출하도록 특별히 설계된 도구입니다 veth
.
어쩌면 나만의 도구일지도 몰라netns_tcp_bridge비슷한 효과(덜 효율적)를 얻을 수 있지만 권한이 없는 사용자 네임스페이스에서 작동하는지 확인하지 않았습니다.