i2pd
i2pd copied to clipboard
IP address mapping for *.i2p addresses
Как это сделано в Tor (DNSPort + TransPort) (+пример использования) https://www.grepular.com/Transparent_Access_to_Tor_Hidden_Services
Идея в том чтобы резолвить foo.i2p в некоторый IP и запоминать маппинг. При обращении по этому "фейковуму" IP обращаться к foo.i2p (через маппинг)
Возможно имеет смысл вместо ipv4 использовать ipv6?
Уже пытались это делать через tun интерфейс
Аналогия есть на этом же сайте: https://www.grepular.com/Transparent_Access_to_I2P_eepSites
Реализовывать через SOCKS (даже прозрачный при содействии iptables) приятнее тем, что придётся писать только свою реализацию SOCKS (и DNS), а не свою реализацию TCP поверх tun-интерфейса. Обе известные мне реализации (tun2socks, tun2tor) используют TCP из lwIP. Вариант с отдельным интерфейсом, конечно, идейно чище, но труднее в реализации.
Мне кажется, что можно было бы попытаться позаимствовать уже имеющуюся реализацию TCP из ядра, используя нет tun, а dummy-интерфейс с дополнительным local-маршрутом (по сути ещё один lo). Всё бы хорошо, но Linux настаивает на том, чтобы отвечать RST на всё, что движется, даже если там открыт RAW-сокет. Так что тут всё равно придётся как-то извратиться (вдобавок к извращению, нужному для того, чтобы слушать на всех портах сразу). (В *BSD, наоборот, можно подавить эти RST, но нельзя получать TCP-пакеты в RAW-сокет.)
В любом случае нужно в первую очередь организовать DNS-сервер, выдающий адреса из выделенного диапазона (лучше IPv6), а потом уже можно думать, как на эти адреса получать пакеты. (Ещё одна интересная деталь в реализации Tor’а — поддержка специально под это сделанных функций TPROXY под Linux, divert под *BSD и иже с ними вместо описанного в документации метода через REDIRECT.)