TUN/TAP 인터페이스만 사용하여 네트워크 네임스페이스 간에 패킷을 보낼 수 있습니까?

TUN/TAP 인터페이스만 사용하여 네트워크 네임스페이스 간에 패킷을 보낼 수 있습니까?

저는 다양한 유형의 (가상) 인터페이스(예: TUN/TAP, veth 등) 간의 차이점을 이해하고 컨테이너의 맥락에서 그 중 일부를 연구하려고 노력하고 있습니다.

TUN/TAP 인터페이스만 사용하여 컨테이너(자체 네트워크 네임스페이스에 있음)와 호스트의 네트워크 네임스페이스 간에 패킷을 보내는 것이 가능합니까? 아니면 이 작업을 수행하려면 한 쌍의 veth 쌍(각 네임스페이스에 하나씩)이 필요합니까?

제가 이해한 바에 따르면 TUN/TAP 인터페이스는 네트워크 네임스페이스 간이 아닌 인터페이스의 네트워크 네임스페이스에 해당하는 네트워크 스택에서 사용자 공간으로 패킷을 보내고 받는 데만 사용할 수 있습니다. 맞습니까?

답변1

tun/tap 인터페이스는 항상 애플리케이션에 속합니다. 이 인터페이스로 전송된 패킷은 애플리케이션에서 읽히고 애플리케이션에서 작성한 패킷은 이 인터페이스를 통해 커널 네트워크 스택에 들어갑니다.

일반적으로 가상 이더넷 쌍(veth)을 사용하여 네트워크 네임스페이스를 연결합니다. 그들은 단순히 패킷을 쌍의 다른 인터페이스로 전달합니다.

두 개의 tun/tap 인터페이스를 열고, 한 인터페이스에서 패킷을 읽고 다른 인터페이스로 전달하거나 그 반대로 전달하는 등 정확히 이 작업을 수행하는 애플리케이션을 작성하는 데 방해가 되는 것은 없습니다. 와 같은 기성 애플리케이션을 사용하여 이 작업을 수행할 수도 있습니다 socat.

두 개의 애플리케이션을 작성할 수도 있습니다. 각 애플리케이션은 tun/tap 인터페이스를 열고 애플리케이션은 전달을 달성하기 위해 다른 방법을 통해 통신합니다. 기본적으로 모든 VPN 앱은 이 방식으로 작동합니다(VPN 앱의 경우 "다른 수단으로"는 일반적으로 "기존 네트워크 연결을 통해"이므로 실제로는 중요하지 않습니다).

그렇습니다. 올바른 애플리케이션을 사용하면 tun/tap 인터페이스를 사용하여 네임스페이스에 연결할 수 있습니다. 그러나 일반적으로 이러한 응용 프로그램을 작성해야 하고 veth-pair를 사용하는 것보다 효율성이 떨어지기 때문에 이렇게 하는 것은 그다지 의미가 없습니다.

편집하다

tun 인터페이스를 내가 만든 네트워크 네임스페이스로 이동해 보았 더니 socat기본 네트워크 네임스페이스에서 실행했음에도 불구하고 ns0예상대로 잘 작동했습니다 .socat

socat TUN:10.1.0.254/24,tun-name=tun0a,iff-up TUN:10.1.0.1/24,tun-name=tun0b
ip link set tun0b netns ns0

tun0b그런 다음 이동된 주소를 다시 설정해야 합니다.

따라서 "인터리빙"은 프로세스와 다른 네임스페이스에 하나(또는 두 개의) tun/tap 네트워크 인터페이스를 가짐으로써 달성됩니다.

관련 정보