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.
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.
Risposte:
AGGIORNARE
Non è possibile eseguire il bridge tra le interfacce wireless (client aka station) e cablate secondo questo thread su linux-ath5k-devel .
Si dovrebbe invece impostare NAT:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Quindi devi assegnare gli indirizzi IP a te stesso:
ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up
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;
}
Quindi avviarlo /etc/init.d/dhcpd start
E questo è tutto!
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
Per collegare l' interfaccia wifi è possibile utilizzare lo iw
strumento 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
4addr
modalità 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.
4addr
richiede che entrambi i lati di un collegamento wireless lo supportino (presumendo che tu stia cercando di implementare un extender wifi)
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
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-up
comandi per consentirgli di ottenere prima un indirizzo IP, potrebbe avere a che fare con la lentezza del mio vecchio RPI ...)
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
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 ExecUpPost
e ExecDownPre
senza successo. Tutto ha funzionato dalla riga di comando, ma non all'interno del profilo.
I passi:
IPForward=yes
. Ho usato il supplicant WPA per gestire l'interfaccia di rete wireless.enable-reflector=yes
all'interno /etc/avahi/avahi-daemon.conf
; avviare e abilitare avahi-daemon.service
se non lo è già.[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
[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 .