네트워크 네임스페이스 및 slirp4netns - 호스트에서 네임스페이스 네트워크에 액세스

네트워크 네임스페이스 및 slirp4netns - 호스트에서 네임스페이스 네트워크에 액세스

을 사용하여 네트워크 네임스페이스를 만듭니다 unshare --map-root-user --net --mount --keep-caps "do_stuff".
저는 네임스페이스를 인터넷에 연결하는 데 사용합니다 slirp4netns --configure --mtu=65520 $ns-id tap0. 또한 이를 통해 네임스페이스 내에서 액세스할 수 있으므로
호스트 컴퓨터에서 웹 서버를 실행하고 네임스페이스 내에서 연결할 수 있습니다.localhost10.0.2.2

웹서버 운영이 가능한가요?네임스페이스에서, 호스트 시스템에서 연결하시겠습니까? 포트 포워딩 같은 거요?

답변1

이는 네임스페이스 제한을 완전히 우회하여 TCP 포트를 전달하는 방법입니다.

socat및 UNIX 소켓

네임스페이스에 의해 방해받지 않는 통신 유형 중 하나는 표준(이름이 지정된) UNIX 소켓입니다(오직추상적인UNIX 소켓은 네트워크 네임스페이스에 의존합니다. socat호스트에서 사용자/네트워크 네임스페이스로의 통신은 한 쌍의 명령을 사용하여 UNIX 소켓을 통해 TCP를 프록시함으로써 쉽게 수행될 수 있습니다.

OP의 변수 ( 올바른 구문을 갖도록 $ns_ida로 변경됨 )에 올바른 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비슷한 효과(덜 효율적)를 얻을 수 있지만 권한이 없는 사용자 네임스페이스에서 작동하는지 확인하지 않았습니다.

관련 정보