Compartilhando a conexão WiFi do Pi através da porta Ethernet

28

Eu tenho um pi executando a versão mais recente do raspbian e ele está conectado à Internet usando um dongle USB sem fio. O que eu gostaria de fazer é compartilhar a conexão wifi do pi para que qualquer computador conectado ao pi usando um cabo LAN possa receber a Internet. Eu dei uma olhada na Internet, mas não consigo encontrar nada de relevante. Estou familiarizado com esse processo no Windows e no Mac OS X, mas fazer isso no pi me deixou perplexo.

Edição: Não sei se isso ajuda alguém, mas estou conectado à Internet no meu pi via wlan0, mas gostaria de compartilhar essa conexão à Internet via eth0.

MasterScrat
fonte
Fazer uma ponte entre suas conexões WiFi e Ethernet no Pi e conectá-lo a um roteador seria mais simples. Isso é possível para o seu aplicativo?
tlhIngan
@tlhIngan, infelizmente, você vê que não tenho acesso a nenhum soquete Ethernet e preciso inicializar meu laptop a partir do PXE, o que deve ser feito pela Ethernet. Também quero aprender mais sobre o Linux e pensei que construir este projeto me daria um pouco mais de confiança com o Linux. Eu pensei que isso seria uma solução mais fácil, pois meu roteador está do outro lado da minha casa: / De qualquer forma, obrigado pela sua resposta.
Encontrei este vídeo tutorial exatamente o que você precisa: youtu.be/IAa4tI4JrgI O PI de framboesa compartilha a internet que fica do wifi à porta Ethernet.
Mia19
@tlhIngan - Você pode elaborar? Criar uma ponte também exigiria um roteador? Quero que meu receptor de áudio da rede compartilhe meu WiFi Pis via Ethernet e esteja na mesma sub-rede e DHCP do meu roteador principal.
square_eyes

Respostas:

40

Para Raspbian Jessie

Deste documento :

Usaremos o dnsmasqpacote para esse fim, pois ele é um servidor DHCP e DNS combinado e também fácil de configurar.

Se você quiser algo um pouco mais pesado, você pode usar os pacotes isc-dhcp-servere bind9para DHCP e DNS, respectivamente, mas, para nossos propósitos, dnsmasqfunciona muito bem.

sudo apt-get install dnsmasq

Precisamos configurar interfaces. Atribuiremos um endereço IP estático ao eth0qual será usado como gateway. Abra o arquivo de interfaces

sudo nano /etc/network/interfaces

Edite a eth0seção assim:

allow-hotplug eth0  
iface eth0 inet static  
    address 192.168.2.1
    netmask 255.255.255.0
    network 192.168.2.0
    broadcast 192.168.2.255

Em seguida, vamos configurar dnsmasq. O dnsmasqarquivo de configuração enviado contém muitas informações sobre como usá-lo. Então, eu aconselho a movê-lo e criar um novo.

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig  
sudo nano /etc/dnsmasq.conf

Cole o seguinte no novo arquivo

interface=eth0      # Use interface eth0  
listen-address=192.168.2.1 # listen on  
# Bind to the interface to make sure we aren't sending things 
# elsewhere  
bind-interfaces
server=8.8.8.8       # Forward DNS requests to Google DNS  
domain-needed        # Don't forward short names  
# Never forward addresses in the non-routed address spaces.
bogus-priv
# Assign IP addresses between 192.168.2.2 and 192.168.2.100 with a
# 12 hour lease time
dhcp-range=192.168.2.2,192.168.2.100,12h 

Edite o /etc/sysctl.confarquivo para ativar o encaminhamento de pacotes

sudo nano /etc/sysctl.conf

Remova o #início da linha que contém net.ipv4.ip_forward=1Isto permitirá o encaminhamento de pacotes na próxima reinicialização. Mas se você quiser experimentá-lo agora mesmo sem reiniciar, faça isso.

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

Também precisamos compartilhar a conexão de Internet da RPi com os dispositivos conectados por Wi-Fi. Vamos configurar um NAT entre eth0e wlan0:

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT  

No entanto, precisamos que essas regras sejam aplicadas toda vez que reiniciarmos o Pi, portanto, execute-o sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" para salvar as regras no arquivo /etc/iptables.ipv4.nat. Agora, precisamos executar isso após cada reinicialização; portanto, abra o /etc/rc.localarquivo com um sudo nano /etc/rc.localpouco acima da linha exit 0e adicione a seguinte linha:

iptables-restore < /etc/iptables.ipv4.nat  

E isso é tudo! Agora basta reiniciar o seu RPi e você poderá acessar a Internet

sudo reboot

Atualizado para o Raspbian Stretch

A configuração acima não funcionará na versão mais recente do Raspbian. Então, eu criei um script para isso que torna possível com menos sofrimento.

Conecte-se à rede WiFi usando este guia.

Faça o download do script aqui . Coloque-o em/home/pi/

Abrir /home/pi/.config/lxsession/LXDE-pi/autostartarquivo

nano /home/pi/.config/lxsession/LXDE-pi/autostart

Adicione a última linha:

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@point-rpi
sudo bash /home/pi/wifi-to-eth-route.sh

Verifique se você forneceu o caminho completo para o arquivo. E você terminou. Agora reinicie para ver as alterações

sudo reboot
Arpit Agarwal
fonte
1
Muito obrigado. Acabei de testar isso no meu pi e a conexão estava boa! Mais uma vez, obrigado pelo seu tempo. Eu agradeço.
1
Isso é excelente para compartilhar a conexão à Internet com um dispositivo sem fio. No entanto, quero acessar o dispositivo de outro laptop na minha rede e isso não funciona. Eu acho que é porque eles estão em sub-redes diferentes? Alguma dica para contornar isso?
Björn Andersson
1
Ele funcionou perfeitamente, embora sob Raspbian Stretch, eu tive que incluir manualmente a configuração de Wi-Fi no / etc / network / interfaces
xfx
1
@xfx, você poderia mostrar o código adicionado para a configuração do WiFi?
karl71
1
Eu segui sua postagem e o link com cuidado. My Pi (apenas tinha uma nova instalação OS), sempre que eu adicionar a palavra "estática", não é mesmo capaz de se conectar à wi-fi ...
karl71
6

Sendo seu objetivo fornecer acesso à Internet aos seus dispositivos LAN, assumirá que o 'NAT' duplo não será um grande problema.
Com essa configuração, você fornecerá acesso sem fio a dispositivos não Wi-Fi que se beneficiarão do acesso à Internet.
desenhando

Pré-requisito

Verifique se o seu Wi-Fi está configurado e funcionando corretamente. se algo der errado, seu acesso ao dispositivo eth0será limitado ou inexistente.

Configuração

Precisamos de alguns pacotes para começar:

apt-get update
apt-get install network-manager isc-dhcp-server

Interfaces

Se você editar o arquivo /etc/network/interfacespara corresponder ao seguinte, isso definirá seu eth0 como um endereço IP fixo (10.10.10.1) e será recriado resolv.conf.

auto lo
iface lo inet loopback

iface default inet dhcp

allow-hotplug eth0
iface eth0 inet static
  address 10.10.10.1
  network 10.10.10.0
  netmask 255.255.255.0
  broadcast 10.10.10.255
  gateway 10.10.10.1

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
  up cat /etc/resolv.conf | sed 's/ver /ver 127.0.0.1,/g' > /etc/resolv_local.conf
  up cat /etc/resolv.conf | sed 's/ver /ver 127.0.0.1,/g' > /etc/resolv.conf

DHCP

Modifique a dhcpconfiguração padrão para torná-la autoritativa e adicione a rede LAN (10.10.10. *), Edite o arquivo /etc/dhcp/dhcpd.confe adicione o seguinte conteúdo:

# configuration for the bridge internal subnet.
subnet 10.10.10.0 netmask 255.255.255.0 {
  range 10.10.10.101 10.10.10.119;
  option domain-name-servers 8.8.8.8;
  option domain-name "domain.local";
  option routers 10.10.1.1;
  default-lease-time 600;
  max-lease-time 7200;
}

IPTABLES

Agora crie o script a seguir para configurar e iniciar a rede a cada reinicialização. O script criará dinamicamente algumas regras 'IPTABLES'. Nomeie-o /root/bridge.sh:

#!/bin/bash
LOCAL_IFACE=eth0
INET_IFACE=wlan0

# this is where the dhcp info comes in. We need the default gateway
# /var/lib/dhcp/dhclient.wlan0.leases
f=/var/lib/dhcp/dhclient.$INET_IFACE.leases
GATEWAY=$(cat $f| grep "option route" | tail -1 |awk '{print $3}'| sed 's/;//')

IPT=$(which iptables)
# get the wlan address
INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$

# Flush the tables
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -t nat -F

$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT

# Allow forwarding packets:
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# Packet masquerading
$IPT -t nat -A POSTROUTING -o $INET_IFACE  -j SNAT --to-source $INET_ADDRESS
$IPT -t nat -A POSTROUTING -o $LOCAL_IFACE -j MASQUERADE

# save the created tables 
iptables-save > /etc/network/iptables

#cat /proc/sys/net/ipv4/ip_forward
# make sure we are forwarding packets
echo "1" > /proc/sys/net/ipv4/ip_forward
sysctl --system > /dev/nul

#remove the default route, usually on eth0 interface
route del default
#ifdown $INET_IFACE  && ifup $INET_IFACE
#ensure is $INET_IFACE now...
route add default gw $GATEWAY $INET_IFACE
gw=$(route -n -A inet | grep '^0.0.0.0' |awk '{ print $2 }')
echo "default route is now " $gw

Finalmente

Finalmente, você precisa executar o script em cada reinicialização, adicione as duas linhas a seguir antes exit 0do arquivo `/etc/rc.local 'para executar o script criado anteriormente.

# will run the bridge on startup
sudo ./root/bridge.sh

Agora, basta reiniciar o dispositivo e a ponte estará funcionando para você.

pd: sudofoi omitido por questões de brevidade. Use sudo -iEpara ter uma sessão comoroot

fcm
fonte
Uau! Muito obrigado por uma resposta tão detalhada! Eu nunca percebi que seria tão complicado, mas acho que posso lidar com isso. Mais uma vez obrigado, vou testá-lo em algumas horas e, se funcionar, vou marcar você como a resposta. Muito obrigado
@GrowlingSolid Não deve ser tão complicado. A resposta que você usa network-managerpara gerenciar redes incompatíveis dhcpcdé o padrão para o Raspbian. Não há nada errado em usar um gerente alternativo, mas você deve desativar dhcpcd(a resposta faz isso indiretamente, pois dhcpfará com dhcpcdque pare). Também impedirá que o suporte a WiFi na GUI funcione.
Milliways
1
Eu me informei e cheguei a esta linha correta em vez da sua: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')Sua versão "falsa" era:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R