TL;DR

TL;DR

TL;DR

Я хочу, чтобы весь исходящий трафик из моей системы направлялся на устройство tun0, оборачивался пакетами DNS и затем отправлялся в Интернет, но при этом пакеты DNS также направлялись обратно на устройство tun0.

Фон

В рамках проекта, над которым я работаю, мне необходимо реализовать DNS-туннель в системе без TCP-трафика (весь TCP-трафик отбрасывается).

Я решил реализовать это на Python и столкнулся с проблемой понимания того, как маршрутизировать трафик.

Настройка будет состоять из агента на клиентском компьютере, который не может использовать TCP, и сервера, не имеющего сетевых ограничений.

В настоящее время я обрабатываю только исходящий трафик от клиента к серверу.

Текущий подход, который я хотел применить к клиенту, был следующим:

  1. Создать tun0интерфейс на клиентской системе
  2. Направьте весь исходящий трафик через этот интерфейс.
  3. Заставьте программу Python прослушивать этот интерфейс — исходящие пакеты будут упакованы в DNS-запрос, который будет отправлен в Интернет через интерфейс, подключенный к Интернету (в моем случае ens33).

Для создания устройства 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.tcpdumpwireshark

Как мне направить только пакеты не из моей программы на tun0? Мне кажется, что концепция похожа на vpn, как это делают vpn-программы?

Спасибо за вашу помощь, пожалуйста, прокомментируйте, если необходимы какие-либо разъяснения/редактирование.

Связанный контент