2016-07-13

Raspberry pi como adaptador de wifi a ethernet

O "cómo configurar una raspberry pi para que se conecte a una red wifi (empresarial, en mi caso) a la que redirija el tráfico de su puerto ethernet"

El artículo que lo explica todo es este: WiFi to ethernet adapter for an ethernet-ready TV, yo estoy en una situación similar aunque no lo hice todo exactamente igual.

primero: configurar el fichero /etc/network/interfaces para que la interface eth0 (el puerto ethernet) tenga una ip fija, que será la que nos sirva para crear una mini-red interna con los dispositivos que queramos. En mi caso quedó así:
allow-hotplug eth0
iface eth0 inet static
  address 192.168.2.1
  network 192.168.2.0
  netmask 255.255.255.0
  broadcast 192.168.2.255
  gateway 192.168.2.1

[update 2017-08-24] en las nuevas versiones de raspbian para especificar una ip fija ya no se modifica el fichero /etc/network/interfaces sino que se modifica el fichero /etc/dhcpcd.conf
interface eth0
static ip_address=192.168.2.1/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1

También hay que deshabilitar los "Predictable Network Interface Names" metiendo net.ifnames=0 en el el /boot/cmdline.txt

Como todo es tan diferente, finalmente optamos por deshabilitar todo este sistema nuevo haciendo
sudo systemctl disable dhcpcd
sudo systemctl enable networking

segundo: conectarse a la wifi. En mi caso es una wifi empresarial, así que hay que configurar el fichero /etc/wpa_supplicant/wpa_supplicant.conf de forma similar a esto:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=ES
eapol_version=1
ap_scan=1
fast_reauth=1
network={
 ssid="unaRRedCualquieRa"
 scan_ssid=1
 key_mgmt=WPA-EAP
 proto=WPA
 eap=TTLS
 pairwise=CCMP
 identity="usuario"
 password="password"
 priority=1
 phase2="auth=PAP"
}

tercero: reiniciar (o usar ifdown e ifup en cada interface) y comprobar que las dos redes están correctamente conectadas usando, por ejemplo, el comando ifconfig. Yo aquí lo que hago es conectarme por el puerto ethernet con una ip fija y demás.

cuarto: conectar una red con otra utilizando "iptables". Primero reseteamos las iptables con este script:
#!/bin/sh
 IPTABLES="$(which iptables)"
# RESET DEFAULT POLICIES
 $IPTABLES -P INPUT ACCEPT
 $IPTABLES -P FORWARD ACCEPT
 $IPTABLES -P OUTPUT ACCEPT
 $IPTABLES -t nat -P PREROUTING ACCEPT
 $IPTABLES -t nat -P POSTROUTING ACCEPT
 $IPTABLES -t nat -P OUTPUT ACCEPT
 $IPTABLES -t mangle -P PREROUTING ACCEPT
 $IPTABLES -t mangle -P OUTPUT ACCEPT
# FLUSH ALL RULES, ERASE NON-DEFAULT CHAINS
 $IPTABLES -F
 $IPTABLES -X
 $IPTABLES -t nat -F
 $IPTABLES -t nat -X
 $IPTABLES -t mangle -F
 $IPTABLES -t mangle -X

quinto: creamos las reglas necesarias para hacer forwarding y NAT desde la red ethernet a la red wifi. En mi caso esto consiste en ejecutar estos dos comandos:
sudo iptables -A FORWARD --in-interface eth0 -j ACCEPT
sudo iptables --table nat -A POSTROUTING --out-interface wlan0 -j MASQUERADE

Ahora nos guardamos las reglas en un fichero llamado "iptables":
sudo iptables-save > /etc/network/iptables

y metemos esto al final del /etc/network/interfaces :
pre-up iptables-restore < /etc/network/iptables

sexto: habilitar el ip forwarding en el kernel descomentando en el fichero /etc/sysctl.conf esta línea:
#net.ipv4.ip_forward=1
luego ejecutamos sudo sysctl --system para que el cambio sea efectivo.

septimo: arreglar la tabla de enrutado del kernel, con este script:
#/etc/init.d/setuproutes
#
### BEGIN INIT INFO
# Provides: default routes for wlan0
# Required-Start: $syslog $network
# Required-Stop: $syslog
# Should-Start:
# Should-Stop:
# X-Start-Before:
# X-Stop-After:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: false
# Short-Description: adjust default routes
# Description: removes default route 192.168.2.1 adds default route 192.168.1.1
### END INIT INFO
sudo route del default gw 192.168.2.1 eth0
# sudo route add default gw 192.168.1.1 wlan0
exit 0
#!/bin/sh

que deberemos copiar en /etc/init.d y activar con este comando:
sudo update-rc.d setuproutes defaults

octavo: añadir un servicio de DHCP para la nueva minired 192.168.2.0
$ sudo apt-get install isc-dhcp-server
$ sudo mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orig
$ sudo vim /etc/dhcp/dhcpd.conf
y le metemos este contenido
#
# Configuration file for ISC dhcpd for Debian
#
#
ddns-update-style none;
option domain-name "rbn.local";
option domain-name-servers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;

#configure service for network 192.168.2.0 (the ethernet port)
subnet 192.168.2.0 netmask 255.255.255.0 { 
 range 192.168.2.10 192.168.2.50;
 option routers 192.168.2.1;
}
y ejecutamos
$ sudo service isc-dhcp-server restart