Как я могу открыть порт 80, чтобы процесс без полномочий root мог с ним связываться?

46

Я хочу запустить веб-сервер на моем Mac как процесс без полномочий root. Обычно только корневые процессы могут связываться с портом 80 (или любым портом ниже 1024).

Могу ли я открыть порт 80 специально, чтобы процессы без полномочий root могли прослушивать его?

Авнер
источник
Связанный: ссылка 1 , ссылка 2
Натан Фаррингтон
больше похоже на вопрос unix.stackexchange.com , не так ли?
Филипп Бартузи
1
почему Unix, если это в системе MacOS?
15:24

Ответы:

28

Это сложно сделать по своему замыслу, и если у вас нет 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 flush

( источник )

Это временное изменение, и оно вернется после перезагрузки или сброса, как указано в последней строке.

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

Использовать Authbind

Authbind был разработан специально для того, чтобы разрешить одной программе доступ к портам более низкого уровня, не предоставляя ей полный root-доступ.

Существует порт MacOSX:

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.
Лихоение
Обратите внимание, что перенаправление трафика на непривилегированный порт может быть небезопасным, если вы находитесь в общей среде; другой процесс может связываться с этим портом раньше, чем ваша программа, или если ваша программа даже мгновенно отсоединяет порт для быстрого перезапуска.
Ли Райан
authbind - действительно отличное решение, спасибо!
фаворитом
7

Вы можете использовать ncatдля пересылки трафика с веб-сервера, работающего на другом порту:

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

Это перенаправит трафик через порт 80 на локальный хост: 1234. Однако, это немного круто, я бы не стал использовать его нигде, кроме быстрого тестирования и определенно не в производстве.

Обратите внимание, что это не позволит процессу без полномочий root связываться с ним, но, выбрав порт, с которым процесс может связываться, 1234 в этом примере, он будет выглядеть так, как будто он связан с портом 80. Это делает эквивалент переадресация порта 80 на порт 1234 с брандмауэром, но на гораздо более временной основе.

Мэтью Холл
источник
2
Это хороший обходной путь. NB. ncatпоставляется с nmapкоторым можно установить через порты Mac с sudo port install nmap. Сам MacPorts можно установить с macports.org/install.php .
Уильям Деннис
Это просто дает мне привязку: адрес уже используется ошибки.
Мэтт Столяр
То же самое здесь - не работает. Это сработало
Себастьян Дж.
2

Вы также можете использовать ssh для переадресации портов. Поэтому, если у вас сервер, работающий на 8080, вы можете перенаправлять трафик с порта 80. Вот скрипт, который я использую, который останавливает собственный Apache, если он работает, и перенаправляет трафик:

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
bdombro
источник
Переадресация Ssh-порта может иметь довольно низкую производительность, а функции безопасности не имеют большого смысла в локальной и локальной среде. Лучше использовать встроенную в OSX переадресацию портов или что-то вроде ncat.
Шейн
-3

То, что вы должны сделать, это открыть порт 80 на вашем маршрутизаторе и указать его на локальный IP-адрес вашего веб-сервера. Затем на вашем Mac включите общий доступ к Интернету в разделе «Системные настройки»> «Настройки общего доступа» и укажите его в каталоге по вашему выбору. Это работало для меня в прошлом, пока не переключился на 10.6 Server.

Мэтт Лав
источник
1
Я ищу это как решение для моей собственной машины разработчика. Поскольку мне приходится работать в местах, где у меня нет контроля над маршрутизатором, это решение не может работать для меня. Я подозреваю, что это должно работать, если вы настраиваете сервер и по какой-то причине не имеете root-доступа.
Авнер
Итак, для ясности, вы пытаетесь настроить веб-сервер на разных клиентских сайтах, но у вас нет доступа к открытому порту 80? Как вы откроете порт на маршрутизаторе, если у вас нет доступа? Я правильно понимаю, или я далеко от базы?
Мэтт Лав
Я просто пытаюсь использовать порт 80 на своей собственной машине разработки, а не на производственном сервере. Я все равно разверну на героку.
Авнер