- Подготовительные шаги
- Настройка интерфейсов (Старые версии Raspberrian до Stretch)
- Настройка интерфейсов в Raspberrian Stretch
- Проблема с Wlan0 у Raspberry 3
- Dnsmasq
- Sysctl.conf
- Iptables
- Hostapd
- Быстродействие
- Другие статьи по настройке wifi-роутера на Raspberry Pi
Роутер должен не только раздавать интернет не только из Ethernet-порта, но и из одного WiFi-адаптера на другой. Это бывает очень полезно в путешествиях. Например, в гостинице легко оказаться в номере, куда местная точка доступа плохо добивает. А мощный WiFi-адаптер поймает даже слабый сигнал и раздаст его на все имеющиеся планшеты и телефоны. Это также может помочь сэкономить деньги там, где плата за интернет берётся с каждого устройства отдельно.
Подготовительные шаги
Практически каждую команду из этой статьи нужно запускать под super user'ом. Можно запустить под super user'ом Midnight Commander и спокойно редактировать им системные файлы и выполнять любые команды.
sudo mc
Обновление пакетов
Все мануалы по Raspberry Pi начинаются тем, что советуют обновить всё, что можно. Следуя канону, напишу эти команды и я:
apt-get update
Можно ещё обновить сам Raspberian.
apt-get upgrade
Удалённый доступ к Raspberry Pi
Если у вас не включён SSH, то стоит его включить в настройках Raspberry Pi. Запустить настройки можно командой:
raspi-conf
Там идём в раздел Advanced Options -> SSH. И включаем их.
Для подключения к Raspberry Pi через ssh можно использовать mRemoteNG, а можно утилиту ssh
, она есть и в Linux и Windows.
ssh [email protected]
Здесь 192.168.1.2 — это IP-адрес Raspberry, который выдал ей роутер моей локальной сети. Чтобы узнать, какой IP-адрес получила ваша Raspberry можно зайти в Admin-интерфейс вашего домашнего роутера или посмотреть информацию об интерефейсах на самом Raspberry через команду ifconfig
.
Для удалённого доступа к рабочему столу Raspberry я пытался настроить VNC. Потратил много времени в итоге ничего хорошего не вышло. Проще использовать XRPD.
apt-get install tightvncserver
apt-get install xrdp
После выполнения этой команды больше ничего настраивать не надо. Для подключения к Raspberry из Windows берём mstsc или программу вроде mRemoteNG и подключаемся к Raspberry Pi 2 используя логин и пароль юзера Raspberrian.
Кстати, удобно настраивать Raspberry Pi, если подключить его к локальной сети через Ethernet-кабель. Таким образом настройки WiFi-адаптеров не отрубят вас от Raspberry.
При настройке роутера удобно после каждого шага делать бэкап SD-карточки, для этого можно воспользоваться чем-нибудь вроде Acronis True Image или линуксовой утилиты 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
Свои файлы конфигурации я выложил на github: https://github.com/musukvl/raspberry-pi-wifi-router-config
Настройка интерфейсов (Старые версии 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, которым я буду ловить интернет.
Раздавать интернет соит имеено с адаптера wlan0. Таким образом мы сможем отключить второй адаптер, если захотим использовать 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 сильно изменилась настройка интерфейсов и, думаю, что этот момент ещё будут дорабатывтаь и менять дальше.
На текщуй момент (4 апреля 2018 года) управлять интерфейсами нужно через /etc/dhcpcd.conf
и через wpa_supplicant. Погрузиться в эту тему можно вот с этого поста https://raspberrypi.stackexchange.com/a/37921/32956.
Установим статический 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.
Есть два способа, как можно запретить wpa_supplicant подключать wlan0 к сети.
-
Первый Пропатчить файл
/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
Идея патчинга хуков мне не очень нравится.
-
Второй способ, это создать отдельный файл конфигуркции wpa_supplicant для wlan0
/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
со следующим кодом:ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 <!--code--> <p> Если для wlan0 не будет указано никаких настроек для сетей, то wpa_supplicant не сможет подключить wlan0 ни к какой сети. </p> </li> </ol> <h2 id="interfaces-raspi3">Проблема с wlan0 у Raspberry 3</h2> <p> У Raspberry 3 есть свой собственный wifi адаптер. Хорошая новость в том, что он не висит на usb-шине и если раздавать интернет через него, то можно достичь максимальной скорости Wifi. Однако плохая новость в том, что Raspberry Pi 3 не всегда монтирует встроенный адаптер, как wlan0. Если на USB-шине уже висит какой-то wi-fi адаптер, то он может стать wlan0, а встроенный адаптер становится wlan1. Это не удобно, потому стоит "жёстко" закрепить wlan0 за встроенным адаптером. Для этого нужно добавить правило в файл <code>/etc/udev/rules.d/70-persistent-net.rules</code>. Правило должно выглядеть примерно так: </p> <!--code--> 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
хорошо документирован.nano /etc/dnsmasq.conf
# 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 exit 0
В будушем, чтобы изменить источник интернета с 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 по этому мануалу: http://quadfinity.blogspot.ru/2014/09/compile-latest-hostapd-v2.3-on-Raspberry-Pi-or-ODROID.html
Однако я бы советовал зайти на страницу 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
Другие статьи по настройке wifi-роутера на Raspberry Pi
- https://help.ubuntu.com/community/WifiDocs/WirelessAccessPoint
- Настройка WiFi-роутера под Ubuntu. Стоит обратить внимание, что там интернет из wlan1 раздаётся через wlan0.
- http://elinux.org/RPI-Wireless-Hotspot
- Статья содержит самый простой конфиг для hostapd.
- http://jacobsalmela.com/raspberry-pi-and-routing-turning-a-pi-into-a-router/
- Очень популярная статья. Но стоит обратить внимание, на то, что автор сам строит мост между адаптерами. В моём случае hostapd сама подымает это мост.
- http://raspberrypihq.com/how-to-turn-a-raspberry-pi-into-a-wifi-router/
- Здесь говорится о связке isc-dhcp-server + hostapd.
- http://andrewmichaelsmith.com/2013/08/raspberry-pi-wi-fi-honeypot/
- Статья старая, но про hostapd + dnsmasq.
- http://errietta.me/blog/raspberry-pi-router/
- Ман девушки из Греции.
- http://www.daveconroy.com/turn-your-raspberry-pi-into-a-wifi-hotspot-with-edimax-nano-usb-ew-7811un-rtl8188cus-chipset
- Здесь рассказывается про то, как поднять роутер на хитром адаптере. Однако данная статья имеет много полезных комментариев.