Роутер Wi-Fi на Raspberry Pi

Wifi роутер на Raspberry Pi

реклама

Роутер должен не только раздавать интернет не только из Ethernet-порта, но и из одного WiFi-адаптера на другой.Это бывает очень полезно в путешествиях. Например, в гостинице легко оказаться в номере, куда местная точка доступа плохо добивает. А мощный WiFi-адаптер поймает даже слабый сигнал и раздаст его на все имеющиеся планшеты и телефоны. Это также может помочь сэкономить деньги там, где плата за интернет берётся с каждого устройства отдельно.

Подготовительные шаги

Практически каждую команду из этой статьи нужно запускать под super user’ом. Можно запустить под super user’ом Midnight Commander и спокойно редактировать им системные файлы и выполнять любые команды.

sudo mc

Обновление пакетов

Все мануалы по Raspberry Pi начинаются тем, что советуют обновить всё, что можно. Следуя канону, напишем эти команды и мы:

apt-get update
apt-get upgrade

Удалённый доступ к Raspberry Pi

Если у вас не включён SSH, то стоит его включить в настройках Raspberry Pi. Запустить настройки можно командой:

raspi-conf

Открываем раздел Advanced Options -> SSH. И включаем их

Raspberry PI config utility

Raspberry PI config utility

Для подключения к Raspberry Pi через ssh можно использовать утилиту ssh, она есть и в Linux и Windows.

ssh [email protected]

Здесь 192.168.1.2 — это IP-адрес Raspberry, который выдал ей роутер в локальной сети. Чтобы узнать, какой IP-адрес получила ваша Raspberry можно зайти в Admin-интерфейс вашего домашнего роутера или посмотреть информацию об интерфейсах на самом Raspberry через команду ifconfig.

Для удалённого доступа к рабочему столу Raspberry будем использовать XRPD:

apt-get install tightvncserver
apt-get install xrdp

После выполнения этой команды больше ничего настраивать не надо. Для подключения к Raspberry из Windows берём mstsc или программу вроде mRemoteNG и подключаемся к Raspberry Pi 2 используя логин и пароль юзера Raspberrian.

Доступ по rdp через MRemote

Доступ по rdp через MRemote

Кстати, удобно настраивать Raspberry Pi, если подключить его к локальной сети через Ethernet-кабель. Таким образом настройки WiFi-адаптеров не отрубят вас от Raspberry.

При настройке роутера удобно после каждого шага делать бэкап SD-карточки, для этого можно воспользоваться чем-нибудь вроде Acronis True Image или Linux утилиты dd: так будет легко откатиться назад, если что-то пошло не так.

При настройке роутера потребуется править несколько конфигурационных файлов. Мне показалось удобным создать папку, вроде /home/pi/vrouter и накидать туда soft-link’и на все нужные конфиги. Это стоит делать по ходу установки, потому что сами конфиги появляются только после установки соответствующих программ.

ln -s /etc/network/interfaces interfaces
ln -s /etc/wpa_supplicant/wpa_supplicant.conf wpa_supplicant.conf
ln -s /etc/dnsmasq.conf dnsmasq.conf 
ln -s /etc/hostapd/hostapd.conf hostapd.conf
ln -s /etc/default/hostapd hostapd_default
ln -s /etc/rc.local rc.local
ln -s /etc/sysctl.conf syctl.conf
ln -s /etc/udev/rules.d/70-persistent-net.rules 70-persistent-net.rules
ln -s /etc/dhcpcd.conf dhcpcd.conf

Настройка интерфейсов (старые версии Raspberrian до Stretch)

Чтобы у знать, какие интерфейсы у нас есть, выполним команду ifconfig:

$ ifconfig
eth0      Link encap:Ethernet  HWaddr b8:27:eb:0f:10:4e
          inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:98 errors:0 dropped:1 overruns:0 frame:0
          TX packets:72 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:13006 (12.7 KiB)  TX bytes:12910 (12.6 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1104 (1.0 KiB)  TX bytes:1104 (1.0 KiB)

wlan0     Link encap:Ethernet  HWaddr 00:13:ef:c5:10:2e
          inet addr:192.168.1.28  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:63 errors:0 dropped:13 overruns:0 frame:0
          TX packets:30 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7905 (7.7 KiB)  TX bytes:4702 (4.5 KiB)

wlan1     Link encap:Ethernet  HWaddr e0:3f:49:eb:b3:90
          inet addr:192.168.1.5  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:76 errors:0 dropped:15 overruns:0 frame:0
          TX packets:31 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:10266 (10.0 KiB)  TX bytes:4501 (4.3 KiB)

Если вместо wlan0, eth0 и т.п. вы видите что-то вроде «wlx00e01ce3030f» или «enxb822ebfb32ad», у вас включены «predictable network interface names» их можно выключить в raspi-config.

На выводе команды видны следующие интерфейсы:

  • eth0 — проводной Ethernet адаптер. Им мы будем пользоваться, чтобы подключаться к Raspberry на время настройки. С него также можно будет брать интернет.
  • lo — loop back, он же localhost, нам он не интересен.
  • wlan0 — простенький китайский noname WiFi-адаптер, которым я буду раздавать интернет. На нём развернём сеть Raspberry. Адаптер должен поддерживать master-mode.
  • wlan1 — у меня это мощный WiFi-адаптер Asus N-14, которым я буду ловить интернет.
Роутер подключён к сети 192.168.1.0 раздаёт интернет в сеть 10.0.0.0

Роутер подключён к сети 192.168.1.0 раздаёт интернет в сеть 10.0.0.0

Раздавать интернет стоит именно с адаптера wlan0. Таким образом мы сможем отключить 2-й адаптер, если захотим использовать eth0, как источник интернета и wlan1 нам окажется без надобности.

Изменим конфигурацию интерфейсов следующим образом:

nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan1
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan0
iface wlan0 inet static
address 10.0.0.1
network 10.0.0.0
netmask 255.255.255.0
broadcast 255.0.0.0

Смысл этой конфигурации в том, что eth0 и wlan1 настраиваются автоматически. А wlan0 имеет статический IP-адрес 10.0.0.1. По этому IP-адресу можно будет подключаться к Raspberry Pi по SSH или VNC даже если остальные адаптеры будут выключены.

wlan1 берёт настройки подключений к интернету из /etc/wpa_supplicant/wpa_supplicant.conf. Этот файл может понадобиться в будущем, для добавления новых сетей.

Вот пример wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="ASUS"
    psk="password123"
    key_mgmt=WPA-PSK
}

network={
	ssid="NoPasswordNetwork"
	key_mgmt=NONE
}

Настройка интерфейсов в Raspberrian Stretch

В Raspberrian Stretch сильно изменилась настройка интерфейсов и, думаю, что этот момент ещё будут дорабатывать и менять дальше. На текущий момент управлять интерфейсами нужно через /etc/dhcpcd.conf и через wpa_supplicant.

Установим статический IP для интерфейса wlan0. Для этого нужно в конец файла добавить следующие 2 строки:

interface wlan0
static ip_address=10.0.0.1/8

Остальные интерфейсы будут подключаться к интернету автоматически.

Stretch есть такая проблема, что wpa_supplicant всё равно пытается подключить wlan0 к доступной WiFi сети и получить IP. Это нам не нужно, потому что wlan0 будет использоваться hostapd и должен иметь статический IP 10.0.0.1.

Есть 2 способа, как можно запретить wpa_supplicant подключать wlan0 к сети.

  1. Пропатчить файл /lib/dhcpcd/dhcpcd-hooks/10-wpa_supplicant.В конце, есть строчки
    if [ "$ifwireless" = "1" ]  && \
        type wpa_supplicant >/dev/null 2>&1 && \
        type wpa_cli >/dev/null 2>&1
    then

    заменить на

    if [ "$ifwireless" = "1" ]  && [ "$interface" != "wlan0" ]  && \
        type wpa_supplicant >/dev/null 2>&1 && \
        type wpa_cli >/dev/null 2>&1
    then

    Идея патчинга хуков мне не очень нравится.

  2. Создать отдельный файл конфигурации wpa_supplicant для wlan0 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf со следующим кодом:ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

    update_config=1

    Если для wlan0 не будет указано никаких настроек для сетей, то wpa_supplicant не сможет подключить wlan0 ни к какой сети.

Проблема с wlan0 у Raspberry 3

У Raspberry 3 есть свой собственный wifi адаптер. Хорошая новость в том, что он не висит на usb-шине и если раздавать интернет через него, то можно достичь максимальной скорости Wi-Fi. Однако плохая новость в том, что Raspberry Pi 3 не всегда монтирует встроенный адаптер, как wlan0. Если на USB-шине уже висит какой-то wi-fi адаптер, то он может стать wlan0, а встроенный адаптер становится wlan1. Это не удобно, потому стоит «жёстко» закрепить wlan0 за встроенным адаптером. Для этого нужно добавить правило в файл

/etc/udev/rules.d/70-persistent-net.rules.

Правило должно выглядеть примерно так:

SUBSYSTEM=="net",ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:27:eb:53:4d:fd", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"

Где b8:27:eb:53:4d:fd — это mac-адрес встроенного адаптера (его можно узнать с помощью команды ifconfig).

Dnsmasq

Dnsmasq — это DHCP-сервер, который будет раздавать IP в нашей новой сети. Установить его очень просто:

apt-get install dnsmasq

Dnsmasq сам подымет свой сервис, а вам останется его сконфигурировать. Стоит сказать, что dnsmasq.config хорошо документирован:

# disables dnsmasq reading any other files like /etc/resolv.conf for nameservers
no-resolv
# Interface to bind to
interface=wlan0
except-interface=wlan1
except-interface=eth0
# Specify starting_range,end_range,lease_time
#address=/#/10.0.0.1
dhcp-range=10.0.0.3,10.0.0.20,12h
# dns addresses to send to the clients
server=8.8.8.8
server=8.8.4.4
log-facility=/var/log/dnsmasq.log
log-queries

interface=wlan0 обозначает интерфейс, на котором dnsmasq будет ожидать входящих DHCP-запросы. Wlan1 и eth0 — интерфейсы, которыми мы ловим интернет.

Sysctl.conf

Включим пресылку пакетов, для этого поправим файл /etc/systcl.conf:

nano /etc/sysctl.conf

По умолчанию, все настройки в этом файле закомментировны. Для настройки роутера важно, чтобы были раскоментированы следующие настройки:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Iptables

Настроим NAT. Пусть настройки iptables устанавливаются при запуске Raspberry, для этого поправим файл rc.local.

nano /etc/rc.local

Заведём две переменные: SOURCE — адаптер-источник интернета — и DEST — адаптер, раздающий интернет. Так нам будет удобно удобно поменять назначение адаптеров.

#!/bin/sh -e
#
# rc.local

SOURCE=wlan1
DEST=wlan0

iptables -t nat -A POSTROUTING -o $SOURCE -j MASQUERADE
iptables -A FORWARD -i $SOURCE -o $DEST -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $DEST -o $SOURCE -j ACCEPT

exit0

В будущем, чтобы изменить источник интернета с wlan1 на eth0 нам потребуется всего лишь поменять SOURCE=wlan1 на SOURCE=eth0. Другие файлы конфигурации менять не придётся.

Hostapd

hostapd — это утилита, которая будет делать точку доступа из WiFi-адаптера. Она переводит WiFi-адаптер в master mode и сама поднимает bridge между адаптерами. hostapd можно запускать из консоли командой hostapd [path_to_config]. Но нам нужно, чтобы wlan0 становился точкой доступа сразу же после загрузки Raspberry. Потому нам нужно запустить hostapd, как сервис. Для этого мы настроим путь до конфига hostapd в файле /etc/default/hostapd.

nano /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"

Теперь настроим конфиг hostapd.conf. Именно с ним возникают различные сложности.

nano /etc/hostapd/hostapd.conf

Для начала можно попробовать использовать конфиг для простой сети без авторизации с дефолтным драйвером:
interface=wlan0
ssid=Raspberry_Free
hw_mode=g
channel=6
auth_algs=1
wmm_enabled=0

Если у вас получилось подключиться к интернету с такой конфигурацией, значит можно настраивать авторизацию. А если подключиться не вышло, то, вероятно, проблема с драйвером. Нужно найти описание вашей сетевой карты и изучить, как установить драйвер вашей сетевое карты в Raspberrian. Найти информацию по вашему адаптеру вам поможет https://wikidevi.com.

Например, конфиг выглядит следующим образом:

interface=wlan0
driver=nl80211
ssid=Raspberry
channel=3
country_code=US
ieee80211d=1
ieee80211n=1
wmm_enabled=1
hw_mode=g
#auth
wpa=2
wpa_passphrase=picupcake
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP 
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0
ignore_broadcast_ssid=0

# control
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

Посмотреть активен ли сервис hostapd можно с помощью команды service --status-all.

Failed to update rate sets in kernel module

При запуске hostapd у меня он выдавал ошибку Failed to update rate sets in kernel module. Вылечить её конфигурированием я никак не смог, потому собрал hostapd из исходников. На момент написания статьи (RASPBIAN WHEEZY) в репозиториях Raspberian лежал hostapd 1.0, а из исходников я собрал версию 2.4. Вместе с RASPBIAN JESSIE в репозиториях появился hostapd 2.3, таким образом 2.3 вы можете поставить просто выполнив apt-get install hostapd.

Сборка hostapd из исходников

Если вы используете hostapd v2.1 и сталкиваетесь с ошибкой сегментации (дамп ядра), возможно, вам потребуется скомпилировать последнюю версию hostapd. Для этого запустите:

# install required packages first sudo apt-get -y install build-essential git libnl-dev iw crda libssl-dev libnl-genl-3-200 libnl-3-200 cd ~ git clone git://w1.fi/srv/git/hostap.git cd ~/hostap/hostapd git checkout hostap_2_3 cp defconfig .config sed -i 's/^#CONFIG_DRIVER_NL80211=y/CONFIG_DRIVER_NL80211=y/g' .config # enable 802.11n and 802.11ac sed -i 's/^#CONFIG_IEEE80211N=y/CONFIG_IEEE80211N=y/g' .config sed -i 's/^#CONFIG_IEEE80211AC=y/CONFIG_IEEE80211AC=y/g' .config # enable automatic channel selection sed -i 's/^#CONFIG_ACS=y/CONFIG_ACS=y/g' .config make && sudo make install

Когда вы проверяете номер версии вашего скомпилированного hostapd:

/usr/local/bin/hostapd -v

… должно получиться что-то вроде этого:
hostapd v2.3-devel
User space daemon for IEEE 802.11 AP management,
IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Copyright (c) 2002-2014, Jouni Malinen and contributors

Однако я бы советовал зайти на страницу https://w1.fi/cgit/hostap/refs/tags и посмотреть, что там есть за версии. На момент написания этой статьи версия hostap_2_4 неплохо работала.

Performance

Быстродействие WiFi-роутер на Raspberry зависит не сколько от самой Raspberry, сколько от WiFi-адаптера, который был использован для раздачи интернета. Например, китайский No-Name адаптер выдал скорость в ≈20 мбит/с, а Asus N14 чуть больше 30 мбит/с.

Стоит ещё учесть, что WiFi-адаптер может потреблять много энергии, больше, чем способен дать USB-порт Raspberry Pi. В этом случае адаптер может понизить скорость, понизив своё энергопотребление. Побороться с этим можно с помощью USB-хаба с дополнительным питанием, либо использовав специальный USB-кабель.

Стоит обратить на некоторые опции в hostpad.conf, которые могут улучшить быстродействие:

country_code=US
ieee80211d=1
ieee80211n=1
wmm_enabled=1
hw_mode=g

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *