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.
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.
Antworten:
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 .
Man sollte stattdessen NAT einrichten:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Dann müssen Sie sich IP-Adressen zuweisen:
ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up
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;
}
Dann starte es /etc/init.d/dhcpd start
Und das ist es!
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
Zur Überbrückung der WLAN- Schnittstelle können Sie das iw
Tool 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
4addr
Modus verhält sich WiFi so stark wie kabelgebundenes Ethernet, dass Bridging funktioniert. Ohne das funktioniert Bridging nicht ohne NAT.
4addr
erfordert, dass beide Seiten einer drahtlosen Verbindung dies unterstützen (vorausgesetzt, Sie versuchen, einen WLAN-Extender zu implementieren)
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
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-up
Befehlen 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 ...)
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
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.ExecUpPost
ExecDownPre
Die Schritte:
IPForward=yes
. Ich habe WPA Supplicant verwendet , um die drahtlose Netzwerkschnittstelle zu verwalten.enable-reflector=yes
innerhalb von festlegen /etc/avahi/avahi-daemon.conf
. starten und aktivieren, avahi-daemon.service
falls noch nicht geschehen.[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
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 .