У меня есть домашний ПК с проводным подключением к Ethernet (подключенным к маршрутизатору) и картой Wi-Fi. Wi-Fi настроен как точка доступа (hostapd), а сетевые интерфейсы объединены в мост:
auto enp0s10
iface enp0s10 inet manual
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
auto br0
iface br0 inet dhcp
bridge_ports wlan0 enp0s10
netmask 255.255.255.0
Существуют некоторые iptables
правила, которые влияют на выбранный трафик, проходящий черезwlan0только интерфейс, используя --physdev-in
селектор. Эта настройка работает так, как и ожидалось.
Сейчас я пытаюсь создать механизм, который заставит выбранные процессы на устройстветолько отправлять трафик через wlan0.
Следуя примеруздесьЯ пытался:
> sudo ip netns add myNamespace
> sudo ip link set wlan0 netns myNamespace
RTNETLINK answers: Invalid argument
Что, насколько я могу судить, означает:
- что я не могу назначить физический интерфейс, потому что он соединен мостом
- Я не могу использовать
netns
пространство имен для достижения своей цели.
EDIT: следуя предложению ниже отгравитацияВ сочетании с упомянутым выше свинцом я попробовал:
> sudo ip netns show
> sudo ip netns add myNamespace
> sudo ip netns show
myNamespace
> sudo iw phy phy0 set name myNamespace
> sudo ip netns exec myNamespace ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
На данном этапе, следует ли мне ожидать увидеть что-либофи0илиwlan0перечислены? iw phy phy0 set name myNamespace
Команда не возвращает сообщение об ошибке, но ни один из интерфейсов не был добавлен вмоепространство имен. Как и ожидалось, попытка вызвать интерфейс не удалась:
> sudo ip netns exec myNamespace ifconfig wlan0 192.168.0.10/24 up
SIOCSIFADDR: No such device
wlan0: ERROR while getting interface flags: No such device
wlan0: ERROR while getting interface flags: No such device
SIOCSIFNETMASK: No such device
> sudo ip netns exec myNamespace ifconfig phy0 192.168.0.10/24 up
SIOCSIFADDR: No such device
phy0: ERROR while getting interface flags: No such device
phy0: ERROR while getting interface flags: No such device
SIOCSIFNETMASK: No such device<br/>
Опять же, я подозреваю, что это осложняется установкой моста.
План Б — создать пользователя/группу специально для этой задачи (назовем ихwlantraffic) затем используйте iptables
для перенаправления трафика этого пользователя наwlan0если/когда это произойдетenp0s10.
Вот тут я застрял. Правило будет выглядеть примерно так:
iptables -t nat -A PREROUTING -m owner --gid-owner wlantraffic -m physdev ! --physdev-in wlan0 -j ???
т.е. "трафик из группыwlantrafficчтоне имеетвъехали на мост черезwlan0следует перенаправить вwlan0«
Пакеты будут представлять собой обычный интернет-трафик.
У меня такие вопросы:
- Это правило
PREROUTING
илиFORWARD
норма? - Если бы я
DROP
сопоставлял пакеты — в контексте моста — «провалились бы» ли пакеты на следующий интерфейс? - Как мне указатьwlan0интерфейс как цель?
решение1
Я не могу использовать пространство имен ntns для достижения своей цели.
Ваша проблема может заключаться в мосте; однако:
Интерфейсы WLAN немного странные, когда дело доходит до сетевых пространств имен. Каждый адаптер имеет два слоя – phy (представляющий физическое оборудование) и netdev (представляющий сетевой интерфейс).
(Причина в том, что возможно наличие нескольких сетевых устройств на одном физическом уровне, например клиент+точка доступа, или двухдиапазонный адаптер Wi-Fi может иметь wlan0 и wlan1, работающие одновременно в разных сетях. Если вам интересно, посмотрите, iw phy
какие комбинации поддерживаются для вашего адаптера.)
В настоящее время Linux имеет ограничение, котороевесьУстройство phy должно быть перемещено в пространство имен; отдельные netdevs не могут быть перемещены. Для этого используйте iw
:
iw phy phy0 set netns myNamespace
Это правило PREROUTING или FORWARD?
В общем, все зависит от того, какое действие ( -j
параметр) используется. Некоторые имеют смысл только в FORWARD, другие только в PREROUTING; некоторые работают только в -t nat
, другие только в -t mangle
.
Если бы я отбрасывал соответствующие пакеты — в контексте моста — «провалились бы» ли пакеты на следующий интерфейс?
Нет. Правила iptables предназначены для IP, и они обрабатываются до того, как пакет достигнет уровня моста. Если пакет отбрасывается на уровне IP, он исчезает.