Dlaczego porty usług działających na bramce są niestandardowe?

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 :slight_smile:

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
2 polubienia

po wpisaniu tego adresu z portem czy bez mam mam taki komunikat w sieci lokalnej

To czy zadziala Ci ais-dom.local zalezy od konfiguracji Twojego routera. To nie bramka odpowiada za to zeby ais-dom.local bylo tlumaczone na odpowiedni adres IP. Podobine ma sie sprawa z wszystkimi innymi urzadzeniami w Twojej sieci lokalnej

Ale jak wpisze bez .local to działa bez problemu więc można jakoś ustawić aby działał taki adres ?

Jak pisalem, wszystko zalezy od konfiguracji Twojego routera.