Есть ли способ для некорневых процессов связываться с «привилегированными» портами в Linux? - PullRequest
353 голосов
/ 05 января 2009

Очень неприятно иметь такое ограничение на моем блоке разработки, когда не будет никаких пользователей, кроме меня.

Мне известны стандартные обходные пути , но никто из них не делает именно то, что я хочу:

  1. authbind (версия в тестировании Debian, 1.0, поддерживает только IPv4)
  2. Использование цели iptables REDIRECT для перенаправления низкого порта на высокий порт (таблица "nat" еще не реализована для ip6tables, версии iptables IPv6)
  3. sudo (Запуск от имени root - это то, чего я пытаюсь избежать)
  4. SELinux (или аналогичный). (Это всего лишь мой блок разработчика, я не хочу вводить много дополнительной сложности.)

Существует ли какая-либо простая переменная sysctl, позволяющая процессам без полномочий root связываться с "привилегированными" портами (портами менее 1024) в Linux, или мне просто не повезло?

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

Ответы [ 22 ]

1 голос
/ 20 февраля 2014

Поскольку OP - это просто разработка / тестирование, могут быть полезны менее изящные решения:

setcap может использоваться в интерпретаторе сценария для предоставления возможностей сценариям. Если setcaps для двоичного файла глобального интерпретатора неприемлемы, сделайте локальную копию двоичного файла (любой пользователь может) и получите root для setcap для этой копии. Python2 (по крайней мере) правильно работает с локальной копией интерпретатора в вашем дереве разработки скриптов. Нет необходимости в suid, чтобы пользователь root мог контролировать, к каким возможностям пользователи имеют доступ.

Если вам нужно отслеживать общесистемные обновления интерпретатора, используйте скрипт оболочки, как показано ниже:

#!/bin/sh
#
#  Watch for updates to the Python2 interpreter

PRG=python_net_raw
PRG_ORIG=/usr/bin/python2.7

cmp $PRG_ORIG $PRG || {
    echo ""
    echo "***** $PRG_ORIG has been updated *****"
    echo "Run the following commands to refresh $PRG:"
    echo ""
    echo "    $ cp $PRG_ORIG $PRG"
    echo "    # setcap cap_net_raw+ep $PRG"
    echo ""
    exit
}

./$PRG $*
0 голосов
/ 04 сентября 2015

Ответ на 2015 / сентябрь:

ip6tables теперь поддерживает IPV6 NAT: http://www.netfilter.org/projects/iptables/files/changes-iptables-1.4.17.txt

Вам понадобится ядро ​​3.7 +

Доказательство:

[09:09:23] root@X:~ ip6tables -t nat -vnL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REDIRECT   tcp      eth0   *       ::/0                 ::/0                 tcp dpt:80 redir ports 8080
    0     0 REDIRECT   tcp      eth0   *       ::/0                 ::/0                 tcp dpt:443 redir ports 1443

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 6148 packets, 534K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 6148 packets, 534K bytes)
 pkts bytes target     prot opt in     out     source               destination
...