Construindo uma ponte entre wlan0 e eth0


25

No Arch Linux, eu gostaria que o eth0 (conectado ao roteador em ponte) compartilhasse a conexão recebida do wlan0, li os tutoriais, mas não sou experiente em comandos como outros usuários e não entendo completamente.


8
por favor, não coloque '[resolvido]' na pergunta ou no título; aceitar uma resposta é a maneira correta de mostrar que um problema foi resolvido. Ele altera a maneira como a pergunta é exibida na listagem principal e coloca a marca de seleção verde na resposta que você marcou como correta.
Zypher 25/09/10

11
Eu apreciaria se ninguém mexesse com esta página. Se você tiver algum problema, entre em contato comigo. Obrigado.
dbdii407

13
serverfault.com/faq Especificamente o cabeçalho "Outras pessoas podem editar minhas coisas"
Zypher 25/09/10

@Zypher O URL ao qual você vincula não existe mais. O parágrafo relevante foi movido para outro lugar?
kasperd

Respostas:


24

ATUALIZAR

Não é possível fazer a ponte entre as interfaces sem fio (modo de estação cliente) e com fio de acordo com esta discussão no linux-ath5k-devel .

NAT de configuração

Deve-se configurar o NAT:

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

Atribuindo um IP

Então você deve atribuir endereços IP a si mesmo:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

Instale o daemon dhcp

Instale um servidor dhcp e adicione o seguinte texto ao seu arquivo de configuração (em /etc/dhcpd.conf ou algo semelhante)

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

Iniciar dhcpd

Em seguida, inicie-o /etc/init.d/dhcpd start

E é isso!

Leia apenas abaixo se você estiver interessado na configuração de ponte que não funciona


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

Primeiro você cria uma interface de ponte. Eu escolho um nome arbitrário mybridge e depois adiciono interfaces a ele.

Você deve solicitar um novo endereço IP (Isso é necessário apenas se você deseja obter um IP válido para o próprio dispositivo de ponte):

dhclient -d mybridge

3
Na verdade, você não precisa de um endereço IP para a interface de ponte para que a ponte funcione.
Massimo

7
Não é possível adicionar wlan0 para mybridge ponte: Operação não suportada
dbdii407

11
@ Massimo: sim, isso é verdade. O IP válido é necessário para acessar a rede a partir do "dispositivo de ponte".
Cstamas

10
NAT é algo completamente diferente de ponte. A ponte é a camada dois, o NAT é a camada três e é específico para IPv4. Não entendo por que essa é uma resposta aceita.
WhyNotHugo

3
O @Hugo IP NAT é a camada 3, mas o MAC NAT é a camada 2. Para a ponte WiFi, você pode usar 4addr, WDS, MAC NAT ou pode fazer algo na camada 3 (como IP NAT).
David Schwartz

27

Para conectar a interface wifi , você pode usar a iwferramenta para ativar o 4addr da mesma forma:

# iw dev <wifiInterface> set 4addr on

ou seja:

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

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

Agora deve funcionar. Você pode mostrar pontes usando:

# brctl show

2
Para que serve essa configuração e por que você sugere especificamente usá-la nesse cenário?
hakre

Esta é uma solução para o erro "Operação não permitida" ao tentar adicionar a interface wlan0 à interface da ponte. Depois disso, você deve especificar a interface da ponte em / etc / network / interfaces para ser exibida após a inicialização.
Str82DHeaD

11
@hakre O 4addrmodo faz com que o WiFi se comporte o suficiente como Ethernet com fio para que a ponte funcione. Sem ele, a ponte não funcionará sem o NAT.
David Schwartz

11
4addrexige que ambos os lados de um suporte ligação sem fios que (presumindo que você está tentando implementar um extensor de Wi-Fi)
nhed

5

Depende de quão mau o AP é para você:

1) Talvez você queira apenas ver pacotes vindo de você, com o endereço da camada de link conhecido (e, portanto, não com pacotes em ponte) 2) Pode ser ainda mais inteligente e saber qual endereço IP deve pertencer a qual endereço da camada de link (causa conhece o DHCP e o inspeciona)

Se 1 + 2 são verdadeiros, você realmente precisa de algo como IP NAT, DHCP, ..

Mas se apenas 1) for o caso, você pode falsificar o endereço da camada de link e mapeá-lo no sentido correto na outra direção, conforme descrito aqui:

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


Isso é realmente confuso. E isso requer configuração extra toda vez que você adiciona um novo computador.
Michael Hampton

4

O 4addr, conforme descrito em outras respostas, é certamente a melhor maneira quando suportado pelo adaptador / driver, mas nem todos. O NAT pode funcionar para algumas coisas, mas obter uma comunicação adequada nos dois sentidos na LAN se tornará problemático (por exemplo, conectar uma impressora ou acessar outros dispositivos de IoT no outro lado do NAT). Qualquer coisa que dependa de broadcast / multicast (por exemplo, descoberta automática, bonjour) falhará no NAT.

A alternativa é usar um ARP Proxy (parprouted), conforme descrito em https://wiki.debian.org/BridgeNetworkConnectionsProxyArp . Configurei isso em um Raspberry Pi para uma impressora e funciona como um encanto (adicionei um sono de 10 segundos nos post-upcomandos para permitir que ele obtenha um endereço IP primeiro, isso pode ter a ver com a lentidão do meu antigo RPi ...)


esse link para a solução proxy-arp plus dhcp-helper é a solução mais compatível e limpa até agora que eu já vi.
minghua

3

Bridge wlan e 4addr:

Construir uma ponte sobre wlan0 é uma dor. Você normalmente não pode adicioná-lo a uma interface de ponte (brctl retorna "Operação não permitida") e o uso do filtro "bridged" do VirtualBox resulta em uma grande confusão de conflitos de ARP e DHCP. A causa disso é que os quadros 802.11 contêm apenas três endereços por padrão: os endereços MAC dos dispositivos sem fio (laptop e AP) e do destinatário final (como na Ethernet). Supõe-se sempre que existe apenas um originador possível.

O 802.11 pode levar o quarto endereço MAC do originador, e isso é usado no modo WDS pelos repetidores. Esse recurso também pode ser ativado no Linux, usando o iw, e a ativação desse modo permitirá que o wlan0 seja usado em interfaces de ponte, assim como na rede em ponte do VirtualBox:

iw dev wlan0 set 4addr on

No entanto, com o 4addr ativado, é provável que você seja completamente ignorado pelo AP: a associação é bem-sucedida, mas todos os quadros de dados desaparecem no éter. Isso pode ser por motivos de segurança (porque é muito difícil falsificar o endereço MAC de origem. Sim.) No meu roteador (executando o OpenRG), é necessário ativar o modo "WDS" para a interface do AP sem fio, adicione um dispositivo WDS restrito ao meu endereço MAC do laptop e adicione-o à ponte da LAN. Pacotes 4addr agora funcionam.

No entanto, há outro problema: o roteador agora rejeita pacotes de três endereços do laptop, o que pode ser bastante inconveniente (é necessário alternar 4addr toda vez que a rede WLAN é alterada). A solução alternativa é adicionar, no laptop, uma segunda interface sem fio vinculada ao mesmo dispositivo, mas com um endereço MAC diferente. Primeiro desfaça a configuração anterior:

iw dev wlan0 set 4addr off

Em seguida, adicione uma segunda interface - o nome foi escolhido arbitrariamente - com um endereço MAC diferente:

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

Aqui deve corresponder ao endereço do dispositivo WDS configurado no roteador; além disso, pode ser qualquer endereço MAC válido. O MAC original do wlan0 permanece para uso "normal".

É possível usar o wlan0 e o wds.wlan0 ao mesmo tempo - embora eu só tenha testado associar ao mesmo ponto de acesso duas vezes, não a pontos de acesso diferentes. Suponho que eles precisem estar no mesmo canal.

Algumas pessoas perguntaram por que usar isso quando o VirtualBox pode conectar o WiFi "muito bem". A resposta é que o VirtualBox não envia os endereços MAC das máquinas virtuais; em vez disso, ele executa NAT na camada MAC também. - 2014-08-22

Ponte wlan direta

Sob certas circunstâncias, você também pode usar o wlan_kabel. Ele usa soquetes de pacotes para conectar diretamente dispositivos wlan * com dispositivos ethernet. No entanto, você só pode conectar um único MAC de cada vez com wlan_kabel. Ele não tem a desvantagem de ser barrado pelos pontos de acesso, porque apenas o MAC original do dispositivo wlan é usado. No seu caso, isso significaria que o wlan0 só poderia ser usado por uma VM e nem pelo host. Você pode obter wlan_kabel aqui . Isso é semelhante à solução macvlans .

Bridging com ipvlan

O IP Vlan não tem a limitação de uma ponte que poderia ser usado para colmatar uma detalhes da rede sobre como usá-lo pode ser encontrada aqui

Alternativa de máscaras

O roteamento Linux pode ser usado com o iptables-masquerade e o ip_forward para obter uma ponte, mas como mencionado, isso requer habilitar o ip_forward e fará com que o linux aja como um roteador.

# 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

A interface br0 terá acesso à rede wlan0

Importante e relacionado

Além disso, e muito importante, você não deve usar comandos obsoletos e obsoletos, como ifconfig, brctl etc. A suíte iproute2 contém comandos para tudo isso, incluindo a configuração de interfaces virtuais (algo para o qual tivemos que usar o openvpn) e a criação de pontes. Se você não sabe configurar uma bridge com ip, aqui vamos nós

  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

Com esse conjunto de comandos, criamos uma interface virtual chamada tap0, depois uma ponte chamada br0, depois escravizamos eth0 e tap0 na ponte, à qual atribuímos um endereço IP 10.173.10.1 e, em seguida, apresentamos tudo. As três instâncias separadas de ativação das interfaces (para tap0, eth0 e br0) são necessárias.

O truque para fazer isso funcionar é usar o proxy.arp, que permite ao seu PC (e não ao seu espaço de nomes de rede / contêiner VM / Linux) responder às consultas ARP em seu lugar.

Em outras palavras, usando o encaminhamento IPv4 entre sua interface de hardware e sua interface virtual, você acha que pode conectar sua VM / LXC / NNS à sua LAN como se fosse uma interface física, mas isso não é verdade: você está esquecendo absolutamente tráfego ARP fundamental, que é o que realmente permite à LAN operar. Portanto, o problema é: se eu encaminhar corretamente o tráfego IPv4, como também posso encaminhar o tráfego ARP, para que minha VM / LXC / NNS funcione? O truque é usar o proxy-arp.

A resposta completa está no Blog de Bohdi Zazen , com o título revelador: Bridge wireless cards. Ele usa um pacote obsoleto, uml-utilities, para criar uma interface virtual por meio do comando tunctl: este é o único comando para o qual ele usa uml-utilities, para que você possa negligenciar com segurança o download do pacote e usar o comando I escrevi acima para criar uma interface de toque ou tun, como você preferir, apenas modifique o comando de acordo. crie um par veth para o seu LXC e agora crie uma ponte entre tap0 e veth0. Essa ponte, chamada br0, é para isso que você deve usar o proxy-arp, em vez da interface simples tap0 descrita por Bohdi Zazen.


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


0

Gostei da abordagem Proxy Arp , mas a pergunta original especificou o Arch Linux. Aqui está uma versão do Arch Linux de uma implementação Raspbian . Eu tentei muito adaptar a abordagem original do Debian Wiki mencionada aqui para netctl usando ExecUpPoste ExecDownPresem sucesso. Tudo funcionou na linha de comando, mas não dentro do perfil.

Os passos:

  1. Implemente rede sem fio com systemd-networkd . No arquivo .network, defina IPForward=yes. Usei o WPA Supplicant para gerenciar a interface de rede sem fio.
  2. Ative a retransmissão de mDNS definindo enable-reflector=yesdentro /etc/avahi/avahi-daemon.conf; inicie e ative avahi-daemon.servicese ainda não estiver.
  3. Instale o parprouted do AUR e crie um arquivo de serviço adaptando o da resposta Raspbian . Não achei necessário definir a interface como promíscua. Naturalmente, esse serviço precisará ser iniciado e ativado.
[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. Para oferecer suporte ao DHCP para o dispositivo conectado à porta Ethernet, crie um serviço dhcrelay (do pacote DHCP). Encontrar o endereço do servidor DHCP grep'ing através de logs parece deselegante, mas funciona. Inicie e ative.
[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

Essa abordagem funcionou para mim em um Raspberry Pi Modelo B + com ArchLinuxArm que ostenta um adaptador USB WiFi com o chipset RT5370. Como o Pi fornecerá Wi-Fi a uma impressora com apenas Ethernet, eu gostaria que fosse robusto para um manuseio grosseiro, então meu próximo passo será configurar o cartão SD como somente leitura .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.