Wprowadzenie
Nasz system jest oparty na Android, który jest oparty na jądrze Linuksa. Jest to fajne, bo dzięki temu mamy możliwość uruchamiania aplikacji Android, jak i aplikacji konsolowych z systemu Linux.
Android używa nieco dziwnego systemu do izolowania aplikacji (od innych aplikacji) opartego na kontach użytkowników unix - czyli każda aplikacja ma osobnego użytkownika, który nie ma dostępu do danych innych aplikacji/użytkowników. Dodatkowo w jądro Android wbudowane są skomplikowane mechanizmy zabezpieczeń: SELinux (Linux o rozszerzonym bezpieczeństwie), zapora wbudowana w jądro (Linux kernel firewall) oraz polityki routing (policy routing).
Te wszystkie zabezpieczenia są ważne i przydatne, ale powodują też komplikację dla programistów i dla użytkowników. Np. nie możemy uruchomić usługi na porcie < 1024 (tak jak w każdym Linux-sie) bez uprawnień root. Większość standardowych usług sieciowych (HTTP, FTP, SSH, Telnet, HTTPS, POP, SMTP itp.) działa w tym niedostępnym dla zwykłego użytkownika zakresie.
Chcemy, żeby usługi działały z poziomu zwykłego użytkownika (nie z root), dlatego postanowiliśmy, że nasze usługi (HTTP, FTP, SSH, MQTT) będziemy uruchamiać na portach powyżej 1024.
Zaowocowało to takim efektem jak poniżej:
Usługi na bramce i ich porty
Nazwa | Protokół | Port | Komenda/URL | Opis |
---|---|---|---|---|
Aplikacja | http | 8180 |
http://ais-dom.local:8180 | serwer http |
FTP | ftp | 1024 |
ftp://ais-dom.local:1024 | serwer ftp |
SSH | ssh | 8022 |
ssh ais-dom -p 8022 |
serwer ssh |
MQTT | mqtt | 1883 |
mosquitto_sub -h ais-dom.local -t '#' |
serwer mqtt |
Nie ma z tym większych problemów poza tym, że jest to dziwne dla użytkowników (dlaczego trzeba wpisywać port???).
Może się też zdarzyć tak, że np. w jakiejś firmie SSH musi mieć port 22 z powodu lokalnej polityki bezpieczeństwa i ograniczeń zdefiniowanych w zaporze sieciowej.
Żeby zniwelować te powyższe “niedogodności” testujemy rozwiązanie oparte na mechanizmie iptables, który pozwoli nam uruchamiać usługi bez root a jednocześnie mieć je dostępne na standardowych portach, jeżeli testy się powiodą, to dostarczymy to w aktualizacji.
Nowe rozwiązanie
Krótka instrukcja jak włączyć przekierowanie portów na bramce - dla tych, którzy już dzisiaj chcieli by wypróbować jak to działa.
-
zaloguj się do bramki po SSH
ssh <lokalne-ip-bramki> -p 8022
-
otwórz do edycji plik .bash_profile
nano ~/.bash_profile
-
na końcu pliku dodaj takie wpisy
# call iptables
if ! su -c "/system/bin/iptables -L PREROUTING -t nat -n |grep -q 8022"; then
echo "Service SSH on port 22 and 8022"
su -c "/system/bin/iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 8022"
fi
if ! su -c "/system/bin/iptables -L PREROUTING -t nat -n |grep -q 8180"; then
echo "Service HTTP on port 80 and 8180"
su -c "/system/bin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8180"
fi
if ! su -c "/system/bin/iptables -L PREROUTING -t nat -n |grep -q 1024"; then
echo "Service FTP on port 21 and 1024"
su -c "/system/bin/iptables -t nat -A PREROUTING -p tcp --dport 21 -j REDIRECT --to-port 1024"
fi
- zapisz plik, wyjdź z konsoli ssh i zaloguj się do niej ponownie (żeby wczytać .bash_profile)
Efekt
Nie musimy już podawać portów
Nazwa | Protokół | Port | Komenda/URL | Opis |
---|---|---|---|---|
Aplikacja | http | 8180 / 80 |
http://ais-dom.local | serwer http |
FTP | ftp | 1024 / 21 |
ftp://ais-dom.local | serwer ftp |
SSH | ssh | 8022 / 22 |
ssh ais-dom |
serwer ssh |