Введение
Возникла необходимость раздать интернет с 3G-модема на несколько компьютеров. Эти компьютеры подключены к одному и тому же роутеру: 3 компьютера проводами, один - вай-ваем.
Вот только на роутере D-Link DIR-300 нет разъёма USB. Как подключить к нему 3G-модем? Можно на одном из компьютеров поднять интернет через данный модем, а на других компьютерах - указать первый компьютер в качестве шлюза интернета... Собственно, я так и делал до недавнего времени (благо, что и винда, и Linux, умеют расшаривать интернет по локальной сети).
А что если купить роутер с USB? использовать вместо роутера - Raspberry Pi?
Что я сделал?
Выключаем DIR-300, включаем 5-портовый свитч на 100 мегабит. Подключаем к нему 3 компьютера из 4. Компьютеры ругаются «неизвестная сеть!», не видят друг друга, файловый обмен не идёт!
Это не удивительно. Роутер, это же свитч «с мозгами». Роутер раздавал всем компьютерам IP-адреса. А свитч не раздаёт.
Задал каждому компьютеру статичный IP-адрес в диапазоне 192.168.1.[1-4]. Что ж, теперь они друг друга видят, и файловый обмен тоже работает.
Подключил к свичу Raspberry Pi 3. Дал ему IP-адрес 192.168.1.1. Настроил DHCP-сервер в диапазоне 192.168.1.[2-5]. После чего, подключил компьютеры (кроме одного, который по Wi-Fi). Получился вот такой бутерброд. Проверил - работает. Теперь на всех компьютерах можно вернуть «получение IP-адреса автоматически».
По сути, я получил то же самое, что и было с DIR-300. Только без Wi-Fi.
«Подводные камни»
Я боялся, что, так как Raspberry Pi 3 имеет медленный eth0-интерфейс, то файловый обмен между компьютерами будет медленный. Но я зря боялся: оказалось, что компьютеры устанавливают между собой прямые соединения, а не гоняют трафик через Raspberry Pi. Странно: почему я думал, что трафик между 192.168.1.2 и 192.168.1.3 идёт транзитом через 192.168.1.1?
Что ж, теперь я буду знать, что 192.168.1.1 не участвует в файловом обмене. Он раздаёт IP-адреса, после чего, фактически, не нужен. Хотя, потом он будет нужен, потому что потом он станет шлюзом в интернет...
Подключаем Wi-Fi
Файл /etc/network/interfaces
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.2.1
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
Файл DHCP-сервера dnsmasq:
interface=eth0
interface=wlan0
dhcp-range=eth0,192.168.1.2,192.168.1.8,72h
dhcp-range=wlan0,192.168.2.2,192.168.2.8,72h
Файл точки доступа Wi-Fi hostapd:
interface=wlan0
#bridge=br0
driver=nl80211
ssid=НАЗВАНИЕТОЧКИДОСТУПА
hw_mode=g
ieee80211d=1
country_code=RU
ieee80211n=1
auth_algs=1
channel=11
wpa=2
wpa_passphrase=ПАРОЛЬТОЧКИДОСТУПА
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
macaddr_acl=0
Запускаем... Смотрим... Появилась точка доступа. Подключаем последний компьютер по Wi-Fi. Теперь он тоже в локальной сети, вот только в другом диапазоне адресов 192.168.2.x. Может создать интерфейс br0
и кинуть туда eth0
и wlan0
? Тогда по Wi-Fi тоже будут адреса 192.168.1.x
Раздаём интернет
Включаем 3G-модем, ждём когда 3G-модем начнёт имитировать сетевую карту и создаст устройство usb0
, раздающее интернет. Нет, не создаёт (старый модем, который не умеет так делать). Тогда соединяемся с интернетом при помощи wvdial, получив устройство ppp0
. Запускаем раздачу интернета с интерфейса ppp0 на все доступные интерфейсы:
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo sysctl -w net.ipv4.ip_forward=1
Проверяем... Интернет на компьютерах есть. DHCP-сервер уже раздал адрес шлюза интернета 192.168.1.1.
Осталось это всё запихать в автозагрузку как-то, и включить SSH и VNC для удалённого администрирования. Эх, веб-интерфейс бы...
Вопросы специалистам
Я добавил правило iptables в автозагрузку, создав файл /etc/network/if-up.d/00-iptables
. Сделал этот файл исполняемым при помощи chmod +x
. Содержимое файла:
#!/bin/sh
iptables-restore < /etc/firewall.conf
Файл /etc/firewall.conf
я создал командой sudo iptables-save /etc/firewall.conf
. Вот что получилось:
# Generated by iptables-save v1.4.21 on Mon Dec 12 21:37:11 2016
*filter
:INPUT ACCEPT [139:9528]
:FORWARD ACCEPT [19:1955]
:OUTPUT ACCEPT [100:10836]
COMMIT
# Completed on Mon Dec 12 21:37:11 2016
# Generated by iptables-save v1.4.21 on Mon Dec 12 21:37:11 2016
*nat
:PREROUTING ACCEPT [24347:1868498]
:INPUT ACCEPT [6804:526860]
:OUTPUT ACCEPT [1879:137379]
:POSTROUTING ACCEPT [39:2515]
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
# Completed on Mon Dec 12 21:37:11 2016
RPi при запуске раздаёт IP-адреса по eth0 и wlan0, благодаря чему работает локалка. А вот интернет приходится стартовать вручную, так как я не знаю, как запускать wvdial автоматически. Пока что решил мега-костылём: создал нового пользователя startap, дал ему права sudoers, разрешил этому юзеру автологин в tty2, и в ~/.bashrc
прописал sudo wvdial
. Как же всё-таки cделать правильно?
Дальшейние планы
- Сделать ФС устройства read only. Потому что, при внезапной потере питания, есть риск повредить системные файлы, и система больше не стартанёт. А система должна быть отказо-устойчивой.
- Настроить сервер Samba. В данный момент мастер-сервером становится тот компьютер, который был включен раньше всех. Если его выключить - остальные компьютеры перестают видеть друг друга, разве что напрямую вбивать IP или имя компьютера в адресной строке. Надо чтобы мастер-сервером стал роутер.
- Настроить видеонаблюдение (CCTV) при помощи видеокамеры для Raspberry Pi. Есть удобная софтина MotionEye, которая использует ImageMagick и аппаратный энкодер h264 на RPi. Осталось только сделать что-то вроде видеорегистратора, с записью видео в файлы по 15 минут каждый, и удалением старых файлов по мере переполнения storage. А также возможность смотреть это через VNC на мониторе, либо сами файлы через SMB.
- Подключить SSD в качестве storage для пункта 3, так как microSD-флешка очень медленная и лагучая. Какой SSD посоветуете? Должен ли SSD уметь делать trim самостоятельно? Или операционка Raspbian делает это сама? И можно ли установить систему на SSD вообще? Ну или tmpfs на SSD поднять, чтоб ускорить устройство.
- Может ещё что-нибудь вкусное поднять на устройстве.