Raspberry pi в качестве wi-fi роутера с 4G модемом

Итак имеется raspberry pi 2b, usb 4G модем, usb wi-fi адаптер. Так же есть Osoyoo LCD touch screen 3.5″ для Raspberry Pi, который подключается сразу к GPIO, но у Вас может быть и другой экран, хотя в целом он без особой необходимости, работать наш импровизированный wi-fi роутер на raspberry pi 2 будет и без экрана.
raspberry pi LCD touch screen 300x229
A вот что действительно улучшит ситуацию, так это обычная кнопка без фиксации положения (по типу как в системных блоках для включения ПК).
Итак на raspbery pi установлена Ubuntu Mate (OS) 16.04.2.
Посмотреть версию можно командой:
lsb_release -a
увидим нечто, похожее на:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.2 LTS
Release: 16.04raspberry
Codename: xenial

Стандартный логин у этой ОС у меня был pi, а пароль raspberry.
Изначально ssh ыхода на raspberry pi нет, чтобы запустить ssh запускаем терминал, выполняем команду raspi-config, переходим в раздел «Interfacing» — «SSH» — «Yes». После этого на raspberry pi можно будет зайти по ssh. Если у Вас загружается графический интерфейс, то можно отключить его запуск «Boot Options» — «Desktop / CLI Choose whether to boot into a desktop environment or the command line» — «Console Text console» и уж коль отключаем графический интерфейс, то отключаем и Splash Screen, для этого переходим «Boot Options» — «Splash Screen Choose graphical splash screen or text boot» и на вопрос «Would you like to show the splash screen at boot?» отвечаем ««. Сразу же рекомендую поменять пароль в разделе «Change User Password».

Вернёмся к usb 4G модему и wi-fi адаптеру. Перед физическим подключением устройств смотрим, что сейчас подключено по usb.
Выполняем команду lsusb
У себя я вижу:
Bus 001 Device 004: ID 6901:1224
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Подключаю wi-fi адаптер и снова смотрю lsusb
Вижу появилось новое стройство:
Bus 001 Device 004: ID 6901:1224
Bus 001 Device 005: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Адаптер автоматически определился и посмотрев сетевые интерфейсы, помимо enxb827eb90e12e появился новый интерфейс wlx784476a4f4fc.
ifconfig
wlx784476a4f4fc Link encap:Ethernet HWaddr 78:44:76:a4:f4:fc
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

подсоединив ещё и 4G модем, можно увидеть как он определился в системе через lsusb:
Bus 001 Device 007: ID 12d1:14dc Huawei Technologies Co., Ltd.
Bus 001 Device 005: ID 04d9:1702 Holtek Semiconductor, Inc. Keyboard LKS02
Bus 001 Device 004: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

в сетевых интерфейсахон тоже определился сразу с автоматически назначенным адресом:
enx0c5b8f279a64 Link encap:Ethernet HWaddr 0c:5b:8f:27:9a:64
inet addr:192.168.8.100 Bcast:192.168.8.255 Mask:255.255.255.0
inet6 addr: fe80::68ba:f175:c316:73d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:79 errors:0 dropped:0 overruns:0 frame:0
TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:31220 (31.2 KB) TX bytes:7075 (7.0 KB)

назначаем адрес новому wi-fi интерфейсу wlx784476a4f4fc (на более новых версиях ubuntu настройка сети производится иначе).
sudo cp /etc/network/interfaces /etc/network/interfaces-0
sudo nano /etc/network/interfaces

Дописываем в конец файла следующее:
auto wlx784476a4f4fc
iface wlx784476a4f4fc inet static
address 10.36.5.35
netmask 255.255.255.0
#gateway 192.168.0.1
dns-nameservers 8.8.8.8 8.8.4.4

Небольшое пояснение:
wlx784476a4f4fc -сетевой интерфейс, созданный при подключении wi-fi адаптера
10.36.5.35 — ip-адрес, который мы ему назначаем
8.8.8.8 8.8.4.4 — DNS`ы

перезапускаем сеть:
sudo service networking restart

смотрим результат командой ifconfig и видим, что интерфейсу успешно назначен новый адрес 10.36.5.35 :
wlx784476a4f4fc Link encap:Ethernet HWaddr 78:44:76:a4:f4:fc
inet addr:10.36.5.35 Bcast:10.36.5.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

далее устанавливаем необходимое ПО и останавливаем службы установленного:
sudo apt install dnsmasq hostapd
Соглашаемся на установку:
The following additional packages will be installed:
libnl-route-3-200
The following NEW packages will be installed:
dnsmasq hostapd libnl-route-3-200
0 upgraded, 3 newly installed, 0 to remove and 227 not upgraded.
Need to get 558 kB of archives.
After this operation, 1,359 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y

и останавливаем службы установленного:
sudo systemctl stop dnsmasq
sudo systemctl stop hostapd

переходим к конфигурационному файлу dhcp сервер, который мы только что установили.
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf-0
sudo nano /etc/dnsmasq.conf

Делаем содержимое следующим:
interface=wlx784476a4f4fc
dhcp-range=10.36.5.250,10.36.5.151,255.255.255.0,24h

Пояснение:
Здесь мы указали, что сервер будет висЕть на интерейсе wlx784476a4f4fc и выдавать адреса из диапазона 10.36.5.151 — 10.36.5.250. Маска 255.255.255.0. 24h — на какое время выдаётся адрес.

Далее переходим к настройке точки доступа.
sudo nano /etc/hostapd/hostapd.conf

Заполняем конфигурационный файл так:
interface=wlx784476a4f4fc
#bridge=br0
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ssid=НАЗВАНИЕ-ТОЧКИ-ДОСТУПА
wpa_passphrase=ПАРОЛЬ-ДЛЯ-ПОДКЛЮЧЕНИЯ-К-ТОЧКЕ-ДОСТУПА

Далее указываем, где hostapd должен смотреть свой конфигурационный файл:
sudo nano /etc/default/hostapd

вписываем туда строку:
DAEMON_CONF="/etc/hostapd/hostapd.conf"

Стартуем службы:
sudo systemctl start dnsmasq
sudo systemctl start hostapd

Посмотреть состояние службы можно так:
sudo service dnsmasq status
sudo service hostapd status

Так же есть небольшая особенность. После перезагрузки dnsmasq не поднимался, возможно из-за более поздней инициализации сетевого интерфейса, на котором должна происходить раздача ip-адресов, соответветственно точка доступа была видна в эфире, но при подключении, автоматически адрес для клиента не выдавался. Чтобы обеспечить запуск dnsmasq после перезагрузки сделаем небольшой скрипт:
sudo nano /usrsrc/sh/start.sh
вписываем:
#! /bin/bash

sleep 15
sudo systemctl start dnsmasq &

даём права и делаем запускаемым:
sudo chmod 0777 /usrsrc/sh/start.sh
sudo chmod +x /usrsrc/sh/start.sh

Добавляем в крон на запуск после перезагрузки:
sudo crontab -e
вписываем в конце:
@reboot sudo /usrsrc/sh/start.sh &

Положу содержимое start.sh ещё и сюда.
С dnsmasq закончили.

Теперь, если службы успешно запустились, то можно пробовать подключаться к нашей новой точке доступа «ТОЧКИ-ДОСТУПА» с помощью, например, смартфона и подключение скорее всего произойдёт успешно. Телефон получит адрес из диапазона 10.36.5.151 — 10.36.5.250, но вот интернета смартфон мы не получим, поскольку наша raspberry pi его нам не раздаёт. Чтобы исправить это, выполняем следующие действия (я их описывал в этой публикации ). В кратце повторюсь здесь:
sudo nano /etc/sysctl.conf
находим там строку #net.ipv4.ip_forward=1 и раскомментируем её, или же просто в конце файла дописываем:
net.ipv4.ip_forward=1

Далее в /etc/network/interfaces дописываем:
post-up /etc/nat

Создаём тот самый /etc/nat:
sudo nano /etc/nat
вписываем туда:
#!/bin/bash

#Включаем форвардинг пакетов (обязательно !!! )
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ip_nat_pptp

# Очищаем все правила
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X
iptables -t nat -X
iptables -t mangle -X

# Разрешаем сразу всё
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Разрешаем доступ из внутренней сети наружу
iptables -A FORWARD -i wlx784476a4f4fc -o enx0c5b8f279a64 -j ACCEPT

# Разрешаем доступ снаружи во внутреннюю сеть
iptables -A FORWARD -i enx0c5b8f279a64 -o wlx784476a4f4fc -j ACCEPT

# Маскарадинг
iptables -t nat -A POSTROUTING -o enx0c5b8f279a64 -s 10.36.5.35/24 -j MASQUERADE

На всякий случай содержимое файла nat полоду тут.
После того как сохранили и закрыли файл /etc/nat, назначаем ему права:
sudo chmod 0777 /etc/nat
sudo chmod +x /etc/nat

Выполняем файл /etc/nat:
sudo bash /etc/nat
sudo reboot

Можем снова подключаться смартфоном к точке доступа «ТОЧКИ-ДОСТУПА» и она уже будет раздавать интернет на Ваше мобильное устройство. На мобильном телефоне можете поставить любую программу с сетевыми утилитам и проверить через ping или tracert ( например программа IP Tools: WIFI Analyzer )

БОНУС:
1) Поскольку точка доступа из raspberry pi у меня получается довольно мобильная, постоянно носить с собой клавиатуру, только для того, чтобы корректно завершить работу операционной системы, я не хочу, значит надо сделать кнопку без фиксации положения для выключения операционной системы. Саму кнопку подключим, конечно же GPIO, в частности решил использовать GPIO20 и GPIO21.

Когда физически кнопку уже подключили к разъёмам, переходим к написанию небольшого скрипта.
sudo mkdir -p /usrsrc/sh/
sudo nano /usrsrc/sh/shutdown.sh

Вписываем туда следующее:
#! /bin/bash

echo "20" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio20/direction
echo "1" > /sys/class/gpio/gpio20/value
echo "21" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio21/direction

while ( true )
do
if [ $( /sys/class/gpio/unexport
echo "21" > /sys/class/gpio/unexport
shutdown -P now
fi
sleep 1
done

Содержимое скрипта ещё можно посмотреть тут.
Далее назначаем права на скрипт иделаем его исполняемым:
sudo chmod -R 0777 /usrsrc/sh/
sudo chmod +x /usrsrc/sh/shutdown.sh

Теперь необходимо, чтобы этот скрипт запускался постоянно при загрузке.
sudo crontab -e
в конце вписываем:
@reboot sudo /usrsrc/sh/shutdown.sh &
Теперь после перезагрузки скрипт запустится автоматически и каждую секунду будет опрашивать состояние разъёмов GPIO на предмет нажатия кнопки.

2) Поскольку у меня к raspberry pi подключен маленький монитор, то хотелось бы получить от него пользу в виде мониторинга нашей wi-fi точки доступадля этого сделаю автологин на консоль tty1 и запуск консольной утилиты мониторинга. Как это сделать, я описал в отдельной статье.

Всё, можно вычёргивать сетевой кабель, который мы использовали для подключения к Raspberry pi и перезагружаем:
sudo reboot
Можно пользоваться.

Примечание:
Кстати есть консольные браузеры, например links или w3m.
sudo apt-get install links
links http://mediaunix.com

sudo apt-get install w3m
w3m http://mediaunix.com

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