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


25

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


8
пожалуйста, не ставьте «[решено]» в вопросе или заголовке, так как принятие ответа является правильным способом показать, что проблема была решена. Это изменяет способ отображения вопроса в главном списке, а также ставит зеленую галочку на ответ, который вы пометили как правильный.
Zypher

1
Я был бы признателен, если бы никто не запутался с этой страницей. Если у вас есть какие-либо проблемы, свяжитесь со мной. Спасибо.
dbdii407

13
serverfault.com/faq В частности, заголовок «Другие люди могут редактировать мои материалы»
Zypher,

@Zypher URL, на который вы ссылаетесь, больше не существует. Переместился ли соответствующий пункт в другое место?
Касперд

Ответы:


24

ОБНОВИТЬ

В соответствии с этим потоком на 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

3
Вам на самом деле не нужен IP-адрес для интерфейса моста, чтобы мост работал.
Массимо

7
невозможно добавить wlan0 для моста mybridge: операция не поддерживается
dbdii407

1
@Massimo: да, это правда. Действительный IP-адрес необходим для доступа к сети из «соединительного устройства».
cstamas

10
NAT - это нечто совершенно отличное от моста. Мостовое соединение - это уровень два, NAT - это уровень три, и он зависит от IPv4. Я не понимаю, почему это принятый ответ.
WhyNotHugo

3
@Hugo IP NAT - это уровень 3, а MAC NAT - это уровень 2. Для мостового соединения WiFi вы можете использовать 4addr, WDS, MAC NAT или сделать что-то на уровне 3 (например, IP NAT).
Дэвид Шварц

27

Для подключения интерфейса 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

2
Для чего нужен этот параметр и почему вы специально предлагаете использовать его в этом сценарии?
Хакре

Это решение для ошибки «Операция не разрешена» при попытке добавить интерфейс wlan0 к интерфейсу моста. После этого вам нужно указать интерфейс моста в / etc / network / interfaces, чтобы он появлялся после запуска.
Str82DHeaD

1
@hakre 4addrРежим заставляет WiFi вести себя достаточно как проводной Ethernet, чтобы мост работал. Без этого мост не будет работать без NAT.
Дэвид Шварц

1
4addrтребует, чтобы обе стороны беспроводного канала поддерживали его (предполагая, что вы пытаетесь внедрить удлинитель Wi-Fi)
nhed

5

Зависит от того, насколько значимым является AP для вас:

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

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

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

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


Это действительно грязно. И это требует дополнительной настройки каждый раз, когда вы добавляете новый компьютер.
Майкл Хэмптон

4

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

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


эта ссылка на решение proxy-arp plus dhcp-helper является наиболее совместимым и наиболее чистым решением, которое я когда-либо видел.
Минхуа

3

Мост 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 точка доступа может полностью проигнорировать точку доступа: связь успешно завершена, но все кадры данных исчезают в эфире. Это может быть из соображений безопасности (потому что чертовски сложно подделать 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 может «мостить» WiFi «просто отлично». Ответ заключается в том, что VirtualBox не отправляет MAC-адреса виртуальных машин; скорее это выполняет NAT на уровне MAC также. - 2014-08-22

Прямой мост WLAN

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

Соединение с 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 между вашим аппаратным интерфейсом и виртуальным интерфейсом, вы думаете, что можете подключить вашу VM / LXC / NNS к вашей локальной сети, как если бы это был физический интерфейс, но это не так: вы забываете абсолютно основной трафик ARP, который действительно позволяет локальной сети работать. Итак, проблема в том, что если я правильно пересылаю трафик IPv4, как я также могу пересылать трафик ARP, чтобы моя VM / LXC / NNS работала? Хитрость заключается в использовании proxy-arp.

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


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


0

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

Шаги:

  1. Реализуйте беспроводную сеть с помощью systemd-networkd . В файле .network установите IPForward=yes. Я использовал WPA Supplicant для управления интерфейсом беспроводной сети.
  2. Включить ретрансляцию mDNS, установив enable-reflector=yesвнутри /etc/avahi/avahi-daemon.conf; запустить и включить, avahi-daemon.serviceесли это еще не так.
  3. Установите parprouted из AUR и создайте для него служебный файл, адаптировав файл из ответа Raspbian . Я не нашел, что было необходимо установить беспорядочный интерфейс. Естественно, эта служба должна быть запущена и включена.
[Unit]
Description=proxy arp routing service
Documentation=/raspberrypi//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-карты только для чтения .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.