Назад | Перейти на главную страницу

Соединение wlan0 с eth0

В Arch Linux я хотел бы, чтобы eth0 (подключенный к мостовому маршрутизатору) совместно использовал соединение, полученное от wlan0, я читал руководства, но я не разбираюсь в командах, как другие пользователи, и не совсем понимаю.

Чтобы мост Wi-Fi интерфейс, который вы можете использовать iw инструмент для включить 4addr аналогично:

# iw dev <wifiInterface> set 4addr on

то есть:

# brctl addif <bridgename> <wifiInterface>
can't add <wifiInterface> to bridge <bridgename>: Operation not supported

# iw dev <wifiInterface> set 4addr on
# brctl addif <bridgename> <wifiInterface>

Теперь должно работать. Вы можете показать мосты, используя:

# brctl show

ОБНОВИТЬ

Невозможно установить мост между беспроводным (режим клиентской станции) и проводным интерфейсами. согласно этой теме на linux-ath5k-devel.

Настроить NAT

Вместо этого следует настроить NAT:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Назначение IP

Затем вам нужно назначить себе IP-адреса:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

Установить демон dhcp

Установите DHCP-сервер и добавьте следующий текст в его конфигурационный файл (в /etc/dhcpd.conf или что-то подобное)

subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.100 10.0.0.120;
    option routers 10.0.0.1;
    option domain-name-servers the-ip-address-you-have-in-etc-resolv.conf;
}

Запустить dhcpd

Затем запустите его /etc/init.d/dhcpd start

И это все!

Прочтите ниже, только если вас интересует нерабочая настройка моста


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

Сначала вы создаете интерфейс моста, я выбираю произвольное имя Mybridge затем добавьте к нему интерфейсы.

Вам следует запросить новый IP-адрес (это необходимо, только если вы хотите получить действующий IP-адрес для самого устройства моста):

dhclient -d mybridge

4addr, как описано в других ответах, безусловно, является лучшим способом, когда поддерживается адаптером / драйвером, но не все из них. NAT может работать для некоторых вещей, но обеспечение надлежащей связи в обоих направлениях по локальной сети станет проблематичным (например, подключение принтера или доступ к другим устройствам IoT на другой стороне NAT). Все, что полагается на широковещательную / многоадресную рассылку (например, автоматическое обнаружение, bonjour), не пройдет через NAT.

Альтернативой является использование ARP-прокси (с парпроутингом), как описано в https://wiki.debian.org/BridgeNetworkConnectionsProxyArp. Я установил это на Raspberry Pi для принтера, и он работает как шарм (я добавил 10-секундный сон в post-up команды, позволяющие ему сначала получить IP-адрес, возможно, это связано с медлительностью моего старого RPi ...)

Зависит от того, насколько важна для вас точка доступа:

1) Он может захотеть видеть только пакеты, исходящие от вас, с вашим известным адресом канального уровня (и, следовательно, не связанных пакетов) 2) На самом деле он может быть еще умнее и знать, какой IP-адрес должен принадлежать какому адресу канального уровня (причина он знает DHCP и проверяет его)

Если 1 + 2 истинны, вам действительно нужно что-то вроде IP NAT, DHCP, ..

Но если только 1), вы можете подделать адрес канального уровня и перевернуть его на правильный адрес в другом направлении, как описано здесь:

https://wiki.debian.org/BridgeNetworkConnections#Bridging_with_a_wireless_NIC

Мост wlan и 4addr:

Преодоление wlan0 - это боль. Обычно вы не можете добавить его к интерфейсу моста (brctl возвращает «Операция запрещена»), а использование «мостового» фильтра VirtualBox приводит к большому беспорядку конфликтов ARP и DHCP. Причина этого в том, что кадры 802.11 по умолчанию содержат только три адреса: MAC-адреса обоих беспроводных устройств (портативного компьютера и точки доступа) и конечного получателя (как в Ethernet). Всегда предполагается, что существует только один возможный создатель.

802.11 может нести четвертый MAC-адрес отправителя, который используется повторителями в режиме WDS. Эту функцию также можно включить в Linux, используя iw, и включение этого режима позволит использовать wlan0 в интерфейсах моста, а также в мостовых сетях VirtualBox:

iw dev wlan0 set 4addr on

Однако с включенным 4addr вы, вероятно, будете полностью проигнорированы AP: ассоциация будет успешной, но все фреймы данных исчезнут в эфире. Это может быть из соображений безопасности (потому что чертовски сложно подделать исходный MAC-адрес. Да.) В моем маршрутизаторе (работающем с OpenRG) необходимо включить режим «WDS» для интерфейса беспроводной точки доступа, добавить устройство WDS, ограниченное моим MAC-адрес ноутбука и добавьте его в мост LAN. Пакеты 4addr теперь работают.

Однако есть еще одна проблема - маршрутизатор теперь отклоняет трехадресные пакеты от ноутбука, что может быть довольно неудобным (необходимость переключать 4addr каждый раз при смене сети WLAN). Обходной путь - добавить на портативный компьютер второй беспроводной интерфейс, связанный с тем же устройством, но с другим MAC-адресом. Сначала отмените предыдущую конфигурацию:

iw dev wlan0 set 4addr off

Затем добавьте второй интерфейс - имя было выбрано произвольно - с другим MAC-адресом:

iw dev wlan0 interface add wds.wlan0 type managed 4addr on
ip link set dev wds.wlan0 addr <addr>
ip link set dev wds.wlan0 up

Здесь должен совпадать адрес устройства WDS, настроенный в маршрутизаторе; кроме этого, это может быть любой действительный MAC-адрес. Исходный MAC-адрес wlan0 остается для «нормального» использования.

Можно использовать и wlan0, и wds.wlan0 одновременно, хотя я тестировал подключение только к одной и той же AP дважды, а не к разным AP. Я предполагаю, что им нужно хотя бы быть на одном канале.

Некоторые люди спрашивают, зачем использовать это, если VirtualBox может «нормально» соединить Wi-Fi. Ответ заключается в том, что VirtualBox не отправляет MAC-адреса виртуальных машин; скорее, он также выполняет NAT на уровне MAC. - 2014-08-22

Прямой мост WLAN

При определенных обстоятельствах вы также можете использовать wlan_kabel. Он использует пакетные сокеты для прямого соединения устройств wlan * с устройствами Ethernet. Тем не менее, с помощью wlan_kabel за раз вы можете связать только один MAC-адрес. У него нет недостатка в том, что он блокируется точками доступа, потому что используется только исходный MAC-адрес устройства wlan. В вашем случае это будет означать, что wlan0 может использоваться только одной виртуальной машиной и даже не хостом. Ты можешь получить wlan_kabel здесь. Это похоже на маквланы решение.

Мост с ipvlan

IP Vlan не имеет ограничений моста, его можно использовать для моста в сети. Подробно о том, как его использовать. можно найти здесь

Альтернатива маскараду

Вместо этого можно использовать маршрутизацию Linux с iptables-masquerade и ip_forward для создания моста, но, как уже упоминалось, для этого требуется включить ip_forward, и Linux будет действовать как маршрутизатор, это нужно настраивать осторожно, потому что это может вызвать некоторые проблемы безопасности.

# bridge setup
brctl addbr br0
ifconfig br0 10.10.20.1/24 up
 
# enable ipv4 forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
 
# netfilter cleanup
iptables --flush
iptables -t nat -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
 
# netfilter network address translation
iptables -t nat -A POSTROUTING -o wlan0 -s 10.10.20.0/24  -j MASQUERADE

Интерфейс br0 тогда будет иметь доступ к сети wlan0.

Важные и связанные

Кроме того, что очень важно, вы не должны использовать устаревшие, устаревшие команды, такие как ifconfig, brctl, и так далее. Набор iproute2 содержит команды для всего этого, включая настройку виртуальных интерфейсов (для чего нам когда-то приходилось использовать openvpn) и создание мостов. Если вы не знаете, как настроить мост с ip, поехали

  ip tuntap add tap0 mode tap user root 
  ip link set tap0 up
  ip link add br0 type bridge
  ip link set tap0 master br0
  ip link set eth0 master br0
  ip addr add 10.173.10.1/24  dev br0
  ip link set br0 up

С помощью этого набора команд мы создаем виртуальный интерфейс с именем tap0, затем мост с именем br0, затем подключаем eth0 и tap0 к мосту, которому мы назначаем IP-адрес 10.173.10.1, а затем запускаем все это. Требуются три отдельных экземпляра вызова интерфейсов (для tap0, eth0 и br0).

Уловка для выполнения этой работы заключается в использовании proxy.arp, который позволяет вашему компьютеру (а не вашему контейнеру VM / Linux / сетевому пространству имен) отвечать на запросы ARP вместо него.

Другими словами, используя пересылку IPv4 между вашим аппаратным интерфейсом и виртуальным интерфейсом, вы думаете, что можете подключить свою виртуальную машину / LXC / NNS к локальной сети, как если бы это был физический интерфейс, но это неверно: вы забываете абсолютно фундаментальный трафик ARP, который действительно позволяет LAN работать. Итак, проблема в следующем: если я правильно перенаправляю трафик IPv4, как я могу также перенаправлять трафик ARP, чтобы моя виртуальная машина / LXC / NNS работала? Хитрость в том, чтобы использовать proxy-arp.

Полный ответ на это в Блог Бохди Дзадзэн, с откровенным названием: Беспроводные карты Bridge. Он использует устаревший пакет uml-utilities для создания виртуального интерфейса с помощью команды tunctl: это единственная команда, для которой он использует uml-утилиты, так что вы можете спокойно пренебречь загрузкой пакета и использовать команду I написал выше, чтобы создать интерфейс tap или tun, в зависимости от того, что вам нравится, просто измените команду соответствующим образом. затем создайте пару veth для вашего LXC, а теперь создайте мост между tap0 и veth0. Этот мост, называемый br0, - это то, для чего вы должны использовать proxy-arp, вместо простого интерфейса tap0, описанного Бохди Дзадзеном.


Источники: askubuntu.com, nullroute.eu.org, firejail.wordpress.com, superuser.com

Мне понравилось Подход Proxy Arp, но исходный вопрос указывал на Arch Linux. Вот версия Arch Linux реализация Raspbian. Я очень старался адаптироваться оригинальный подход из Debian Wiki упомянул Вот к netctl с помощью ExecUpPost и ExecDownPre безуспешно. Все работало в командной строке, но не в профиле.

Шаги:

  1. Реализуйте беспроводную сеть с systemd-networkd. В файле .network установите IPForward=yes. я использовал Соискатель WPA для управления беспроводным сетевым интерфейсом.
  2. Включите ретрансляцию mDNS, установив enable-reflector=yes в пределах /etc/avahi/avahi-daemon.conf; начать и включить avahi-daemon.service если это еще не так.
  3. Установить проросший из AUR и создайте для него служебный файл, адаптировав файл из Распбиский ответ. Я не обнаружил, что нужно настраивать неразборчивый интерфейс. Естественно, эту службу нужно будет запустить и включить.
[Unit]
Description=proxy arp routing service
Documentation=https://raspberrypi.stackexchange.com/q/88954/79866

[Service]
Type=forking
# Restart until wlan0 gained carrier
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
ExecStartPre=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --timeout=6 --quiet
ExecStartPre=/usr/bin/echo 'systemd-networkd-wait-online: wlan0 is online'
# clone the dhcp-allocated IP to eth0 so dhcrelay will relay for the correct subnet
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip addr add $(/usr/bin/ip -4 -br addr show wlan0 | /usr/bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'
ExecStartPre=/usr/bin/ip link set dev eth0 up

#         v minus sign
ExecStart=-/usr/bin/parprouted eth0 wlan0

ExecStopPost=/usr/bin/ip link set dev eth0 down
ExecStopPost=/usr/bin/bash -c '/usr/bin/ip addr del $(/usr/bin/ip -4 -br addr show eth0 | /usr/bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'

[Install]
WantedBy=wpa_supplicant@wlan0.service
  1. Для поддержки DHCP для устройства, подключенного к порту Ethernet, создайте службу dhcrelay (из пакета DHCP). Поиск адреса DHCP-сервера с помощью grep'а по журналам кажется неэлегантным, но это работает. Запускаем и включаем.
[Unit]
Description=DHCRelay Service
After=network-online.target parprouted_bridge.service
Type=simple

[Service]
ExecStart=/usr/bin/bash -c '/usr/bin/dhcrelay -d -4 -iu wlan0 -id eth0 $(/usr/bin/journalctl -b -u systemd-networkd.service | /usr/bin/grep -Po "via\s+\K\\d+\\.\\d+\\.\\d+\\.\\d+")'

[Install]
WantedBy=multi-user.target

Этот подход сработал для меня на Raspberry Pi Model B + с ArchLinuxArm с USB-адаптером WiFi с чипсетом RT5370. Поскольку Pi будет предоставлять Wi-Fi для принтера только с Ethernet, я бы хотел, чтобы он был устойчивым к грубому обращению, поэтому следующим моим шагом будет настройка SD-карта только для чтения.