Collegare wlan0 a eth0


25

Su Arch Linux, vorrei che eth0 (connesso a router con bridge) condividesse la connessione ricevuta da wlan0, ho letto tutorial ma non sono esperto di comando come lo sono gli altri utenti e non capiscono del tutto.


8
per favore non inserire "[risolto]" nella domanda o nel titolo, accettare una risposta è il modo corretto di dimostrare che un problema è stato risolto. Cambia il modo in cui la domanda viene visualizzata nell'elenco principale e mette il segno di spunta verde sulla risposta che hai contrassegnato come corretta.
Zypher,

1
Lo apprezzerei se nessuno rovinasse questa pagina. In caso di problemi, contattami. Grazie.
dbdii407,

13
serverfault.com/faq In particolare l'intestazione "Altre persone possono modificare le mie cose"
Zypher

@Zypher L'URL a cui ti colleghi non esiste più. Il paragrafo pertinente si è spostato altrove?
Kasperd,

Risposte:


24

AGGIORNARE

Non è possibile eseguire il bridge tra le interfacce wireless (client aka station) e cablate secondo questo thread su linux-ath5k-devel .

Setup NAT

Si dovrebbe invece impostare NAT:

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

Assegnare un IP

Quindi devi assegnare gli indirizzi IP a te stesso:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

Installa il demone dhcp

Installa un server dhcp e aggiungi il testo seguente al suo file di configurazione (in /etc/dhcpd.conf o qualcosa di simile)

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

Inizia dhcpd

Quindi avviarlo /etc/init.d/dhcpd start

E questo è tutto!

Leggi di seguito solo se sei interessato alla configurazione del bridge non funzionante


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

Per prima cosa crei un'interfaccia bridge, scelgo un nome arbitrario mybridge, quindi aggiungi delle interfacce.

È necessario richiedere un nuovo indirizzo IP (è necessario solo se si desidera ottenere un IP valido per il dispositivo di bridging stesso):

dhclient -d mybridge

3
In realtà non è necessario un indirizzo IP per l'interfaccia bridge affinché il bridge funzioni.
Massimo,

7
impossibile aggiungere wlan0 a bridge mybridge: operazione non supportata
dbdii407

1
@Massimo: sì, è vero. L'IP valido è necessario per accedere alla rete dal "dispositivo ponte".
cstamas,

10
NAT è qualcosa di completamente diverso dal ponte. Il bridging è di livello due, NAT è di livello tre e specifico di IPv4. Non capisco perché questa sia una risposta accettata.
WhyNotHugo,

3
@Hugo IP NAT è il livello 3, ma MAC NAT è il livello 2. Per il bridge WiFi, puoi usare 4addr, WDS, MAC NAT oppure puoi fare qualcosa al livello 3 (come IP NAT).
David Schwartz,

27

Per collegare l' interfaccia wifi è possibile utilizzare lo iwstrumento per abilitare anche 4addr :

# iw dev <wifiInterface> set 4addr on

vale a dire:

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

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

Ora dovrebbe funzionare. Puoi mostrare i ponti usando:

# brctl show

2
A che cosa serve questa impostazione e perché suggerisce specificamente di usarla in questo scenario?
Hakre,

Questa è una soluzione per l'errore "Operazione non consentita" quando si tenta di aggiungere l'interfaccia wlan0 all'interfaccia bridge. Dopodiché devi specificare l'interfaccia bridge in / etc / network / interfaces per essere visualizzata dopo l'avvio.
Str82DHeaD

1
@hakre La 4addrmodalità fa in modo che il WiFi si comporti abbastanza come Ethernet cablata per far funzionare il bridging. Senza di essa, il bridge non funzionerà senza NAT.
David Schwartz,

1
4addrrichiede che entrambi i lati di un collegamento wireless lo supportino (presumendo che tu stia cercando di implementare un extender wifi)
nhed

5

Dipende da quanto è medio l'AP per te:

1) Potrebbe solo voler vedere i pacchetti che provengono da te, con il tuo indirizzo di livello link noto (e quindi non di pacchetti con ponte) 2) Potrebbe effettivamente essere ancora più intelligente e sapere quale indirizzo IP dovrebbe appartenere a quale indirizzo di livello link (causa conosce DHCP e lo controlla)

Se 1 + 2 sono entrambi veri, hai davvero bisogno di qualcosa come IP NAT, DHCP, ..

Ma se solo 1) è il caso, puoi falsificare l'indirizzo del livello di collegamento e invertirlo su quello giusto nell'altra direzione come descritto qui:

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


Questo è davvero disordinato. E richiede una configurazione aggiuntiva ogni volta che aggiungi un nuovo computer.
Michael Hampton

4

4addr come descritto in altre risposte è sicuramente il modo migliore quando supportato dall'adattatore / driver, ma non tutti lo fanno. NAT potrebbe funzionare per alcune cose, ma ottenere una comunicazione corretta in entrambi i modi sulla lan diventerà problematico (es. Collegare una stampante o accedere ad altri dispositivi IoT dall'altra parte del NAT). Tutto ciò che si basa sulla trasmissione / multicast (es. Rilevamento automatico, bonjour) fallirà attraverso il NAT.

L'alternativa consiste nell'utilizzare un proxy ARP (programmato) come descritto in https://wiki.debian.org/BridgeNetworkConnectionsProxyArp . Ho impostato questo su un Raspberry Pi per una stampante e funziona come un incantesimo (ho aggiunto una sospensione di 10 secondi nei post-upcomandi per consentirgli di ottenere prima un indirizzo IP, potrebbe avere a che fare con la lentezza del mio vecchio RPI ...)


questo link alla soluzione proxy-arp plus dhcp-helper è la soluzione più compatibile e più pulita che abbia mai visto.
minghua,

3

Bridge wlan e 4addr:

Colmare il wlan0 è un dolore. Normalmente non è possibile aggiungerlo a un'interfaccia bridge (brctl restituisce "Operazione non consentita") e l'utilizzo del filtro "bridged" di VirtualBox provoca un grande casino di conflitti ARP e DHCP. La causa di ciò è che i frame 802.11 contengono solo tre indirizzi per impostazione predefinita: gli indirizzi MAC di entrambi i dispositivi wireless (laptop e AP) e del destinatario finale (come in Ethernet). Si presume sempre che esista un solo originatore.

L'802.11 può contenere il quarto indirizzo MAC dell'originatore e questo viene utilizzato in modalità WDS dai ripetitori. Questa funzione può essere abilitata anche su Linux, usando iw, e abilitando questa modalità sarà possibile utilizzare wlan0 nelle interfacce bridge, nonché con le reti con bridge VirtualBox:

iw dev wlan0 set 4addr on

Tuttavia, con 4addr abilitato, è probabile che tu venga completamente ignorato dall'AP: l'associazione ha esito positivo ma tutti i frame di dati scompaiono nell'etere. Questo potrebbe essere per motivi di sicurezza (perché è dannatamente difficile falsificare l'indirizzo MAC di origine. Sì.) Nel mio router (con OpenRG), è necessario abilitare la modalità "WDS" per l'interfaccia AP wireless, aggiungere un dispositivo WDS limitato al mio indirizzo MAC del laptop e aggiungerlo al bridge LAN. I pacchetti di 4addr ora funzionano.

C'è un altro problema con questo, però: il router ora rifiuta i pacchetti a tre indirizzi dal laptop, il che può essere piuttosto scomodo (dover attivare 4addr ogni volta che viene cambiata la rete WLAN). La soluzione alternativa è aggiungere, sul laptop, una seconda interfaccia wireless collegata allo stesso dispositivo, ma con un indirizzo MAC diverso. Prima annulla la configurazione precedente:

iw dev wlan0 set 4addr off

Quindi, aggiungi una seconda interfaccia - il nome è stato scelto arbitrariamente - con un diverso indirizzo 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

Qui deve corrispondere l'indirizzo del dispositivo WDS configurato nel router; a parte questo, può essere qualsiasi indirizzo MAC valido. Il MAC originale di wlan0 rimane quindi per un utilizzo "normale".

È possibile utilizzare contemporaneamente wlan0 e wds.wlan0, anche se ho provato ad associarmi allo stesso AP due volte, non a AP diversi. Immagino che avrebbero dovuto essere almeno sullo stesso canale.

Alcune persone hanno chiesto perché usarlo quando VirtualBox è in grado di collegare il WiFi "bene". La risposta è che VirtualBox non invia gli indirizzi MAC delle macchine virtuali; piuttosto, esegue NAT anche a livello MAC. - 22-08-2014

Ponte wlan diretto

In determinate circostanze, è anche possibile utilizzare wlan_kabel. Utilizza socket di pacchetti per collegare direttamente i dispositivi wlan * con dispositivi Ethernet. Tuttavia, è possibile collegare un solo MAC alla volta con wlan_kabel. Non ha lo svantaggio di essere bloccato dai punti di accesso, perché viene utilizzato solo il MAC originale del dispositivo wlan. Nel tuo caso ciò significherebbe che wlan0 poteva essere utilizzato solo da una VM e nemmeno dall'host. Puoi ottenere wlan_kabel qui . Questo è simile alla soluzione macvlans .

Colmare con ipvlan

IP Vlan non ha la limitazione di un bridge che potrebbe essere utilizzato per collegare i dettagli di una rete su come usarlo può essere trovato qui

Alternativa al travestimento

Il routing Linux può essere usato invece con iptables-masquerade e ip_forward per ottenere un bridge ma, come detto, ciò richiede abilitare ip_forward e farà funzionare Linux come un router, questo deve essere configurato con attenzione perché potrebbe introdurre problemi di sicurezza.

# 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

L'interfaccia br0 avrà quindi accesso alla rete wlan0

Importante e correlato

Inoltre, e molto importante, non dovresti usare comandi obsoleti e deprecati come ifconfig, brctl e così via. La suite iproute2 contiene comandi per tutto ciò, inclusa la configurazione di interfacce virtuali (qualcosa per cui una volta dovevamo usare openvpn) e la creazione di bridge. Se non sai come configurare un bridge con ip, eccoci qui

  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

Con questo set di comandi, creiamo un'interfaccia virtuale chiamata tap0, quindi un bridge chiamato br0, quindi enslave eth0 e tap0 al bridge, al quale assegniamo un indirizzo IP 10.173.10.1, quindi portiamo tutto su. Sono necessarie le tre istanze separate di attivazione delle interfacce (per tap0, eth0 e br0).

Il trucco per farlo funzionare è usare proxy.arp, che consente al tuo PC (non al tuo spazio dei nomi di container / rete VM / Linux) di rispondere alle query ARP in loro vece.

In altre parole, utilizzando l'inoltro IPv4 tra l'interfaccia hardware e l'interfaccia virtuale, pensi di poter connettere la tua VM / LXC / NNS alla tua LAN come se fosse un'interfaccia fisica, ma questo non è vero: stai dimenticando assolutamente traffico ARP fondamentale, che è ciò che consente veramente alla LAN di operare. Quindi, il problema è: se inoltro correttamente il traffico IPv4, come posso inoltrare anche il traffico ARP, in modo che la mia VM / LXC / NNS funzioni? Il trucco è usare proxy-arp.

La risposta completa a ciò è nel Blog di Bohdi Zazen , con il titolo rivelatore: Bridge Wireless Cards. Usa un pacchetto obsoleto, uml-utilities, per creare un'interfaccia virtuale tramite il comando tunctl: questo è l'unico comando per il quale usa uml-utilities, in modo da poter trascurare tranquillamente il download del pacchetto e usare il comando I scritto sopra per creare un'interfaccia tap o tun, come preferisci, modifica il comando di conseguenza. quindi crea una coppia veth per il tuo LXC e ora crea un ponte tra tap0 e veth0. Questo bridge, chiamato br0, è ciò per cui è necessario proxy-arp, invece della semplice interfaccia tap0 descritta da Bohdi Zazen.


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


0

Mi è piaciuto l' approccio Proxy Arp , ma la domanda originale specificava Arch Linux. Ecco una versione Arch Linux di un'implementazione di Raspbian . Ho provato molto ad adattare l'approccio originale del Wiki Debian menzionato qui a netctl usando ExecUpPoste ExecDownPresenza successo. Tutto ha funzionato dalla riga di comando, ma non all'interno del profilo.

I passi:

  1. Implementa la rete wireless con systemd-networkd . Nel file .network, impostare IPForward=yes. Ho usato il supplicant WPA per gestire l'interfaccia di rete wireless.
  2. Abilita l'inoltro mDNS impostando enable-reflector=yesall'interno /etc/avahi/avahi-daemon.conf; avviare e abilitare avahi-daemon.servicese non lo è già.
  3. Installa parProuted dall'AUR e crea un file di servizio per esso adattando quello dalla risposta Raspbian . Non ho trovato che fosse necessario impostare l'interfaccia in modo che fosse promiscua. Naturalmente, questo servizio dovrà essere avviato e abilitato.
[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]
WantedBy=wpa_supplicant@wlan0.service
  1. Per supportare DHCP per il dispositivo collegato alla porta Ethernet, creare un servizio dhcrelay (dal pacchetto DHCP). Trovare l'indirizzo del server DHCP tramite grep'ing attraverso i log sembra inelegante, ma funziona. Avvia e abilita.
[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

Questo approccio ha funzionato per me su un modello Raspberry Pi modello B + con ArchLinuxArm con un adattatore WiFi USB con chipset RT5370. Poiché il Pi fornirà WiFi a una stampante con solo Ethernet, mi piacerebbe che fosse robusto per la gestione approssimativa, quindi il mio prossimo passo sarà configurare la scheda SD in sola lettura .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.