Рейтинг:3

Что может привести к тому, что «Сеть недоступна», когда ссылка работает, маршрут есть и сетевая маска правильная?

флаг cn

Что может быть причиной этого?

$ sudo ip route показать                                                                                                                                
192.168.100.0/24 dev usb0 ссылка на область видимости                                                                                          
$ sudo IP-адрес показать usb0 
85: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> состояние mtu 1500 qdisc pfifo_fast
НЕИЗВЕСТНАЯ группа по умолчанию qlen 1000
ссылка/эфир 16:3d:0a:3f:3b:e6 brd ff:ff:ff:ff:ff:ff                                                                                                                    
инет 192.168.100.86/24 brd 192.168.100.255 глобальная область usb0                                                                                                             
valid_lft навсегда                                                                                                                            
inet6 fe80::143d:aff:fe3f:3be6/64 ссылка на область действия                                                                                                                             
valid_lft навсегда                                                                                                                        
$ sudo IP-маршрут получить 192.168.100.2
RTNETLINK отвечает: Сеть недоступна

Это на моем хост-устройстве под управлением Android поверх ядра Linux 4.4. Я подключил свой USB-гаджет (устройство Mendel Linux). Появился интерфейс usb0; Я поднял его и запустил на нем udhcpc. Гаджет назначил мне 192.168.100.86/24 и рекламировал себя через mDNS как 192.168.100.2, поэтому я знаю, что ссылка работает. Я отключил все остальные хост-интерфейсы, чтобы убедиться, что они не крадут маршрут. Но если я попытаюсь пропинговать его или использовать ssh, я получаю «Сеть недоступна».

Когда я делаю те же шаги на другом хосте, отличном от Android, все работает нормально. Я знаю, что у Android есть некоторые странные правила iptables (например, для отслеживания использования данных для каждого uid), но я не думал, что это повлияет на таблицу маршрутизации (и их сброс все, похоже, не помогает). Есть еще SElinux, но я думал, что это просто файловая система. Какая еще непонятная (для меня) функция Linux может блокировать меня здесь?

Изменить, чтобы добавить по запросу:

$ IP-правило
0: из всех локальных поисковых систем
999: поиск по всем fwmark 0xa/0xffff 2454
10000: поиск по всем fwmark 0xc0000/0xd0000 99
10500: поиск из всех iif lo oif ccmni1 uidrange 0-0 1003
13000: от всех fwmark 0x10063/0x1ffff iif lo lookup 97
13000: из всех файлов fwmark 0xd006c/0xdffff iif lo lookup 1003
14000: из всех fwmark 0xc0000/0xc0000 поиск iif lo oif ccmni1 1003
15000: поиск по всем fwmark 0x0/0x10000 99
16000: поиск по всем fwmark 0x0/0x10000 98
17000: поиск по всем fwmark 0x0/0x10000 97
32000: от всех недоступных
$ ip route показать таблицу локально
широковещательная передача 127.0.0.0 dev lo proto ссылка на область ядра src 127.0.0.1
local 127.0.0.0/8 dev lo proto область ядра host src 127.0.0.1
local 127.0.0.1 dev lo proto область ядра host src 127.0.0.1
широковещательная передача 127.255.255.255 dev lo proto ссылка на область ядра src 127.0.0.1
широковещательная передача 192.168.100.0 dev usb0 ссылка на область ядра proto src 192.168.100.86
локальный 192.168.100.86 dev usb0 область ядра proto host src 192.168.100.86
широковещательная передача 192.168.100.255 dev usb0 ссылка на область ядра proto src 192.168.100.86
$ ip route показать таблицу 2454
по умолчанию dev ccmni1 proto static
$ ip route показать таблицу 99
$ ip route показать таблицу 1003
$ ip route показать таблицу 97
$ ip route показать таблицу 99
$ ip route показать таблицу 98
$
A.B avatar
флаг cl
A.B
Добавьте результат `ip rule` в свой вопрос. И для каждой записи, кроме тех, у которых приоритет 0, 32766 и 32767, если они ссылаются на таблицу маршрутизации (поиск по ключевым словам), добавьте эту таблицу маршрутизации (`ip route show table xxx`).
Рейтинг:2
флаг cl
A.B

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).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.