Überbrückung von wlan0 zu eth0


25

Unter Arch Linux möchte ich, dass eth0 (verbunden mit einem Bridged-Router) die von wlan0 empfangene Verbindung freigibt. Ich habe Tutorials gelesen, bin aber nicht befehlssicher wie andere Benutzer und verstehe das nicht ganz.


8
Bitte setzen Sie nicht "[gelöst]" in die Frage oder den Titel. Die Annahme einer Antwort ist der richtige Weg, um zu zeigen, dass ein Problem gelöst wurde. Es ändert die Art und Weise, wie die Frage in der Hauptliste angezeigt wird, und setzt das grüne Häkchen auf die Antwort, die Sie als richtig markiert haben.
Zypher

1
Ich würde es begrüßen, wenn sich niemand mit dieser Seite anlegen würde. Wenn Sie irgendwelche Probleme haben, kontaktieren Sie mich. Vielen Dank.
Dbdii407

13
serverfault.com/faq Speziell die Überschrift "Andere Leute können meine Sachen bearbeiten"
Zypher

@Zypher Die URL, zu der Sie einen Link erstellen, existiert nicht mehr. Wurde der betreffende Absatz an eine andere Stelle verschoben?
Kasperd

Antworten:


24

AKTUALISIEREN

Unter linux-ath5k-devel ist es nicht möglich, eine Brücke zwischen drahtlosen (Client oder Stationsmodus) und kabelgebundenen Schnittstellen gemäß diesem Thread herzustellen .

NAT einrichten

Man sollte stattdessen NAT einrichten:

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

Zuweisen einer IP

Dann müssen Sie sich IP-Adressen zuweisen:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

Installieren Sie den DHCP-Daemon

Installieren Sie einen DHCP-Server und fügen Sie den folgenden Text in die Konfigurationsdatei ein (in /etc/dhcpd.conf oder ähnlichem)

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

Starten Sie dhcpd

Dann starte es /etc/init.d/dhcpd start

Und das ist es!

Lesen Sie unten nur, wenn Sie sich für das nicht funktionierende Bridging-Setup interessieren


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

Zuerst erstellen Sie eine Bridge-Schnittstelle. Ich wähle einen beliebigen Namen für mybridge und füge ihr dann Schnittstellen hinzu.

Sie sollten eine neue IP-Adresse anfordern (Dies wird nur benötigt, wenn Sie eine gültige IP für das Bridging-Gerät selbst erhalten möchten):

dhclient -d mybridge

3
Sie benötigen keine IP-Adresse für die Bridge-Schnittstelle, damit das Bridging funktioniert.
Massimo

7
Ich kann wlan0 nicht zur Bridge mybridge hinzufügen: Operation nicht unterstützt
dbdii407

1
@ Massimo: ja das stimmt. Die gültige IP wird benötigt, um vom "Bridging Device" auf das Netz zuzugreifen.
cstamas

10
NAT ist etwas völlig anderes als Bridging. Bridging ist Schicht zwei, NAT ist Schicht drei und IPv4-spezifisch. Ich verstehe nicht, warum dies eine akzeptierte Antwort ist.
WhyNotHugo

3
@Hugo IP NAT ist Schicht 3, MAC NAT ist Schicht 2. Für die WiFi-Überbrückung können Sie 4addr, WDS, MAC NAT verwenden oder Sie können stattdessen etwas auf Schicht 3 tun (z. B. IP NAT).
David Schwartz

27

Zur Überbrückung der WLAN- Schnittstelle können Sie das iwTool verwenden, um 4addr ebenfalls zu aktivieren :

# iw dev <wifiInterface> set 4addr on

dh:

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

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

Jetzt sollte es klappen. Sie können Brücken zeigen mit:

# brctl show

2
Wofür ist diese Einstellung und warum schlagen Sie sie in diesem Szenario speziell vor?
Hakre

Dies ist eine Lösung für den Fehler "Vorgang nicht zulässig", wenn versucht wird, der Bridge-Schnittstelle eine wlan0-Schnittstelle hinzuzufügen. Danach müssen Sie die Bridge-Schnittstelle in / etc / network / interfaces angeben, um sie nach dem Start aufzurufen.
Str82DHeaD

1
@hakre In diesem 4addrModus verhält sich WiFi so stark wie kabelgebundenes Ethernet, dass Bridging funktioniert. Ohne das funktioniert Bridging nicht ohne NAT.
David Schwartz

1
4addrerfordert, dass beide Seiten einer drahtlosen Verbindung dies unterstützen (vorausgesetzt, Sie versuchen, einen WLAN-Extender zu implementieren)
am

5

Kommt darauf an, wie gemein der AP für dich ist:

1) Möglicherweise möchte es nur Pakete sehen, die von Ihnen stammen, mit Ihrer bekannten Link-Layer-Adresse (und daher nicht von überbrückten Paketen) es kennt DHCP und prüft es)

Wenn 1 + 2 beide wahr sind, brauchst du ja sowas wie IP NAT, DHCP, ..

Wenn jedoch nur 1) zutrifft, können Sie die Link-Layer-Adresse fälschen und in umgekehrter Reihenfolge wie hier beschrieben auf der rechten Seite abbilden:

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


Das ist wirklich chaotisch. Und jedes Mal, wenn Sie einen neuen Computer hinzufügen, ist ein zusätzliches Setup erforderlich.
Michael Hampton

4

4addr, wie in anderen Antworten beschrieben, ist sicherlich der beste Weg, wenn es vom Adapter / Treiber unterstützt wird, aber nicht alle von ihnen. NAT funktioniert möglicherweise für einige Dinge, aber eine ordnungsgemäße Kommunikation auf beiden Wegen im LAN wird problematisch (z. B. Anschließen eines Druckers oder Zugreifen auf andere IoT-Geräte auf der anderen Seite des NAT). Alles, was auf Broadcast / Multicast angewiesen ist (z. B. automatische Erkennung, Bonjour), schlägt über das NAT fehl.

Die Alternative ist die Verwendung eines ARP-Proxys (parprouted), wie in https://wiki.debian.org/BridgeNetworkConnectionsProxyArp beschrieben . Ich habe dies auf einem Himbeer-Pi für einen Drucker eingerichtet und es funktioniert wie ein Zauber (ich habe den post-upBefehlen einen 10-Sekunden-Schlaf hinzugefügt , damit er zuerst eine IP-Adresse erhält, was möglicherweise mit der Langsamkeit meines alten zu tun hat RPi ...)


dieser link zur proxy-arp plus dhcp-helper lösung ist die bisher kompatibelste und sauberste lösung, die ich gesehen habe.
Minghua

3

Bridge wlan und 4addr:

Überbrückung von wlan0 ist ein Schmerz. Normalerweise können Sie es nicht zu einer Bridge-Schnittstelle hinzufügen (brctl gibt "Operation not allowed" zurück), und die Verwendung des VirtualBox-Filters "bridged" führt zu einem großen Durcheinander von ARP- und DHCP-Konflikten. Die Ursache hierfür ist, dass 802.11-Frames standardmäßig nur drei Adressen enthalten: Die MAC-Adressen sowohl der drahtlosen Geräte (Laptop und AP) als auch des Endempfängers (wie in Ethernet). Es wird immer davon ausgegangen, dass es nur einen möglichen Urheber gibt.

802.11 kann die vierte MAC-Adresse des Absenders tragen, die von Repeatern im WDS-Modus verwendet wird. Diese Funktion kann auch unter Linux mit iw aktiviert werden. Wenn Sie diesen Modus aktivieren, kann wlan0 sowohl in Bridge-Schnittstellen als auch in VirtualBox-Bridged-Netzwerken verwendet werden:

iw dev wlan0 set 4addr on

Wenn 4addr aktiviert ist, werden Sie wahrscheinlich vom AP vollständig ignoriert: Die Zuordnung ist erfolgreich, aber alle Datenrahmen verschwinden im Ether. Dies kann aus Sicherheitsgründen sein (weil es verdammt schwer ist, die MAC-Quelladresse zu verfälschen. Ja.) In meinem Router (mit OpenRG) muss der "WDS" -Modus für die WLAN-AP-Schnittstelle aktiviert werden. Fügen Sie ein WDS-Gerät hinzu, das auf meine beschränkt ist die MAC-Adresse des Laptops und fügen Sie sie der LAN-Bridge hinzu. 4addr-Pakete funktionieren jetzt.

Es gibt jedoch ein weiteres Problem: Der Router weist jetzt Pakete mit drei Adressen vom Laptop zurück, was ziemlich unpraktisch sein kann (bei jedem Wechsel des WLAN-Netzwerks muss 4addr umgeschaltet werden). Die Problemumgehung besteht darin, auf dem Laptop eine zweite drahtlose Schnittstelle hinzuzufügen, die mit demselben Gerät verbunden ist, jedoch eine andere MAC-Adresse aufweist. Machen Sie zuerst die frühere Konfiguration rückgängig:

iw dev wlan0 set 4addr off

Fügen Sie dann eine zweite Schnittstelle hinzu - der Name wurde willkürlich gewählt - mit einer anderen MAC-Adresse:

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

Hier muss die im Router konfigurierte WDS-Geräteadresse übereinstimmen; Ansonsten kann es sich um eine beliebige gültige MAC-Adresse handeln. Der ursprüngliche MAC von wlan0 bleibt dann für den "normalen" Gebrauch erhalten.

Es ist möglich, sowohl wlan0 als auch wds.wlan0 gleichzeitig zu verwenden - obwohl ich die Zuordnung zu demselben AP nur zweimal getestet habe, nicht zu verschiedenen APs. Ich vermute, sie müssten mindestens auf demselben Kanal sein.

Einige Leute haben gefragt, warum dies verwendet werden soll, wenn VirtualBox WiFi "in Ordnung" überbrücken kann. Die Antwort ist, dass VirtualBox die MAC-Adressen der virtuellen Maschinen nicht sendet. Vielmehr wird NAT auch auf der MAC-Ebene ausgeführt. - 22.08.2014

Direkte WLAN-Brücke

Unter Umständen können Sie auch wlan_kabel verwenden. Es verwendet Paket-Sockets, um Wlan * -Geräte direkt mit Ethernet-Geräten zu verbinden. Mit wlan_kabel können Sie jedoch immer nur einen einzigen MAC gleichzeitig überbrücken. Es hat nicht den Nachteil, von Zugangspunkten gesperrt zu sein, da nur der ursprüngliche MAC des WLAN-Geräts verwendet wird. In Ihrem Fall würde dies bedeuten, dass wlan0 nur von einer VM und nicht einmal vom Host verwendet werden kann. Sie können wlan_kabel hier bekommen . Dies ähnelt der macvlans- Lösung.

Überbrückung mit ipvlan

IP Vlan hat nicht die Einschränkung einer Bridge, die zum Überbrücken eines Netzwerks verwendet werden kann. Details zur Verwendung finden Sie hier

Maskerade-Alternative

Linux-Routing kann stattdessen mit iptables-masquerade und ip_forward verwendet werden, um eine Bridge zu erstellen. Wie bereits erwähnt, muss jedoch ip_forward aktiviert werden, damit Linux sich wie ein Router verhält. Dies muss sorgfältig konfiguriert werden, da dies zu Sicherheitsrisiken führen kann.

# 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

Die Schnittstelle br0 hat dann Zugriff auf das wlan0-Netzwerk

Wichtig und verwandt

Außerdem und sehr wichtig, sollten Sie keine veralteten, veralteten Befehle wie ifconfig, brctl usw. verwenden. Die iproute2-Suite enthält Befehle für all dies, einschließlich der Einrichtung virtueller Schnittstellen (für die wir früher openvpn verwenden mussten) und der Erstellung von Bridges. Wenn Sie nicht wissen, wie Sie eine Bridge mit ip einrichten, können Sie loslegen

  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

Mit diesem Befehlssatz erstellen wir eine virtuelle Schnittstelle mit dem Namen tap0, dann eine Brücke mit dem Namen br0, versklaven eth0 und tap0 der Brücke, der wir die IP-Adresse 10.173.10.1 zuweisen, und rufen sie dann auf. Die drei separaten Instanzen zum Aufrufen der Schnittstellen (für tap0, eth0 und br0) sind erforderlich.

Der Trick, mit dem dies funktioniert, ist die Verwendung von proxy.arp, mit dem Ihr PC (nicht Ihr VM / Linux-Container / Netzwerk-Namespace) ARP-Anfragen an deren Stelle beantworten kann.

Mit anderen Worten, wenn Sie IPv4-Weiterleitung zwischen Ihrer Hardwareschnittstelle und Ihrer virtuellen Schnittstelle verwenden, können Sie Ihre VM / LXC / NNS an Ihr LAN anschließen, als wäre es eine physische Schnittstelle, aber dies ist nicht wahr: Sie vergessen das Absolute Grundlegender ARP-Verkehr, der den LAN-Betrieb wirklich ermöglicht. Das Problem ist also: Wenn ich IPv4-Datenverkehr richtig weiterleite, wie kann ich dann auch ARP-Datenverkehr weiterleiten, damit meine VM / LXC / NNS funktionieren? Der Trick ist, Proxy-Arp zu verwenden.

Die vollständige Antwort darauf finden Sie im Blog von Bohdi Zazen mit dem aufschlussreichen Titel: Bridge wireless cards. Er verwendet ein veraltetes Paket, uml-utilities, um mithilfe des Befehls tunctl eine virtuelle Schnittstelle zu erstellen. Dies ist der einzige Befehl, für den er uml-utilities verwendet, sodass Sie das Herunterladen des Pakets sicher vernachlässigen und den Befehl I verwenden können Schreiben Sie oben, um ein Tap- oder Tun-Interface zu erstellen. Ändern Sie einfach den Befehl entsprechend. Erstellen Sie dann ein Veth-Paar für Ihren LXC und stellen Sie nun eine Brücke zwischen tap0 und veth0 her. Für diese Brücke mit dem Namen br0 müssen Sie anstelle der von Bohdi Zazen beschriebenen einfachen Schnittstelle tap0 einen Proxy-Arp ausführen.


Quellen: askubuntu.com , nullroute.eu.org , firejail.wordpress.com , superuser.com


0

Ich mochte den Proxy-Arp-Ansatz , aber die ursprüngliche Frage spezifizierte Arch Linux. Hier ist eine Arch Linux-Version einer Raspbian-Implementierung . Ich habe mich sehr bemüht, den ursprünglichen Ansatz aus dem hier erwähnten Debian-Wiki mit und ohne Erfolg an netctl anzupassen . Alles funktionierte auf der Kommandozeile, aber nicht im Profil.ExecUpPostExecDownPre

Die Schritte:

  1. Implementieren Sie drahtlose Netzwerke mit systemd-networkd . Legen Sie in der .network-Datei fest IPForward=yes. Ich habe WPA Supplicant verwendet , um die drahtlose Netzwerkschnittstelle zu verwalten.
  2. Aktivieren Sie die mDNS-Weiterleitung, indem Sie enable-reflector=yesinnerhalb von festlegen /etc/avahi/avahi-daemon.conf. starten und aktivieren, avahi-daemon.servicefalls noch nicht geschehen.
  3. Installieren Sie parprouted aus dem AUR und erstellen Sie eine Servicedatei dafür, indem Sie die aus der Raspbian-Antwort anpassen . Ich fand es nicht notwendig, die Schnittstelle so einzustellen, dass sie promiskuitiv ist. Dieser Dienst muss natürlich gestartet und aktiviert werden.
[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. Erstellen Sie einen DHCP-Dienst (aus dem DHCP-Paket), um DHCP für das an den Ethernet-Port angeschlossene Gerät zu unterstützen. Das Ermitteln der Adresse des DHCP-Servers durch Durchsuchen von Protokollen scheint nicht relevant, funktioniert jedoch. Starten und aktivieren.
[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

Dieser Ansatz funktionierte für mich auf einem Himbeer-Pi-Modell B + mit ArchLinuxArm und einem USB-WLAN-Adapter mit dem RT5370-Chipsatz. Da der Pi WLAN nur für einen Drucker mit Ethernet bereitstellt, möchte ich, dass er unempfindlich gegen grobe Beanspruchung ist. Als Nächstes muss die SD-Karte als schreibgeschützt konfiguriert werden .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.