Назад | Перейти на главную страницу

Привязка к портам меньше 1024 без корневого доступа

Я хотел бы запускать приложения, над которыми я работаю, которые привязываются к номерам портов меньше 1000, не требуя корневого доступа.

Я использую Linux Mint и имею root-доступ для его настройки. В идеале я хотел бы иметь возможность делать это через SSH.

Также рад услышать, если это невозможно или я не должен этого делать, если это так.

РЕДАКТИРОВАТЬ: В основном я счастлив использовать более высокие номера портов для разработки, но Flash ожидает политику сокетов на порту 843. В настоящее время мне нужно запустить приложение как root, и поэтому я не могу запустить его из моего Makefile, который является PITA .

Конечно, это возможно. Вам нужно только предоставить двоичный CAP_NET_BIND_SERVICE.

sudo setcap cap_net_bind_service=ep some-binary

В Linux возможности root разбиты на набор возможностей. CAP_NET_BIND_SERVICE - это возможность привязки к портам <= 1024.

Вероятно, даже можно использовать AppArmor, SELinux или другой модуль безопасности Linux (LSM), чтобы предоставить программе доступ для привязки именно этого одного порта, но я думаю, что это будет пустой тратой времени. Безопасность на самом деле не зависит от номеров портов, как это было в далеком прошлом.

Вот сценарий для OSX для перенаправления портов 80 и 443 на непривилегированные порты:

echo " 
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -

Другой способ заставить ваш демон отвечать на запросы с меньшего номера порта - использовать iptables или аналогичный для перенаправления порта с меньшим номером на порт с более высоким номером, который слушает ваш демон:

sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

Замените 80 на порт, который нужно открыть, а 8080 на порт прослушивателя вашего приложения.

Я думаю, что есть способ сделать это, но я не уверен на 100%, что это сработает.

это привязка порта, для которого требуется root, а не приложение, использующее его, поэтому приведенный ниже метод может работать, но вам в первую очередь нужен доступ sudo.

Сначала вы запускаете свой процесс как пользователь root, используя sudo myAppПосле привязки порта вы можете переключить владельца процесса на непривилегированного пользователя.

Я смутно помню библиотеку под названием «authbind», которая делает то, что вам нужно, обертывая системный вызов bind () (через библиотеку LD_PRELOAD) и, если запрашивается привилегированный порт, порождает корневую программу setuid, которая получает копию дескриптор файла, затем проверяет, действительно ли приложению разрешено связываться с портом, выполняет bind () и завершает работу.

Не уверен в статусе проекта, но метод должен быть довольно простым для (повторного) внедрения, если потребуется.