В 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:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Затем вам нужно назначить себе IP-адреса:
ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up
Установите 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;
}
Затем запустите его /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
безуспешно. Все работало в командной строке, но не в профиле.
Шаги:
IPForward=yes
. я использовал Соискатель WPA для управления беспроводным сетевым интерфейсом.enable-reflector=yes
в пределах /etc/avahi/avahi-daemon.conf
; начать и включить avahi-daemon.service
если это еще не так.[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
[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-карта только для чтения.