it-swarm.com.de

Überbrückung von wlan0 mit eth0

Unter Arch Linux möchte ich, dass eth0 (verbunden mit einem überbrückten Router) die von wlan0 empfangene Verbindung freigibt. Ich habe Tutorials gelesen, bin aber nicht so befehlssicher wie andere Benutzer und verstehe das nicht vollständig.

28
dbdii407

[~ # ~] Update [~ # ~]

Es ist nicht möglich, eine Brücke zwischen drahtlosen (Client a.k.a. Stationsmodus) und verkabelten Schnittstellen zu schlagen gemäß diesem Thread unter linux-ath5k-devel .

Richten Sie NAT ein

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 zu seiner Konfigurationsdatei hinzu (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 starten Sie es /etc/init.d/dhcpd start

Und das ist es!

Lesen Sie unten nur, wenn Sie an der nicht funktionierenden Überbrückungskonfiguration interessiert sind


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

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

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

dhclient -d mybridge
25
cstamas

Um Bridge Wifi Schnittstelle zu verwenden, können Sie das Tool iw verwenden, um 4addr zu aktivieren ebenfalls:

# 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 funktionieren. Sie können Brücken anzeigen mit:

# brctl show
29
amized

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

1) Möglicherweise möchten Sie nur Pakete sehen, die von Ihnen mit Ihrer bekannten Verbindungsschichtadresse (und damit nicht von überbrückten Paketen) kommen. 2) Es ist möglicherweise sogar noch intelligenter und weiß, welche IP-Adresse zu welcher Verbindungsschichtadresse gehören sollte (Ursache) es kennt DHCP und inspiziert es)

Wenn 1 + 2 beide wahr sind, brauchen Sie tatsächlich so etwas wie IP NAT, DHCP, ..

Wenn jedoch nur 1) der Fall ist, können Sie die Link-Layer-Adresse fälschen und sie wie hier beschrieben umgekehrt in die andere Richtung abbilden:

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

5
Arnout

4addr, wie in anderen Antworten beschrieben, ist sicherlich der beste Weg, wenn es vom Adapter/Treiber unterstützt wird, aber nicht alle. NAT funktioniert möglicherweise für einige Dinge, aber eine ordnungsgemäße Kommunikation in beide Richtungen auf dem LAN wird problematisch (z. B. Anschließen eines Druckers oder Zugreifen auf andere IoT-Geräte auf der anderen Seite des NAT) On Broadcast/Multicast (z. B. Auto-Discovery, 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 Raspberry Pi für einen Drucker eingerichtet und es funktioniert wie ein Zauber (ich habe den Befehlen post-up Einen Ruhezustand von 10 Sekunden hinzugefügt, damit er zuerst eine IP-Adresse erhält, was möglicherweise erforderlich ist mit der Langsamkeit meines alten RPi ...)

Um Bridge Wifi Schnittstelle zu verwenden, können Sie das Tool iw verwenden, um 4addr zu aktivieren ebenfalls:

# 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 funktionieren. Sie können überprüfen mit:

# brctl show

Es funktioniert möglicherweise nicht, wenn iw selbst einen Fehler meldet, z. B. "Befehl fehlgeschlagen: Operation nicht unterstützt (-95)" (auf Raspbian angezeigt). Anscheinend implementieren nicht alle Treiber die Funktion.

4
amized

Bridge wlan und 4addr:

Die Überbrückung von wlan0 ist ein Schmerz. Normalerweise können Sie es nicht zu einer Bridge-Schnittstelle hinzufügen (brctl gibt "Operation nicht zulässig" zurück), und die Verwendung des "Bridged" -Filters von VirtualBox führt zu einem großen Durcheinander von ARP- und DHCP-Konflikten. Die Ursache dafür ist, dass 802.11-Frames standardmäßig nur drei Adressen enthalten: die MAC-Adressen beider drahtloser Geräte (Laptop und AP) und des endgültigen Empfä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 im WDS-Modus von Repeatern 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 überbrückten VirtualBox-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 Äther. Dies kann aus Sicherheitsgründen sein (weil es verdammt schwer ist, die Quell-MAC-Adresse zu fälschen. Ja.) In meinem Router (mit OpenRG) muss der "WDS" -Modus für die drahtlose AP-Schnittstelle aktiviert werden. Fügen Sie ein WDS-Gerät hinzu, das auf meine beschränkt ist 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 lehnt jetzt Pakete mit drei Adressen vom Laptop ab, 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 hat. Machen Sie zuerst die frühere Konfiguration rückgängig:

iw dev wlan0 set 4addr off

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

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 die "normale" Verwendung 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 zumindest auf demselben Kanal sein.

Einige Leute haben gefragt, warum dies verwendet werden soll, wenn VirtualBox WiFi "ganz gut" überbrücken kann. Die Antwort lautet, dass VirtualBox die MAC-Adressen der virtuellen Maschinen nicht sendet. Vielmehr führt es NAT auch auf der MAC-Ebene. - 22.08.2014) aus

Direkte WLAN-Brücke

Unter bestimmten 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 jeweils nur einen MAC überbrücken. Es hat nicht den Nachteil, von Zugriffspunkten gesperrt zu werden, da nur der ursprüngliche MAC des WLAN-Geräts verwendet wird. In Ihrem Fall würde dies bedeuten, dass wlan0 nur von einem VM und nicht einmal vom Host verwendet werden kann. Sie können wlan_kabel hier erhalten. Dies ähnelt dem macvlans Lösung.

Überbrückung mit ipvlan

IP Vlan hat nicht die Einschränkung einer Bridge, mit der ein Netzwerk überbrückt 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 erreichen. Wie bereits erwähnt, muss ip_forward aktiviert werden, damit Linux wie ein Router funktioniert. Dies muss sorgfältig eingerichtet werden, da dies zu Sicherheitsbedenken 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 des Einrichtens virtueller Schnittstellen (für die wir früher openvpn verwenden mussten) und des Erstellens von Bridges. Wenn Sie nicht wissen, wie Sie eine Brücke mit IP einrichten können, 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 Bridge mit dem Namen br0, versklaven dann eth0 und tap0 mit der Bridge, der wir eine IP-Adresse von 10.173.10.1 zuweisen, und rufen dann alles auf. Die drei separaten Instanzen zum Aufrufen der Schnittstellen (für tap0, eth0 und br0) sind erforderlich.

Der Trick, um dies zu erreichen, ist die Verwendung von proxy.arp, mit der Ihr PC (nicht Ihr VM/Linux-Container/Netzwerk-Namespace) stattdessen ARP-Anfragen beantworten kann.

Mit anderen Worten, wenn Sie die IPv4-Weiterleitung zwischen Ihrer Hardwareschnittstelle und Ihrer virtuellen Schnittstelle verwenden, denken Sie, Sie können Ihre VM/LXC/NNS mit Ihrem LAN verbinden, als wäre es eine physische Schnittstelle, aber das stimmt nicht: Sie vergessen das Absolute Grundlegender ARP-Verkehr, der es LAN wirklich ermöglicht, zu arbeiten. Das Problem ist also: Wenn ich IPv4-Verkehr korrekt weiterleiten kann, wie kann ich dann auch ARP-Verkehr weiterleiten, damit meine VM/LXC/NNS funktioniert? Der Trick besteht darin, Proxy-Arp zu verwenden.

Die vollständige Antwort darauf finden Sie in Bohdi Zazens Blog mit dem aufschlussreichen Titel: Bridge Wireless Cards. Er verwendet ein veraltetes Paket, uml-utilities, um eine virtuelle Schnittstelle mit dem Befehl tunctl zu erstellen: Dies ist der einzige Befehl, für den er uml-utilities verwendet, damit Sie das Herunterladen des Pakets sicher vernachlässigen und den Befehl I verwenden können Schreiben Sie oben, um eine Tap- oder Tun-Oberfläche zu erstellen, je nachdem, was Sie möchten. Ändern Sie einfach den Befehl entsprechend. Erstellen Sie dann ein veth-Paar für Ihren LXC und erstellen Sie jetzt eine Brücke zwischen tap0 und veth0. Diese Brücke, br0 genannt, ist das, wofür Sie Proxy-Arp anstelle der von Bohdi Zazen beschriebenen einfachen tap0-Schnittstelle verwenden müssen.


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

3
intika

Ich mochte den Proxy Arp Ansatz , aber die ursprüngliche Frage spezifizierte Arch Linux. Hier ist eine Arch Linux-Version von eine Raspbian-Implementierung . Ich habe mich sehr bemüht, den ursprünglichen Ansatz aus dem Debian-Wiki anzupassen erwähnt hier an netctl mit ExecUpPost und ExecDownPre ohne Erfolg. Alles funktionierte über die Befehlszeile, aber nicht innerhalb des Profils.

Die Schritte:

  1. Implementieren Sie drahtlose Netzwerke mit systemd-networkd . Setzen Sie in der .network-Datei IPForward=yes. Ich habe WPA Supplicant verwendet, um die drahtlose Netzwerkschnittstelle zu verwalten.
  2. Aktivieren Sie die mDNS-Weiterleitung, indem Sie enable-reflector=yes Innerhalb von /etc/avahi/avahi-daemon.conf Setzen. starte und aktiviere avahi-daemon.service, falls es noch nicht geschehen ist.
  3. Installieren Sie parprouted von der AUR und erstellen Sie eine Servicedatei dafür, indem Sie die aus der Raspbian-Antwort anpassen. Ich fand es nicht notwendig, die Schnittstelle promiskuitiv einzustellen. Natürlich muss dieser Dienst 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]
[email protected]
  1. Erstellen Sie einen dhcrelay-Dienst (aus dem DHCP-Paket), um DHCP für das an den Ethernet-Port angeschlossene Gerät zu unterstützen. Das Finden der Adresse des DHCP-Servers durch Durchsuchen von Protokollen scheint unelegant, funktioniert aber. 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 Raspberry Pi Modell B + mit ArchLinuxArm mit einem USB-WLAN-Adapter mit dem RT5370-Chipsatz. Da der Pi einem Drucker nur mit Ethernet WLAN zur Verfügung stellt, möchte ich, dass er robust gegenüber rauer Handhabung ist. Mein nächster Schritt besteht darin, die SD-Karte als schreibgeschützt zu konfigurieren .

0
eponymous