Monitoring z terminala Dell D10D: część III: Internet via USB, LAN z Internetem, AP i dostęp zdalny

W poprzedniej części ustawiłem lokalny LAN dla kamerek, podłączyłem kartę WiFi, a także skonfigurowałem ZoneMindera do celów przechowywania nagrań z jednej kamery. Teraz pora na ostatnie kroki, czyli ustawienie dostępu do Internetu z modemu USB (w tym wypadku stary Huawei E3131-s2), Internet via LAN, tryb Access Pointa oraz setup dostępu zdalnego. 

Tak, wiem, trochę nie było aktualizacji treści. Niestety sezon chorobowy dał się ostro we znaki. A zatem, standardowe ostrzeżenie: Wszelkie prace wykonujesz na własną odpowiedzialność. Nie odpowiadam za utratę danych, uszkodzenia sprzętu i zdrowia.

Teraz jedziemy z tematem.

Modem USB

Po pierwszym podłączeniu modemu pojawia się on w trybie Mass Storage. Działa on tak ze względu na możliwość łatwej instalacji sterowników (Huawei Mobile Partner) do jego obsługi pod systemem Windows. Obecnie to już przeszłość pamiętająca czasy Windows XP czy Windows 7 - np w Windows 10 działało to automatycznie i to bez Mobile Partnera.
Pod Debianem potrzeba magicznego usb_modeswitch, który przełączy automatycznie na tryb NDIS (wirtualna karta sieciowa) lub RAS (tryb modemu). Zainstalowałem zatem ten program za pomocą sudo apt install usb-modeswitch. Po tym zabiegu po wywołaniu networkctl pojawiła się nowa karta sieciowa:

IDX  LINK            TYPE     OPERATIONAL    SETUP
1    lo              loopback carrier        unmanaged       
2    enp4s0          ether    routable       configured
3    wlan0           wlan     routable       configured
4    wwx582c80139263 wwan     off            unmanaged
czyli mamy tryb NDIS. Pozostaje skonfigurować APN i inne potrzebne rzeczy.

Uwaga: jeśli nie masz karty WiFi i dostępu do internetu na terminalu po konfiguracji z poprzedniej części, ściągnij pakiet z repozytorium Debiana, przenieś go na pamięci masowej i zainstaluj poleceniem sudo dpkg -i <plik.deb>
Potrzebny będzie także modem-manager. Można ściągnąć używając apta lub sposobem powyżej, z tym że potrzebne pakiety to:
  • modemmanager
  • libmm-glib0
  • libmbim-proxy
  • libqmi-glib5
  • libqmi-proxy
Konfigurację modemu z networkd zaczerpnąłem stąd, zmieniając ifconfig na ip link set. Poniżej krok-po-kroku. W moim przypadku APN to internet a moja sieć to MobileVikigns. Karta nie ma PINu.

Konfiguracja networkd

Utwórz plik /etc/systemd/network/<nazwaurzadzenia>.network:
[Match]
Name=wwx582c80139263
# wstaw tutaj swoją nazwę urządzenia sieciowego
[Network]
DHCP=ipv4
#dns google
DNS=8.8.8.8
Zrestartuj systemd-networkd systemctl restart systemd-networkd.

Skrypty do startu i wyłączenia modemu

Utwórz następujące pliki jako root i nadaj im uprawnienia uruchamiania:
/usr/local/bin/modem-connect
#!/bin/sh
# jeśli potrzebujesz pin, to dodaj po apn: ,pin=1234
mmcli -m 0 --simple-connect="apn=internet" && \
ip link set wwx582c80139263 up
return $?
/usr/local/bin/modem-disconnect
#!/bin/sh
ip link set wwx582c80139263 down
mmcli -m 0 --simple-disconnect

Skrypty zostały nieco zmodyfikowane aby można było je użyć z systemd. Chodzi o to, że jeśli polecenie się nie powiedzie, to do systemu zostanie zwrócony status FAILURE i systemd ponowi uruchomienie po kilku sekundach automatycznie. Dlaczego? Otóż zanim modem złapie sieć - może to trochę potrwać. W tym przypadku mmcli zwróci błąd, więc nie ma sensu wykonywać polecenia ip link set - za pomocą return $? zwracamy do systemu status ostatniego polecenia. Jeśli 0 - to jest OK, jeśli inna wartość - to oznacza błąd. 

Ja miałem dodatkowo drobny problem z DNS, dlatego konieczne było wykonanie poleceń:

# ln -rsf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
# systemctl enable systemd-resolved


aby system automatycznie ustawił adresy DNS.

Po wywołaniu skryptu /usr/local/bin/modem-connect otrzymałem połączenie z internetem. Jednak by działo się to automatycznie, konieczne będzie zdefiniowanie usługi systemd. W tym celu utworzyłem:

/etc/systemd/system/modem.service
[Unit]
Description=Connect to the Internet via USB modem
StartLimitIntervalSec=0
#odpal po uruchomieniu sieci lokalnej
After=network.target

[Service]
Type=simple
RemainAfterExit=yes
Restart=always
RestartSec=5
User=root
ExecStart=/usr/local/bin/modem-connect
ExecStop=/usr/local/bin/modem-disconnect

[Install]
WantedBy=multi-user.target

Włączyłem usługę za pomocą systemctl enable modem.
Po restarcie modem automatycznie wstał.

Modem w stanie podłączonym z HSPA+

Udostępnianie Internetu w sieci LAN

Tutaj sprawa sprowadza się do stworzenia kilku reguł iptables. Należy włączyć przekazywanie pakietów na trasie interfejs ethernet - interfejs WWAN oraz dodać NAT. A wszystko to dlatego, że już mamy iptables-persistent z poprzedniej części, więc wystarczy tylko dodać nowe reguły i je zapisać. Poniżej prezentuję treść poleceń do wykonania. enp4s0 to interfejs sieci LAN, a wwx582c80139263 to karta modemu.

#pozwalamy na wejście z LAN
sudo iptables -A INPUT -i enp4s0 ACCEPT
#przekazywanie pakietów z LAN
sudo iptables -A FORWARD -i enp4s0 ACCEPT
#odpalamy NAT do interfejsu z internetem
sudo iptables -t nat -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
sudo sh -c '/sbin/iptables-save > /etc/iptables/rules.v4
Tym sposobem terminal będzie robił jednocześnie za router.
W przypadku problemów z DNS w pliku /etc/systemd/resolved.conf dodaj linię:
DNSStubListener=no
I uruchom ponownie demona systemd-resolved.

WiFi jako Access Point

Jeśli nie masz karty WiFi to możesz pominąć ten krok.

Hostapd

Pierwsze co to trzeba wywalić iwd i zainstalować hostapd oraz iw. Po tej akcji zrestartować terminal, bo karta WiFi zmieni swoją nazwę z wlan0 na coś innego. Nie chce mi się bawić w ustawianie reguł udev.
# apt remove iwd
# apt install hostapd iw
Teraz pora na konfigurację. Utwórz następujący plik:
/etc/hostapd/wlp2s0.conf
interface=wlp2s0
driver=nl80211
ssid=TWOJ_SSID
#moja karta obsluguje tylko wifi 802.11g
hw_mode=g
channel=11
wpa=2
wpa_passphrase=TWOJE_TAJNE_HASLO_DO_NETA
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
wpa_ptk_rekey=600
macaddr_acl=0
Potem trzeba włączyć usługę hostapd, ale w nieco inny sposób. Najpierw należy ją "odmaskować"
# systemctl unmask hostapd
A potem nieco zmienić jej szablon. Edytujemy plik /lib/systemd/system/hostapd@.service. Trzeba zmienić linię
After=network.target
na
Before=network.target systemd-networkd.service
Dlaczego? Podczas testów okazało się, że hostapd musi wystartować zanim zostanie utworzony mostek sieciowy. Inaczej Access Point nie będzie prawidłowo działać. Dlatego należy powiedzieć systemd, że ta usługa musi być uruchomiona przed networkd. Na samym końcu włączamy usługę dla karty wlp2s0:
# systemctl enable hostapd@wlp2s0.service

Mostek sieciowy via networkd

Potem należy skonfigurować mostek sieciowy złożony z karty ethernet i WiFi.
Dokonasz tego przez networkd. Stwórz definicję mostka za pomocą nowego pliku konfiguracyjnego:

/etc/systemd/network/10-br0.netdev
[NetDev]
Name=br0
Kind=bridge
Następnie trzeba nieco zmienić konfigurację wlp2s0 i enp4s0 - usuń całą sekcję [Network]. Te pliki będą wyglądać poniżej. Zmień też ich nazwy tak, aby z przodu miały "21-"

/etc/systemd/network/21-wlp2s0.network
[Match]
Name=wlp2s0
[Link]
RequiredForOnline=no
[Network]
Bridge=br0

/etc/systemd/network/21-enp4s0.network
[Match]
Name=enp4s0
[Link]
RequiredForOnline=no
[Network]
Bridge=br0
Teraz trzeba nadać adres IP dla mostka - będzie to tak jak dla LAN adres bramy domyślnej.

/etc/systemd/network/bridged.network
[Match]
Name=br0
[Network]
#brama domyslna naszego LANu
Address=192.168.100.1
DNS=8.8.8.8

Poprawki w serwerze DHCP

Następnie ustaw serwer DHCP tak aby nasłuchiwał na mostku br0 - w pliku /etc/default/isc-dhcp-server linia odnosząca się do konfiguracji interfejsów dla IPv4 ma wyglądać tak:
INTERFACESv4="br0"

Reguły iptables

Do ostatecznego uruchomienia brakuje jeszcze puszczenia ruchu z wlp2s0 przez iptables:
sudo iptables -A INPUT -i wlp2s0 -j ACCEPT
sudo iptables -A FORWARD -i wlp2s0 -j ACCEPT
sudo sh -c '/sbin/iptables-save > /etc/iptables/rules.v4
Jeśli miałeś jakieś reguły ze starą nazwą wlan0, to zmień wszystkie jej wystąpienia na nową nazwę w pliku /etc/iptables/rules.v4
Po wszystkim jestem leniem i restartuję cały terminal. Alternatywnie:
systemctl restart hostapd@wlp2s0
systemctl restart systemd-networkd
systemctl restart isc-dhcp-server
Po wywołaniu networkctl powinna się pojawić lista podobna do tej:
IDX  LINK                TYPE     OPERATIONAL    SETUP
1    lo                  loopback carrier        unmanaged       
2    enp4s0              ether    enslaved       configured
3    wlp2s0              wlan     enslaved       configured
4    wwx582c80139263     wwan     carrier        configured
5    br0                 bridge   routable       configured
Udało mi się z sukcesem podłączyć z innego komputera zarówno przez ethernet jak i WiFi i uzyskać połączenie Internetowe.

Dostęp zdalny

Użyj ZeroTierOne. Instalację opisywałem w tym artykule. Zajrzyj do sekcji Usługa VLAN dla każdego, czyli ZeroTier One i postępuj zgodnie z instrukcjami. Jedyną różnicą będzie zmiana w regułach iptables. Zamiast enp4s0 należy użyć karty sieciowej z modemu USB, czyli całość będzie wyglądać tak:
#pierwsza reguła jest już w systemie - przy konfiguracji Internetu via LAN
sudo iptables -t nat -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
#następne są wymagane
sudo iptables -A FORWARD -i wwx582c80139263 -o zt+ -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i zt+ -o wwx582c80139263 -j ACCEPT
# zapisz poleceniem
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
Po wszystkim na lenia restart terminala.
Po przyłączeniu do VLANa będzie można uzyskać zdalny podgląd po adresie z sieci VLAN.

Gotowe!

To już wszystko w tej serii. Po wszystkim można zainstalować monitoring w miejscu docelowym!
Pytania? Zapraszam do dyskusji w komentarzach!

Komentarze

Popularne posty z tego bloga

[HowTo] Terminal (thin client) Dell Wyse D10D jako bramka VLAN

Xeon E3-1240v5 na chipsecie B150?

Monitoring z terminala Dell D10D - część I: dokładanie dysku, instalacja Debiana i niemiła niespodzianka