
TL;DR
내 시스템에서 나가는 모든 트래픽이 tun0 장치로 라우팅되고 DNS 패킷으로 래핑된 다음 인터넷으로 전송되기를 원하지만 DNS 패킷도 tun0 장치로 다시 라우팅됩니다.
배경
제가 작업 중인 프로젝트의 일부로 TCP 트래픽이 없는 시스템에 DNS 터널을 구현해야 합니다(모든 TCP 트래픽이 삭제됨).
나는 이것을 Python으로 구현하기로 결정했고 트래픽 라우팅 방법을 이해하는 데 문제가 있었습니다.
설정은 TCP를 사용할 수 없는 클라이언트 컴퓨터의 에이전트와 네트워킹 제한이 없는 서버로 구성됩니다.
현재는 클라이언트에서 서버로 나가는 트래픽만 처리하고 있습니다.
제가 클라이언트와 함께 취하고 싶었던 현재 접근 방식은 다음과 같습니다.
tun0
클라이언트 시스템에 인터페이스 생성- 해당 인터페이스를 통해 나가는 모든 트래픽을 라우팅합니다.
- Python 프로그램이 해당 인터페이스를 수신하도록 하세요. 나가는 패킷은 인터넷에 연결된 인터페이스(내 경우에는
ens33
)를 통해 인터넷으로 전송되는 DNS 쿼리로 래핑됩니다.
tun 장치를 만들기 위해 다음을 사용했습니다.
from pytun import TunTapDevice
tun = TunTapDevice(name=”tun0”)
tun.addr = '10.8.0.1'
tun.dstaddr = '10.8.0.2'
tun.netmask = '255.255.255.0'
tun.mtu = 1500
tun.up()
트래픽을 tun0 인터페이스로 라우팅하기 위해 나는 다음을 사용했습니다.
sudo ip route add default via 10.8.0.1 dev tun0
문제
내 Python 프로그램으로 트래픽이 라우팅되고 장치에서 패킷을 읽을 수 있지만 새 DNS 패킷(해당 패킷 내부의 원본 데이터 포함)을 구성한 후에 인터페이스를 통해 인터넷으로 패킷을 보내려고 합니다 ens33
. 그러나 나는 요청이 tun0 인터페이스에서 전송을 시도하는 것을 tcpdump
봅니다 .wireshark
내 프로그램에 없는 패킷만 tun0으로 라우팅하려면 어떻게 해야 합니까? 제가 보기엔 개념이 VPN과 비슷해 보이는데, VPN 프로그램은 어떻게 작동하나요?
도움을 주셔서 감사합니다. 설명/수정이 필요한 경우 댓글을 남겨주세요.