Я установил несколько правил маршрутизации, чтобы убедиться, что пакет отправляется через тот же интерфейс, к которому привязан сокет. (Функция sendto в C ++ попытается выбрать лучший из возможных интерфейсов на основе адреса назначения). Я отправляю UDP-пакеты на другие устройства как внутри, так и вне моей локальной сети, и в ответ они отправляют UDP-пакеты на один и тот же адрес. С помощью Wireshark Я могу убедиться, что это происходит.
Но хотя пакеты поступают в сетевой стек и, таким образом, могут считываться Wireshark, они не принимаются сокетом, связанным с конкретным интерфейсом.
Правила маршрутизации в моей системе Ubuntu следующие:
iptables -A OUTPUT -o wlan0 -t mangle -p udp -s 193.156.108.78 --sport 12346 -j MARK --set-mark 21
ip rule add fwmark 21 table 21
ip route add dev wlan0 default via 193.156.108.1 table 21
Я предполагаю, что мне нужно внести изменения в мой Iptables для входящего трафика, но я не уверен, что не работает, так как адреса как на фрейме Ethernet, так и на заголовке ip кажутся правильными.
РЕДАКТИРОВАТЬ:
Используя цель LOG в iptables, я определил, что пакеты используют PREROUTING в калечить стол, но не PREROUTING в натуральный Таблица. Не проходит и через ВХОД столы. Я не знаю, почему на этом этапе.
Iptables TRACE это устанавливается как правило в PREROUTING в сырье отслеживает пакет. Это проходит через правила в PROROUTING mangle (Ничего из того, что я пробовал, пока что никуда не привело) политика №. Число означает, какое правило в этой конкретной таблице выбрано. Политика по умолчанию, которая ACCEPT везде самое большое доступное число. (Количество пользовательских правил + 1)
С помощью iptables -L -nvx
а также iptables -S -v
количество принятых пакетов и правила могут быть визуализированы.
Так что, хотя мой пакет кажется принятым, он все равно где-то сбрасывается. Я мог бы действительно использовать некоторую помощь здесь.
Это полный след одного такого пакета:
Nov 1 09:18:23 XXX kernel: [ 2377.505697] TRACE: raw:PREROUTING:policy:3 IN=wlan0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=XXX.XXX.XXX.XXX DST=193.156.108.67 LEN=83 TOS=0x00 PREC=0x00 TTL=50 ID=0 DF PROTO=UDP SPT=6428 DPT=12346 LEN=63
Nov 1 09:18:23 XXX kernel: [ 2377.505721] TRACE: mangle:PREROUTING:policy:2 IN=wlan0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=XXX.XXX.XXX.XXX DST=193.156.108.67 LEN=83 TOS=0x00 PREC=0x00 TTL=50 ID=0 DF PROTO=UDP SPT=6428 DPT=12346 LEN=63
EDIT2:
UDP-пакеты, отправленные обратно с устройства в той же беспроводной сети, работают. Также он работает для сокета, привязанного к eth0, как для локальных, так и для внешних сетей. Эти маршруты обычно пропускают НАСТОЯЩАЯ часть, и перейдите прямо к таблице маршрутизации ip. (Визуализация) Который, где что-то пойдет не так, по-видимому. Мне не удалось проверить, что перенаправления на другую таблицу действительно работают (либо с помощью ОТМЕТКА или же ip rule add from "source" table #
), предложения по этому поводу также приветствуются. Также я не смог выяснить, что должно быть в таблице маршрутизации, чтобы позволить пакету продолжать ВХОД.
Неудовлетворительное решение:
Настройка log_martians переменная в /etc/sysctl.conf Наконец, я вижу, что пакет отброшен из-за предположительно обратной фильтрации. К счастью, установка rp_filter переменные к 2 в том же файле решает проблему.
Как объяснил Вот пакеты будут заблокированы, если интерфейс, на котором они находятся, не может найти маршрут к источнику. Установка этого rp_filter Значение 2 решит мою проблему, потому что оно основано на том факте, что мой интерфейс по умолчанию может на самом деле маршрутизировать к этому источнику.
Остальные вопросы:
По какой-то причине установка этого rp_filter значение до 0 не всегда работает (оно не должно отбрасывать марсианские пакеты вообще). Не знаю, почему это так.
Кроме того, мне не очень нравится это решение, и я с радостью реализовал бы лучшее решение, если оно доступно. Мне кажется, что мне нужно найти способ дать интерфейсу wlan0 стандартный способ маршрутизации к этому источнику, а не просто маркировать пакеты. Предложения?
Простым ответом на эту проблему является установка rp_filter значение в /etc/sysctl.conf
в 2
, Вы можете сделать это для каждого интерфейса отдельно или установить их по умолчанию и все. Я не совсем уверен, как работают эти значения, но я думаю, что default устанавливает каждый новый интерфейс на это конкретное значение, и все устанавливают все текущие интерфейсы на это значение (но могут быть исключения из этого?).
net.ipv4.conf.default.rp_filter=2
net.ipv4.conf.all.rp_filter=2
Обратите внимание, что вы должны сбросить sysctl и сетевой менеджер, чтобы убедиться, что используются новые настройки.
sysctl -p /etc/sysctl.conf
service network-manager restart
РЕДАКТИРОВАТЬ:
Лучшим способом было бы изменить ваши вызовы маршрутизации на:
ip rule add from 193.156.108.78 table 21
ip route add dev wlan0 default via 193.156.108.1 table 21
Таким образом, ваша система сможет найти путь маршрутизации к исходному адресу, который пропустит пакет без установки rp_filter.
Других решений пока нет …