
Преобразует UDP-поток в (фальшивые) TCP-потоки, которые могут проходить через межсетевые экраны/NAT уровня 3 и уровня 4 (NAPT).
Легкий и быстрый обфускатор UDP в TCP.
Rust предоставляет только Tier 3 поддержку для платформ на базе MIPS начиная с 2023 года. Сборки Phantun для MIPS, таким образом, собираются с использованием nightly инструментария Rust и предоставляются только по принципу "насколько это возможно".
Phantun — это проект, который обфусцирует UDP-пакеты в TCP-соединения. Он нацелен на достижение максимальной производительности с минимальными издержками обработки и инкапсуляции.
Обычно используется в средах, где UDP заблокирован/ограничен, а TCP разрешён.
Phantun просто преобразует поток UDP-пакетов в обфусцированные пакеты TCP-потока. Стек TCP, используемый Phantun, спроектирован для прохождения через большинство L3/L4 stateful/stateless брандмауэров/NAT устройств. Он не сможет пройти через L7 прокси. Однако преимущество этого подхода в том, что ни один из типичных "убийц" производительности UDP-over-TCP, таких как повторные передачи и управление потоком, не возникает. Свойства базового UDP, такие как доставка с нарушением порядка, полностью сохраняются, даже если соединение выглядит как TCP с точки зрения брандмауэров/NAT.
Phantun означает "Призрачный TUN", так как это обфускатор для UDP-трафика, который делает ровно столько, чтобы заставить его проходить через stateful брандмауэры/NAT как TCP-пакеты.
Phantun написан на 100% безопасном Rust. Он был тщательно оптимизирован для хорошего масштабирования на многоядерных системах и без проблем насыщает все доступные ресурсы CPU на быстром соединении. См. раздел Производительность для результатов бенчмарков.

В приведённом ниже примере предполагается, что Сервер Phantun ожидает входящие подключения от клиентов Phantun на
порту 4567 (опция --local для сервера) и пересылает UDP-пакеты на UDP-сервер по адресу 127.0.0.1:1234
(опция --remote для сервера).
Также предполагается, что Клиент Phantun ожидает входящие UDP-пакеты на
127.0.0.1:1234 (опция --local для клиента) и подключается к серверу Phantun по адресу 10.0.0.1:4567
(опция --remote для клиента).
Phantun создаёт TUN-интерфейс как для клиента, так и для сервера. Для клиента Phantun по умолчанию назначает себе IP-адрес
192.168.200.2 и fcc8::2.
Для сервера он по умолчанию назначает 192.168.201.2 и fcc9::2. Следовательно, в вашем ядре должна быть
включена пересылка IPv4/IPv6, и должны быть настроены соответствующие правила iptables/nftables для NAT между адресом
вашей физической сетевой карты и адресом Tun-интерфейса Phantun.
Вы можете изменить имя Tun-интерфейса, создаваемого Phantun, и назначенные адреса. Запустите
исполняемый файл с опциями -h, чтобы узнать, как их изменить.
Другой способ понять эту сетевую топологию (см. диаграмму выше для иллюстрации этой топологии):
Клиент Phantun подобен машине с частным IP-адресом (192.168.200.2/fcc8::2) за роутером.
Чтобы он мог выйти в Интернет, вам нужно выполнить SNAT частного IP-адреса перед тем, как его трафик
покинет сетевой интерфейс.
Сервер Phantun подобен серверу с частным IP-адресом (192.168.201.2/fcc9::2) за роутером.
Чтобы получить к нему доступ из Интернета, вам нужно выполнить DNAT его порта прослушивания на роутере
и изменить IP-адрес назначения на тот, где сервер ожидает входящие подключения.
В этих случаях машина/iptables, на которой работает Phantun, выступает в роли "роутера", который позволяет Phantun общаться с внешним миром, используя его частные IP-адреса.
Начиная с Phantun v0.4.1, IPv6 полностью поддерживается как для TCP, так и для UDP сторон.
Для указания IPv6-адреса используйте следующий формат: [::1]:1234 с
опциями командной строки. Также поддерживается разрешение AAAA-записей. Запустите программу
с -h, чтобы увидеть подробные опции управления поведением IPv6.
Отредактируйте /etc/sysctl.conf, добавьте net.ipv4.ip_forward=1 и выполните sudo sysctl -p /etc/sysctl.conf.
net.ipv6.conf.all.forwarding=1 также необходимо установить.
Клиенту просто нужно включить SNAT на физическом интерфейсе, чтобы преобразовать адрес Phantun в адрес, который можно использовать в физической сети. Это можно сделать просто с помощью маскарадинга.
Примечание: измените eth0 на фактическое имя физического интерфейса.
table inet nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
iifname tun0 oif eth0 masquerade
}
}
Примечание: приведённое выше правило использует inet в качестве типа семейства таблиц, поэтому оно совместимо
как с IPv4, так и с IPv6.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Серверу нужно выполнить DNAT порта прослушивания TCP на адрес TUN-интерфейса Phantun.
Примечание: измените eth0 на фактическое имя физического интерфейса и 4567 на
фактический номер TCP-порта, используемый сервером Phantun.
table inet nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iif eth0 tcp dport 4567 dnat ip to 192.168.201.2
iif eth0 tcp dport 4567 dnat ip6 to fcc9::2
}
}
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination 192.168.201.2
ip6tables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination fcc9::2