Android использует множество правил маршрутизации и таблиц, возможно, по одной на каждое приложение.
Как видно, без добавления такого правила и, возможно, соответствующего ему fwmark пакет попадет в правило маршрутизации 32000: недоступный.
Делать что-то вручную над этим механизмом немного хиленько. В частности, правило маршрутизации 10500 разрешает (только) пользователю root использовать исходящий интерфейс. ccmni1
, но oif
речь идет не о разрешении выбора пакета для этого интерфейса, а о разрешении пакета из сокета привязан к этому интерфейсу (с использованием SO_BINDTODEVICE
) для выбора (oif
не является прямым эквивалентом если
который используется для маршрутизируемых пакетов, и если ло
также является особым случаем для немаршрутизируемых пакетов).
Многие правила получают пометку брандмауэра, вероятно, установленную эквивалентным комплексом iptables rules для выбора конкретных правил маршрутизации для каждого приложения (а также его конкретного UID). Я предполагаю, что есть специальные API-интерфейсы Android для регистрации таких правил при установке приложения.
Если вы хотите, чтобы root сначала использовал основную таблицу маршрутизации, избегая недоступный судьба, среди множества возможных вариантов:
ip rule add pref 998 uidrange 0-0 lookup main
Или, если вам все равно, что любой пользователь, поэтому любое приложение может использовать usb0 просто:
ip правило добавить преф 998 поиск основной
Это, вероятно, не будет хорошо интегрироваться с системой Android, которая может перетасовывать правила при установке или запуске приложений, и нельзя сказать, что осталось с iptables/nftables (или даже по SELinux, тк и т.д.) о блокировке доступа.Даже привязка к сокету может быть ограничена дополнительным механизмом (см., например: CONFIG_ANDROID_PARANOID_NETWORK
).