Як я можу відкрити порт 80, щоб некореневий процес міг пов'язуватися з ним?


46

Я хочу запустити веб-сервер на своєму Mac як позакореневий процес. Зазвичай тільки кореневі процеси можуть прив'язуватися до порту 80 (або до будь-якого порту нижче 1024).

Чи можу я відкрити порт 80 спеціально, щоб некористувальні процеси могли слухати його?



більше схоже на питання unix.stackexchange.com , чи не так?
Філіп Бартузі

1
чому unix, якщо він знаходиться в системі macos?
nhed

Відповіді:


28

Це складно зробити за допомогою дизайну, і якщо ви не маєте root доступу до своєї машини, жодне з наступних дій не працюватиме, оскільки вони потребують root для настройки змін. Однак, змінившись, користувальницькі програми матимуть доступ, не маючи root.

Є два загальних способи досягти цього, і який ви виберете, залежатиме від того, чому ви намагаєтеся обійти обмеження:

Вкажіть порт 80 на інший порт, наприклад 8080

Переконфігурувавши свою машину для передачі всього трафіку порту 80 до порту 8080 або будь-якого порту, який ви обрали, ви можете дозволити серверам простору користувачів отримувати порти привілеїв кореня в тій області, до якої їм надано доступ.

Процес простий:

Крок 1. Перегляд поточних правил брандмауера.

sudo ipfw show

Крок 2. Додайте правило переадресації портів (від 80 до 8080)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

Якщо ви хочете видалити правила брандмауера:

sudo ipfw рум'янець

( джерело )

Це тимчасова зміна, і вона відновиться, коли ви перезавантажитеся або розминете, як зазначено в останньому рядку.

Ви можете зробити зміни постійними , або ви можете додати команду як рядок запуску до запуску сервера, що, ймовірно, безпечніше з точки зору безпеки.

Використовуйте функцію Authbind

Authbind був розроблений спеціально, щоб дозволити одній програмі отримати доступ до портів нижчого рівня, не надаючи їй повного кореневого доступу.

Є порт OS X:

https://github.com/Castaglia/MacOSX-authbind

Він все ще може бути обмежений трафіком IPv4, однак, можливо, доведеться провести додаткове розслідування, щоб виявити, чи відповідає він вашим потребам.


LOVE MacOSX-authbind ... Він дозволяє запускати, наприклад, веб-сервер на порт 80 - як "звичайний адміністратор". тобто у вашому launchd .plist... ` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]Woohoo!
алекс сірий

13
OS X Yosemite видаляється ipfw. Ця суть описує альтернативне рішення з використанням pf.
lyschoening

Зауважте, що перенаправлення трафіку на непривілейований порт може бути небезпечним, якщо ви перебуваєте у спільному середовищі; інший процес може прив’язатись до цього порту до того, як ваша програма зробить або якщо ваша програма навіть миттєво від’єднає порт для швидкого перезапуску.
Лежати Райан

authbind ist дійсно чудове рішення, дякую!
favo

7

Ви можете використовувати ncatдля переадресації трафіку з веб-сервера, який працює на якомусь іншому порту:

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

Це переадресує трафік через порт 80 до localhost: 1234. Це трохи неприємно, однак я б не використовував його ніде, крім швидкого тестування і, безумовно, не у виробництві.

Зауважте, що це не дозволить некореневому процесу прив’язатись до нього, але, вибравши порт, на який процес може пов'язуватися, 1234 у цьому прикладі, він буде виглядати так, що він пов'язаний з портом 80. Це робить еквівалент порт 80 для переадресації на порт 1234 з брандмауером, але на набагато більш тимчасовій основі.


2
Це хороший спосіб вирішення. NB. ncatпоставляється з nmapяким можна встановити через порти Mac sudo port install nmap. Сам MacPorts можна встановити з macports.org/install.php .
Вільям Денніс

Це просто дає мені bind: address вже в помилках використання.
Метт Столяр

Тут же - не вийшло. Це зробило трюк: unix.stackexchange.com/a/187038
Себастьян Дж.

2

Ви також можете використовувати ssh для переадресації портів. Отже, якщо у вас працює сервер на 8080, ви можете переадресовувати трафік з порту 80. Ось сценарій, який я використовую, який зупиняє нативні апачі, якщо він працює і пересилає трафік:

forward8080to80.command:

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh user@127.0.0.1 -L 80:127.0.0.1:8080

Переадресація Ssh-портів може мати досить низьку ефективність, а функції безпеки не мають великого сенсу в локальному> локальному середовищі. Краще використовувати вбудовані ОСX для переадресації портів або щось на зразок ncat.
Shayne

-3

Що ви повинні зробити, це відкрити порт 80 на маршрутизаторі та вказати його на локальну IP-адресу вашого веб-сервера. Потім на своєму Mac увімкніть Веб-обмін на панелі системних налаштувань> Налаштування параметрів спільного доступу та вкажіть його на вибраний каталог. Це працювало для мене раніше, поки не перейшов на сервер 10.6.


1
Я шукаю це як рішення для власної машини для розробників. Оскільки мені доводиться працювати в місцях, де я не маю контролю над маршрутизатором, це рішення не могло працювати для мене. Я підозрюю, що це має спрацювати, якщо ви налаштовуєте сервер і чомусь не маєте кореневого доступу.
Авнер

Отже, щоб зрозуміти, ви намагаєтеся налаштувати веб-сервер на різних клієнтських сайтах, але не маєте доступу до відкритого порту 80? Як ви відкриєте порт на маршрутизаторі, якщо у вас немає доступу? Я правильно розумію чи я відхиляюся від бази?
Метт Любов

Я просто намагаюся використовувати порт 80 на своїй машині розробки, а не на виробничому сервері. Я все-таки розгортаюсь на герою.
Авнер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.