나는 최근 Linux TUN/TAP 인터페이스의 존재를 발견했으며 여전히 이를 이해하려고 노력하고 있습니다. 나는 기본 개념을 이해하고 있다고 생각합니다. 네트워크 인터페이스를 시뮬레이션하고 데이터를 하드웨어가 아닌 사용자 공간 프로그램에 전달하는 의사 장치를 만드는 것입니다.
관련 없는 프로그램이 터널을 사용하도록 어떻게 지시하시겠습니까?
예를 들어 터널을 만들기 전에 내 시스템에는 eth0 및 lo, 일반 이더넷 인터페이스(로컬 네트워크에 연결됨) 및 루프백 인터페이스만 포함되어 있었습니다. 프로그램이 터널을 생성하고 구성한 후에는 새로운 인터페이스 gr0이 생겼는데, 여기에 로컬 네트워크에 있지만 사용 중이 아닌 IP 주소를 제공했습니다(따라서 우리 둘 다 동일한 서브넷에 있었습니다). 이 "터널"을 이용하기 위해 관련 없는 프로그램을 얻으려면 어떻게 해야 합니까? TCP 연결을 활용하는 간단한 Python 메시징 클라이언트/서버 애플리케이션이 있다고 가정합니다. 터널을 사용하도록 어떻게 구성합니까?
제가 기본적인 것을 놓치고 있다면 사과드립니다. 하지만 늘 그렇듯 저는 사물의 계획에 혼란을 겪고 있습니다. 다시 말하지만, 내가 원하는 것은 이 터널을 활용하는 간단한 TCP 프로그램입니다.
감사해요!
답변1
항상 "터널"은 아닙니다. TUN/TAP은 특정 네트워크 카드 드라이버입니다. 네트워크 스택의 관점에서 볼 때 이는 다른 네트워크 인터페이스처럼 작동합니다. 즉, IP 주소를 가질 수 있고 지점 간 또는 브로드캐스트 인터페이스일 수 있습니다. 라우팅 규칙도 여기에 적용됩니다. 그러나 해당 네트워크 인터페이스 중 하나에 기록된 모든 트래픽은 처리를 위해 일부 사용자 공간 프로그램으로 이동하며, 사용자 공간 프로그램에서 직접 기록된 모든 데이터는 /dev/tunX
네트워크 스택으로 들어오는 패킷처럼 보입니다.
일반적인 터널 설정에서는 서버와 클라이언트 모두 TUN 장치에 할당된 주소를 갖습니다. 둘 다에 구성된 라우팅 테이블은 필요한 트래픽을 TUN 장치로 보냅니다. 패킷이 tun0으로 라우팅되면 커널은 이를 사용자 공간 프로그램(클라이언트)으로 보내고, 이 프로그램은 TCP 연결 등을 통해 원격 컴퓨터(서버)에 있는 다른 프로그램으로 패킷을 보냅니다. 원격 시스템에서는 다른 프로그램(서버)이 클라이언트로부터 패킷을 수신하고 이를 자체 /dev/tunX
장치에 기록하여 패킷을 네트워크 스택에 "주입"합니다. 터널 패킷은 다른 패킷처럼 처리됩니다.