Konfiguruję serwer WWW oparty na Pythonie na moim pudełku Debiana.
Ustawiać:
- Debian OS jest oparty na VM, ale zmieniłem VirtualBox z NAT na Bridged.
- Adres IP konfiguracji maszyny wirtualnej =
192.168.1.7
(na ekranie administratora mojego routera lubifconfig
). - Udało mi się skonfigurować przekierowanie portów routera zarówno dla ssh, jak i HTTP.
- Pomyślnie skonfigurowałem dynamiczne dny routera za pomocą dyndns.com.
Niezależnie od konkretnego serwera Python, którego używam (Django, CherryPy, biblioteka standardowa), muszę uruchomić serwer przy użyciu 192.168.1.7:80 sudo
. W przeciwnym razie pojawia się błąd dotyczący braku uprawnień dostępu do portu. Żaden z samouczków serwera WWW nie wspomina o konieczności użycia sudo
podczas określania portu ip:.
Pytanie: dlaczego muszę używać sudo
do uruchamiania tych serwerów? Czy to wskazówka, że nie powinienem używać 192.168.1.7
? A może gdzieś nie ustawiam poprawnie pliku konfiguracyjnego?
linux
networking
sudo
Begbie00
źródło
źródło
Standardowe zachowanie polega na tym, że użytkownicy nieuprzywilejowani nie mogą łączyć się z portami uprzywilejowanymi (numery portów poniżej 1024). Dlatego aplikacja, która chciałaby powiązać na przykład z portem 80, będzie musiała uruchomić się uprzywilejowanym (zwykle oznacza to uruchomienie jako root), aby połączyć się z tym portem.
Powszechnym podejściem jest uruchamianie małego procesu „nasłuchiwania” z uprzywilejowanym użytkownikiem, który akceptuje połączenie, a następnie uruchamia nieuprzywilejowany proces do obsługi żądania. Usunięcie uprawnień do przetwarzania żądań odbywa się ze względów bezpieczeństwa. Jeśli ktoś jest w stanie wykorzystać proces, który obsługuje żądanie, zwykle pozwala intruzowi na wykonywanie poleceń przy użyciu tych samych uprawnień, co proces przetwarzania. Dlatego źle byłoby obsłużyć całe żądanie za pomocą uprzywilejowanego procesu.
Jednak w wielu aplikacjach często jest obecnie uruchamiany jako użytkownik inny niż root; ale takie procesy oczywiście nie mogą łączyć się z uprzywilejowanymi portami niż w standardowej konfiguracji. Tak więc serwery takie jak Tomcat lub JBoss łączyły się z portami wysokoportowymi, takimi jak 8080, więc nie potrzebują uprzywilejowanego odbiornika.
Oczywiście, jeśli udostępnisz taki proces w Internecie, prawdopodobnie zapewnisz dostęp do portu 80, ponieważ każda przeglądarka najpierw spróbuje połączyć się z portem 80, gdy używany jest protokół HTTP. W celu obejścia tego problemu często stosuje się zaporę ogniową lub translator portów między aplikacją a publicznym Internetem. Więc żądania trafiają do zapory żądającej portu 80, ale zapora przekazuje żądanie do jakiegoś wewnętrznego hosta na porcie 8080. W ten sposób prawdziwy serwer WWW może działać na wysokich portach, będąc publicznie dostępnym na porcie 80.
Czasami to przekierowanie odbywa się po prostu przy użyciu
iptables
reguły NAT:Pozwala to na uruchomienie nieuprzywilejowanej aplikacji nasłuchującej na porcie 8080, podczas gdy wszystkie przychodzące żądania dla portu 80 są po prostu przekierowywane na port 8080.
Jednak przy użyciu nowoczesnych jąder Linuksa istnieje jeszcze jedna możliwość: Użyj możliwości.
Umożliwiłoby
binary
to powiązanie z uprzywilejowanymi portami, nawet jeśli uruchomiono je jako użytkownik inny niż root. Zobaczman capabilities
po więcej szczegółów.źródło