Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Padavan support #163

Merged
merged 2 commits into from
Oct 29, 2024
Merged

Padavan support #163

merged 2 commits into from
Oct 29, 2024

Conversation

renr4
Copy link
Contributor

@renr4 renr4 commented Oct 19, 2024

Разобрался почему на ядре 3.4 не работало. Можно потом включить патч в исходный код и тогда ...mipsel-static.tar.gz будет работать, но все-равно инструкция нужна, потому-что там свои нюансы. Но писать на английском просто нет смысла.

@Waujito
Copy link
Owner

Waujito commented Oct 20, 2024

Спасибо за PR!

Несколько замечаний по оформлению: в README.md всё написать на английском, сделать ссылку на Padavan.md с меткой [rus]. В Padavan.md оставить ссылку на этот пул реквест для обсуждения.

Дальше по содержанию: есть ли реальный смысл отдельно кросскомпилироваться? Что даёт ваш пач? Что такого особенного в ядре падавана, что отличается от других роутерах на достаточно старых ядрах, на которых всё работает? Я не вникал в точное поведение этих строк, но логика подсказывает, что UNBIND перед BIND это не корректно. И вот я крайне не уверен, что это вообще имеет смысл. К тому же, в ядре v3.0.101 у нас спокойно себе существует NFQNL_CFG_CMD_BIND, в то время, как PF_(UN)BIND вообще игнорируются https://elixir.bootlin.com/linux/v3.0.101/source/net/netfilter/nfnetlink_queue.c#L726

Также я крайне не поддерживаю идею оставить ссылку на бинарник из другого репозитория. Всё должно компилироваться на месте, прозрачно, через GH Actions. Вообще, мне кажется, что существующие бинарники должны спокойно работать у вас. А чтобы не писать правила руками, есть версия для entware.

Тогда единственный вопрос, который остаётся - где достать модули. И раз мы убрали все предыдущие пункты, можно просто написать об этом в главном README (на английском). И тут опять ссылка на ваш профиль с скомпилированными модулями только для вашего ядра и для вашей архитектуры. У других эти модули могут в лучшем случае не запуститься, в худшем - убить ядро. Я бы хотел увидеть ссылки на источники, где взять эти модули от производителя для конкретного устройства. Вот на кинетиках они из прошивки ставятся, насколько я знаю. А тут как?

UPD: насчёт NFQNL_CFG_CMD_PF_BIND у падавана такая же ситуация: https://gitlab.com/hadzhioglu/padavan-ng/-/blob/master/trunk/linux-3.4.x/net/netfilter/nfnetlink_queue.c?ref_type=heads#L810

@renr4
Copy link
Contributor Author

renr4 commented Oct 21, 2024

Можно в README.md на английском

Кросскомпилировать нет смысла. Я оформил в виде патча, но надо просто включить код как есть. Тогда бинарь mipsel-static должен заработать и на падаване и на прочих. На старых ядрах скорее всего не работает, просто никто не проверял. Это нужен древний Attitude Adjustment 12.09 и я на него даже не смог пакет nfqueue найти.
Это выглядит странно, но как я понял PF_(UN)BIND включают подсистему queue. Можно посмотреть как сделано в libpcap https://svn.nmap.org/nmap/libpcap/pcap-netfilter-linux.c или в примере самого libmnl https://cpp.hotexamples.com/site/file?hash=0xf68ff6f0cde75cfebc560cb6a8a0a095e83a939b161e0aac89d233da28c7cd53&fullName=iptables/external/libmnl-1.0.1/examples/nf-queue.c&project=inibir/daemongroup

Я оставил ссылку на бинарник, чтобы можно было запустить все прямо сейчас. Когда будет рабочий бинарь в Assets, то ссылку уберем.

У падавана одна архитектура и одно ядро. Модули собираются с прошивкой, но это как-то накладно, а больше их взять негде.

UPD Такая же, но может они 15 строками выше задействуются

@Waujito
Copy link
Owner

Waujito commented Oct 21, 2024

Attitude Adjustment 12.09

Это мой на тп линке) только там ядро v4.

Я посмотрю еще в сторону этих pfов на старых ядрах. В целом, можно будет включить, если они работе не мешают. Всё равно после 3.8 точно игнорируются.

@Waujito
Copy link
Owner

Waujito commented Oct 21, 2024

Да, я попробовал запустить на ядре v3.0 и оно действительно работает только с этим патчем. Также у меня заработал ipv6 если продублировать этот патч, поменяв PF_INET на PF_INET6. Сейчас я еще потестирую и, скорее всего, включим в youtubeUnblock.c

The behaviour of nfnetlink_queue is changed since then but old kernels
require BIND/UNBIND_PF commands.
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0360ae412d09bc6f4864c801effcb20bfd84520e

Co-Authored-by: renr4 <renr4@users.noreply.github.com>
@Waujito
Copy link
Owner

Waujito commented Oct 22, 2024

Закоммитил вам в репозиторий изменения в youtubeUnblock.c

Остались правки по readme (см. выше). Также уберите ссылки на сторонние репозитории. Еще лучше убрать упоминание о правиле фаервола без connbytes. Люди могут слепо поставить его, а потом жаловаться, что анблок мешает скорости. Да и лишний раз грузить роутеры не к чему.

С модулями еще подумаем что делать

@HiHat
Copy link

HiHat commented Oct 25, 2024

Надеюсь теперь будет работать и на ядре 2.6.36 на ASUS RT-AC68U!

@Waujito
Copy link
Owner

Waujito commented Oct 25, 2024

@HiHat

Надеюсь теперь будет работать и на ядре 2.6.36 на ASUS RT-AC68U!

Попробуйте отсюда установить
https://github.com/Waujito/youtubeUnblock/actions/runs/11515524417

@HiHat
Copy link

HiHat commented Oct 25, 2024

Попробуйте отсюда установить https://github.com/Waujito/youtubeUnblock/actions/runs/11515524417

Начиная с 1.0rc2 перестало запускаться на старом entware arm-2.6 😞
Зависимость какая-то появилась от glibc-2.26:
./youtubeUnblock: /opt/lib/libc.so.6: version GLIBC_2.25' not found (required by ./youtubeUnblock)`
Есть ли возможность добавить вариант сборки для старого entware?

@Waujito
Copy link
Owner

Waujito commented Oct 25, 2024

Зависимость какая-то появилась от glibc-2.26:

Хм, интересно. Возьмите static версию вместо entware и попробуйте запустить вручную

@HiHat
Copy link

HiHat commented Oct 25, 2024

Static версия падает с illegal instruction:

youtubeUnblock
Bypasses deep packet inspection systems that relies on SNI

GSO is enabled
IPv6 is enabled
Detected 1 config sections
The sections will be processed in ordred they goes in this outputSection #0
Using TCP segmentation
Fake SNI will be sent before each target client hello
Fragmentation Client Hello will be reversed
Past seq faking strategy will be used
Target sni domains: googlevideo.com,ggpht.com,ytimg.com,youtube.com,play.google.com,youtu.be,googleapis.com,googleusercontent.com,gstatic.com,l.google.com
Illegal instruction

Позже попробую собрать из исходников через ASUS toolchain.

@Waujito
Copy link
Owner

Waujito commented Oct 25, 2024

@HiHat

Какой именно бинарник ставите?
Запустите через strace youtubeUnblock (может потребоваться установить стрейс через опкг)
Сделайте cat /proc/cpuinfo

@HiHat
Copy link

HiHat commented Oct 25, 2024

Какой именно бинарник ставите? Запустите через strace youtubeUnblock (может потребоваться установить стрейс через опкг) Сделайте cat /proc/cpuinfo

strace для youtubeUnblock-static-armv7.zip:

...
writev(1, [{iov_base="Target sni domains: googlevideo."..., iov_len=154}, {iov_base="\n", iov_len=1}], 2Target sni domains: googlevideo.com,ggpht.com,ytimg.com,youtube.com,play.google.com,youtu.be,googleapis.com,googleusercontent.com,gstatic.com,l.google.com
) = 155
socket(AF_INET, SOCK_RAW, IPPROTO_RAW)  = 3
setsockopt(3, SOL_SOCKET, SO_MARK, [32768], 4) = 0
socket(AF_INET6, SOCK_RAW, IPPROTO_RAW) = 4
setsockopt(4, SOL_SOCKET, SO_MARK, [32768], 4) = 0
brk(NULL)                               = 0x2d000
brk(0x2f000)                            = 0x2f000
--- SIGILL {si_signo=SIGILL, si_code=ILL_ILLOPC, si_addr=0x1a3ae} ---
+++ killed by SIGILL +++
Illegal instruction

cat /proc/cpuinfo

Processor	: ARMv7 Processor rev 0 (v7l)
processor	: 0
BogoMIPS	: 1599.07

processor	: 1
BogoMIPS	: 1599.07

Features	: swp half thumb fastmult edsp 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc09
CPU revision	: 0

Hardware	: Northstar Prototype
Revision	: 0000
Serial		: 0000000000000000

@HiHat
Copy link

HiHat commented Oct 25, 2024

Вспомнил, что у ASUS RT-AC68U архитектура ARM7 без hardware float (soft float) и подходят бинарники, собранные для ARM5.
Просьба добавить вариант сборки arm7sf или arm5, если не трудно!

@Waujito
Copy link
Owner

Waujito commented Oct 25, 2024

@HiHat

вроде бы собрал для armv7sf:
https://github.com/Waujito/youtubeUnblock/actions/runs/11522919944/artifacts/2105450645

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x100fc
  Start of program headers:          52 (bytes into file)
  Start of section headers:          147244 (bytes into file)
  Flags:                             0x5000200, Version5 EABI, soft-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         5
  Size of section headers:           40 (bytes)
  Number of section headers:         14
  Section header string table index: 13

@HiHat
Copy link

HiHat commented Oct 25, 2024

Теперь не падает, но появилась ошибка обработки очереди...

youtubeUnblock
Bypasses deep packet inspection systems that relies on SNI

GSO is enabled
IPv6 is enabled
Detected 1 config sections
The sections will be processed in ordred they goes in this outputSection #0
Using TCP segmentation
Fake SNI will be sent before each target client hello
Fragmentation Client Hello will be reversed
Past seq faking strategy will be used
Target sni domains: googlevideo.com,ggpht.com,ytimg.com,youtube.com,play.google.com,youtu.be,googleapis.com,googleusercontent.com,gstatic.com,l.google.com
Queue 537 started
mnl_cb_run: Operation not permitted
Probably another instance of youtubeUnblock with the same queue number is running
Thread 0 exited with status -1

@Waujito
Copy link
Owner

Waujito commented Oct 25, 2024

Теперь не падает, но появилась ошибка обработки очереди...

Вам надо включить модуль ядра.

modprobe nfnetlink_queue

Если не включается, поищите его в /lib/modules или где-то у производителя.

@HiHat
Copy link

HiHat commented Oct 25, 2024

Я уже пересобрал прошивку и включил этот параметр в ядро (CONFIG_NETFILTER_NETLINK_QUEUE=y).

# grep -i queue /lib/modules/2.6.36.4brcmarm/modules.builtin 
kernel/net/ipv4/netfilter/ip_queue.ko
kernel/net/ipv6/netfilter/ip6_queue.ko
kernel/net/netfilter/nfnetlink_queue.ko

Видимо для старого ядра 2.6.36 еще какие-то доработки нужны.

@Waujito
Copy link
Owner

Waujito commented Oct 25, 2024

Я не вижу проблем со старым ядром. На ubuntu 10.04 (2.6.32-38-generic) всё заработало. У вас всё-таки не работает, скорее всего, из-за модулей. Может, ему еще просто надо включить nfnetlink помимо nfnetlink_queue? И лучше не компильте ядро с модулями, а пока что просто собирайте их отдельно.

UPD:
Я собрал entware пакет со скриптами под ваше ядро https://github.com/Waujito/youtubeUnblock/actions/runs/11524055845/artifacts/2105911393

@HiHat
Copy link

HiHat commented Oct 25, 2024

Огромное спасибо!
После того, как пересобрал прошивку с загружаемым модулем (CONFIG_NETFILTER_NETLINK_QUEUE=m) все работает! Youtube работает супер быстро, как давно не работал!
Странно конечно, что без загружаемого модуля не работало...

@Waujito
Copy link
Owner

Waujito commented Oct 26, 2024

Супер! Тогда поддержка есть, скорее всего, до 2.6.25 ядра. До него нет опции SO_MARK у равсокета, и невозможно маркировать пакеты от анблока традиционным путём

@HiHat
Copy link

HiHat commented Oct 26, 2024

Ещё раз огромное спасибо за замечательную программу и активную помощь!
Когда сам пытался разобраться, наткнулся на статью 2011 года с описанием похожего решения (может будет интересно): Fixing Broken Protocols with NF_QUEUE.
Выходила в Linux Journal, December 2011

Waujito added a commit that referenced this pull request Oct 26, 2024
@Waujito
Copy link
Owner

Waujito commented Oct 26, 2024

Открыл у падавана ишью. Может быть, добавят внутрь ядра модули по дефолту. https://gitlab.com/hadzhioglu/padavan-ng/-/issues/37

Waujito added a commit that referenced this pull request Oct 26, 2024
Waujito added a commit that referenced this pull request Oct 26, 2024
@renr4
Copy link
Contributor Author

renr4 commented Oct 26, 2024

В этом нет смысла. Прошивки собирают сами пользователи под свои железки и выкладывают на форуме 4pda и репозиторий не один, их много и нет единого хранилища готовых сборок как в опенврт и не будет. Идея была в том, чтобы запустить YU на любой уже прошитой железке без компиляций и прочего. Есть большая разница между выполнением 10 команд в веб-интерфейсе и самостоятельной сборкой прошивки с нуля, никто просто не будет этим заморачиваться.

Почему не использовать опенврт? Потому что он тормозной из-за открытых драйверов и ест слишком много ресурсов.

Короткая команда нужна чтобы определить, поддерживает штатный iptables --num-queue параметр или нет, но можно добавить уточнение а в скрипт ниже добавить полную, уменьшающую нагрузку на проц.

Можно перенести архив с модулями сюда в каталог Padavan и положить инструкцию рядом. Я думал еще написать скрипт для установки и обновления YU одной командой. Теоретически можно также написать action для сборки модулей и запускать его вручную, но я не силен в этом.

@Waujito
Copy link
Owner

Waujito commented Oct 28, 2024

Да, мэйнтейнер сказал, что не будет это добавлять потому что не всем это нужно. Но он добавил пример в padavan builder workflow. https://github.com/hadzhioglu/padavan-builder-workflow/blob/TEST/build.config#L163

Я бы предпочёл документацию по сборке модулей из gh actions, чем выкладывать бинари. Также юзерспейс айпитэйблс не надо заменять, он и так с расширениями идёт, судя по структуре в прокте. Вообще, нам не обязательно пересобирать прошивку целиком. Мы можем собрать только модули:
качаем тулчейн, копируем конфиги ядра, добавляем модули, make modules, находим модули в net/netfilter

@Waujito Waujito force-pushed the main branch 5 times, most recently from 3aa09bd to 235bf82 Compare October 29, 2024 08:11
@Waujito Waujito merged commit f1ab2ac into Waujito:main Oct 29, 2024
54 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Попытался установить по инструкции в Xiaomi Router 3G Padavan Entware
3 participants