Łączenie wlan0 z eth0

25

W Arch Linux chciałbym, aby eth0 (podłączony do zmostkowanego routera) współdzielił połączenie otrzymane z wlan0, czytałem tutoriale, ale nie jestem zorientowany na polecenia jak inni użytkownicy i nie do końca rozumiem.

dbdii407
źródło
8
proszę nie wpisywać „[rozwiązany]” w pytaniu lub tytule, zaakceptowanie odpowiedzi jest prawidłowym sposobem pokazania, że ​​problem został rozwiązany. Zmienia sposób wyświetlania pytania na głównej liście, a także umieszcza zielony znacznik wyboru na odpowiedzi, którą oznaczyłeś jako poprawną.
Zypher
1
Byłbym wdzięczny, gdyby nikt nie pomieszał tej strony. Jeśli masz jakieś problemy, skontaktuj się ze mną. Dziękuję Ci.
dbdii407
13
serverfault.com/faq W szczególności nagłówek „Inne osoby mogą edytować moje rzeczy”
Zypher,
@Zypher Adres URL, do którego prowadzi link, już nie istnieje. Czy odpowiedni akapit przeniósł się gdzie indziej?
kasperd
4
@kasperd serverfault.com/help/editing
Zypher

Odpowiedzi:

24

AKTUALIZACJA

Nie jest możliwe mostkowanie między interfejsem bezprzewodowym (tryb klienta aka stacji) a przewodowymi interfejsami zgodnie z tym wątkiem na linux-ath5k-devel .

Ustaw NAT

Zamiast tego należy ustawić NAT:

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

Przypisywanie adresu IP

Następnie musisz przypisać sobie adresy IP:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

Zainstaluj demona dhcp

Zainstaluj serwer dhcp i dodaj następujący tekst do jego pliku konfiguracyjnego (w /etc/dhcpd.conf lub coś podobnego)

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;
}

Uruchom dhcpd

Następnie uruchom /etc/init.d/dhcpd start

I to wszystko!

Przeczytaj tylko poniżej, jeśli jesteś zainteresowany niedziałającą konfiguracją pomostową


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

Najpierw tworzysz interfejs mostka. Wybieram dowolną nazwę mybridge, a następnie dodaję do niej interfejsy.

Powinieneś poprosić o nowy adres IP (jest to potrzebne tylko, jeśli chcesz uzyskać prawidłowy adres IP dla samego urządzenia mostkującego):

dhclient -d mybridge
cstamas
źródło
3
Tak naprawdę nie potrzebujesz adresu IP dla interfejsu mostka, aby mostek działał.
Massimo,
7
nie można dodać wlan0 do mostka mybridge: Operacja nie jest obsługiwana
dbdii407
1
@Massimo: tak, to prawda. Prawidłowy adres IP jest potrzebny, aby uzyskać dostęp do sieci z „urządzenia pomostowego”.
cstamas
10
NAT jest czymś zupełnie innym niż mostkowanie. Mostkowanie to warstwa druga, NAT to warstwa trzecia i specyficzne dla IPv4. Nie rozumiem, dlaczego jest to akceptowana odpowiedź.
WhyNotHugo
3
@Hugo IP NAT to warstwa 3, ale MAC NAT to warstwa 2. Do mostkowania Wi-Fi możesz użyć 4addr, WDS, MAC NAT lub możesz zrobić coś na warstwie 3 (np. IP NAT).
David Schwartz
27

Aby połączyć interfejs WiFi , możesz użyć iwnarzędzia do włączenia 4addr podobnie:

# iw dev <wifiInterface> set 4addr on

to znaczy:

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

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

Teraz powinno działać. Możesz wyświetlać mosty za pomocą:

# brctl show
amized
źródło
2
Do czego służy to ustawienie i dlaczego konkretnie sugerujesz jego użycie w tym scenariuszu?
hakre
Jest to rozwiązanie błędu „Operacja niedozwolona” podczas próby dodania interfejsu wlan0 do interfejsu mostka. Następnie musisz określić interfejs mostka w / etc / network / interfaces, aby był uruchamiany po uruchomieniu.
Str82DHeaD,
1
@hakre 4addrTryb sprawia, że ​​WiFi zachowuje się wystarczająco jak przewodowy Ethernet, aby mostkowanie działało. Bez tego mostkowanie nie będzie działać bez NAT.
David Schwartz
1
4addrwymaga, aby obie strony łącza bezprzewodowego go obsługiwały (zakładając, że próbujesz wdrożyć przedłużacz Wi-Fi)
nhed
5

Zależy od tego, jak znaczy dla ciebie AP:

1) Może chcieć widzieć tylko pakiety przychodzące od Ciebie, ze znanym adresem warstwy łącza (a więc nie pakietów zmostkowanych) 2) Może być nawet mądrzejsze i wiedzieć, który adres IP powinien należeć do którego adresu warstwy łącza (przyczyna zna DHCP i sprawdza go)

Jeśli oba 1 + 2 są prawdziwe, potrzebujesz czegoś takiego jak IP NAT, DHCP, ..

Ale jeśli jest to tylko 1), możesz sfałszować adres warstwy łącza i odwrócić mapę na właściwy w przeciwnym kierunku, jak opisano tutaj:

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

Arnout
źródło
To jest naprawdę bałagan. I wymaga dodatkowej konfiguracji za każdym razem, gdy dodajesz nowy komputer.
Michael Hampton
4

4addr, jak opisano w innych odpowiedziach, jest z pewnością najlepszym sposobem, jeśli jest obsługiwany przez adapter / sterownik, ale nie wszystkie z nich. NAT może działać w niektórych przypadkach, ale problem z prawidłową komunikacją w obie strony stanie się problematyczny (np. Podłączenie drukarki lub dostęp do innych urządzeń IoT po drugiej stronie NAT). Wszystko, co opiera się na emisji / multiemisji (np. Automatyczne wykrywanie, bonjour) zawiedzie przez NAT.

Alternatywą jest użycie serwera proxy ARP (przetworzonego) zgodnie z opisem w https://wiki.debian.org/BridgeNetworkConnectionsProxyArp . Skonfigurowałem to na Raspberry Pi dla drukarki i działa jak urok (dodałem 10 sekund uśpienia w post-uppoleceniach, aby najpierw otrzymał adres IP, może to mieć związek ze spowolnieniem mojego starego RPi ...)

Thomas Guyot-Sionnest
źródło
ten link do proxy-arp plus dhcp-helper jest najbardziej zgodnym i najczystszym rozwiązaniem, jakie do tej pory widziałem.
minghua
3

Bridge wlan i 4addr:

Bridging wlan0 to ból. Zwykle nie można go dodać do interfejsu pomostowego (brctl zwraca „Operacja niedozwolona”), a użycie „zmostkowanego” filtra VirtualBox powoduje duży bałagan konfliktów ARP i DHCP. Powodem tego jest to, że ramki 802.11 domyślnie zawierają tylko trzy adresy: adresy MAC zarówno urządzeń bezprzewodowych (laptopa i AP), jak i końcowego odbiorcy (jak w sieci Ethernet). Zawsze zakłada się, że istnieje tylko jeden pomysłodawca.

802.11 może przenosić czwarty adres MAC nadawcy, który jest używany w trybie WDS przez repeatery. Tę funkcję można włączyć również w systemie Linux, używając iw, a włączenie tego trybu pozwoli na użycie wlan0 w interfejsach mostu, a także w sieci mostkowanej VirtualBox:

iw dev wlan0 set 4addr on

Jednak przy włączonym 4addr, możesz zostać całkowicie zignorowany przez AP: skojarzenie się powiedzie, ale wszystkie ramki danych znikną w eterze. Może to być spowodowane względami bezpieczeństwa (ponieważ cholernie trudno jest sfałszować źródłowy adres MAC. Tak.) W moim routerze (z uruchomionym OpenRG) konieczne jest włączenie trybu „WDS” dla interfejsu bezprzewodowego AP, dodaj urządzenie WDS ograniczone do mojego adres MAC laptopa i dodaj go do mostu LAN. Pakiety 4addr działają teraz.

Jest z tym jednak inny problem - router odrzuca teraz pakiety trzy-adresowe z laptopa, co może być raczej niewygodne (konieczność przełączania 4addr przy każdej zmianie sieci WLAN). Obejściem tego problemu jest dodanie na laptopie drugiego interfejsu bezprzewodowego połączonego z tym samym urządzeniem, ale o innym adresie MAC. Najpierw cofnij wcześniejszą konfigurację:

iw dev wlan0 set 4addr off

Następnie dodaj drugi interfejs - nazwę wybrano dowolnie - z innym adresem 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

Tutaj musi być zgodny adres urządzenia WDS skonfigurowany w routerze; poza tym może to być dowolny prawidłowy adres MAC. Oryginalny MAC wlan0 pozostaje wtedy do „normalnego” użytkowania.

Możliwe jest jednoczesne używanie zarówno wlan0, jak i wds.wlan0 - chociaż testowałem tylko skojarzenie z tym samym AP dwa razy, a nie z różnymi AP. Zgaduję, że musieliby przynajmniej być na tym samym kanale.

Niektóre osoby pytają, dlaczego korzystać z tego, skoro VirtualBox może łączyć WiFi „w porządku”. Odpowiedź jest taka, że ​​VirtualBox nie wysyła adresów MAC maszyn wirtualnych; raczej wykonuje NAT również w warstwie MAC. - 2014-08-22

Bezpośredni most WLAN

W pewnych okolicznościach możesz również użyć wlan_kabel. Wykorzystuje gniazda pakietowe do bezpośredniego mostkowania urządzeń WLAN * z urządzeniami Ethernet. Jednak wlan_kabel może jednocześnie pomostować tylko jeden MAC. Nie ma wady polegającej na blokowaniu przez punkty dostępu, ponieważ używany jest tylko oryginalny MAC urządzenia wlan. W twoim przypadku oznaczałoby to, że wlan0 może być używany tylko przez jedną maszynę wirtualną, a nawet przez hosta. Możesz dostać wlan_kabel tutaj . Jest to podobne do rozwiązania Macvlans .

Łączenie z ipvlan

IP Vlan nie ma ograniczenia mostu, można by go użyć do pomostowania szczegółów sieci, w jaki sposób z niego korzystać można znaleźć tutaj

Alternatywna maskarada

W celu uzyskania mostu można użyć routingu dla systemu Linux z iptables-masquerade i ip_forward, ale jak wspomniano powyżej, wymaga to włączenia ip_forward i sprawi, że linux będzie działał jak router, należy to skonfigurować ostrożnie, ponieważ może to powodować pewne obawy dotyczące bezpieczeństwa.

# 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

Interfejs br0 będzie wtedy miał dostęp do sieci wlan0

Ważne i powiązane

Ponadto, co bardzo ważne, nie należy używać przestarzałych, przestarzałych poleceń, takich jak ifconfig, brctl i tak dalej. Pakiet iproute2 zawiera polecenia do tego wszystkiego, w tym konfigurację interfejsów wirtualnych (coś, do czego kiedyś musieliśmy używać openvpn) i tworzenie mostów. Jeśli nie wiesz, jak skonfigurować mostek z ip, to zaczynamy

  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

Za pomocą tego zestawu poleceń tworzymy wirtualny interfejs o nazwie tap0, następnie most o nazwie br0, następnie zniewolimy eth0 i tap0 do mostu, do którego przypisujemy adres IP 10.173.10.1, a następnie przywracamy wszystko. Wymagane są trzy osobne przypadki uruchomienia interfejsów (dla tap0, eth0 i br0).

Sztuką, aby to zadziałało, jest użycie proxy.arp, który pozwala komputerowi (a nie twojemu kontenerowi VM / Linux / przestrzeni nazw) odpowiadać na zapytania ARP zamiast nich.

Innymi słowy, korzystając z przekazywania IPv4 między interfejsem sprzętowym a interfejsem wirtualnym, myślisz, że możesz podłączyć VM / LXC / NNS do sieci LAN, jakby to był interfejs fizyczny, ale to nieprawda: zapominasz absolutnie podstawowy ruch ARP, który naprawdę umożliwia działanie sieci LAN. Problem polega na tym: jeśli poprawnie przekażę ruch IPv4, jak mogę również przekazać ruch ARP, aby moja VM / LXC / NNS działała? Sztuką jest użycie proxy-arp.

Pełna odpowiedź na to pytanie znajduje się na blogu Bohdiego Zazena o odkrywczym tytule: Karty bezprzewodowe Bridge. Używa przestarzałego pakietu, uml-utilities, do stworzenia interfejsu wirtualnego za pomocą polecenia tunctl: jest to jedyne polecenie, do którego używa uml-utilities, dzięki czemu można bezpiecznie zaniedbać pobieranie pakietu i użyć polecenia I napisałem powyżej, aby utworzyć interfejs dotknij lub tun, cokolwiek chcesz, po prostu odpowiednio zmodyfikuj polecenie. następnie utwórz parę veth dla swojego LXC, a teraz stwórz pomost między tap0 i veth0. Ten most, zwany br0, jest tym, dla którego musisz proxy-arp, zamiast prostego interfejsu tap0 opisanego przez Bohdiego Zazena.


Źródła: askubuntu.com , nullroute.eu.org , firejail.wordpress.com , superuser.com

intika
źródło
0

Podobało mi się podejście Proxy Arp , ale pierwotne pytanie określało Arch Linux. Oto wersja implementacji Raspbian dla Arch Linux . Bardzo się starałem dostosować oryginalne podejście z wspomnianej tutaj Debian Wiki do netctl przy użyciu ExecUpPosti ExecDownPrebez powodzenia. Wszystko działało w linii poleceń, ale nie w profilu.

Kroki:

  1. Wdrażanie sieci bezprzewodowej za pomocą systemd-networkd . W pliku .network ustaw IPForward=yes. Użyłem dostawcy WPA do zarządzania interfejsem sieci bezprzewodowej.
  2. Włącz przekazywanie mDNS, ustawiając enable-reflector=yesw /etc/avahi/avahi-daemon.conf; uruchom i włącz, avahi-daemon.servicejeśli jeszcze nie jest.
  3. Zainstaluj parprouted z AUR i utwórz dla niego plik usługi, dostosowując ten z odpowiedzi Raspbian . Nie uznałem za konieczne ustawienie interfejsu na wyuzdany. Oczywiście ta usługa będzie musiała zostać uruchomiona i włączona.
[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]
[email protected]
  1. Aby obsługiwać DHCP dla urządzenia podłączonego do portu Ethernet, utwórz usługę dhcrelay (z pakietu DHCP). Znalezienie adresu serwera DHCP poprzez grep'ing poprzez logi wydaje się nieeleganckie, ale działa. Uruchom i włącz.
[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

To podejście zadziałało w przypadku Raspberry Pi Model B + w / ArchLinuxArm ze złączem USB WiFi z mikroukładem RT5370. Ponieważ Pi będzie zapewniać Wi-Fi drukarce z tylko ethernetem, chciałbym, aby była odporna na zgrubną obsługę, więc moim następnym krokiem będzie skonfigurowanie karty SD jako tylko do odczytu .

tytułowy
źródło