문제

그것은 매우 성가가 이것에 대한 제한 내 개발란이 있을 때는 일은 결코 없을 것 어떤 사용자가 다른 나보다.

나는 알 표준 방법, 하지만 그들의 아무도 정확히 무엇을 원하는:

  1. authbind (버전에서 데비안 테스트,1.0,만 지원하는 IPv4)
  2. 사용 iptables 리디렉션 대상으로 리디렉션하려면 낮은 포트를 고 포트 (이하"nat"테이블이 아직 구현되지 않았을 위한 ip6tables,IPv6 버전의 iptables)
  3. sudo(로 실행되는 루트에는 내가 무엇을 피하려고)
  4. SELinux(또는 이와 유사한).(이것은 단지 내 dev 상자,나는 원하지 않을 소개하는 많은 추가 복잡합니다.)

은 거기에 몇 가지 간단한 sysctl 변수 allow non-root 프로세스에 바인딩하는"권한"포트(포트 1024 미만)리눅스에서,또는 나는 단지 운?

편집:어떤 경우에,당신은 당신할 수 있는 용 기능 니다.

도움이 되었습니까?

해결책

좋아, 기능 시스템을 지적한 사람들과 CAP_NET_BIND_SERVICE 능력. 최근 커널이있는 경우 실제로 서비스를 뿌리가 아닌 서비스로 시작하지만 낮은 포트를 바인딩하는 데 사용하는 것이 실제로 가능합니다. 짧은 대답은 당신이하는 것입니다.

setcap 'cap_net_bind_service=+ep' /path/to/program

그리고 언제든지 program 그 후에 실행됩니다 CAP_NET_BIND_SERVICE 능력. setcap 데비안 패키지에 있습니다 libcap2-bin.

이제 경고를 위해 :

  1. 최소 2.6.24 커널이 필요합니다
  2. 파일이 스크립트 인 경우 작동하지 않습니다. (즉, #! 라인을 사용하여 통역사를 시작합니다). 이 경우 이해하는 한, 해당 통역사를 사용하는 모든 프로그램에 능력이 있기 때문에 통역사 실행 파일 자체에 기능을 적용해야합니다. 이 문제를 해결하는 깨끗하고 쉬운 방법을 찾을 수 없었습니다.
  3. Linux는 LD_Library_Path를 비활성화합니다 program 그것은 특권이 높아졌습니다 setcap 또는 suid. 그래서 당신의 경우 program 자체를 사용합니다 .../lib/, 포트 전달과 같은 다른 옵션을 살펴 봐야 할 수도 있습니다.

자원:

메모: Rhel은 처음으로 V6에 추가했습니다.

다른 팁

표준 방법은 그들이 "setuid"로 만들어 근절으로 시작하고, 포트에 묶인 즉시 그 루트 권한을 버리기 전에, 그들은 연결을 수락하기 전에 그 루트 권한을 버리는 것입니다. Apache 및 Inn의 소스 코드에서 좋은 예를 볼 수 있습니다. LightTPD가 또 다른 좋은 예라고 들었습니다.

또 다른 예는 파이프를 통해 통신하는 여러 데몬을 사용하는 Postfix이며, 그중 하나 또는 두 개만 (수락 또는 방출 바이트를 제외하고는 거의하지 않음)는 루트로 실행되며 나머지는 더 낮은 특권에서 실행됩니다.

포트 리디렉션을 수행 할 수 있습니다. 이것이 내가 Linux 상자에서 실행되는 Silverlight 정책 서버를 위해하는 일입니다.

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300

로컬 SSH 터널을 설정할 수 있습니다. 예를 들어 포트 80이 앱을 3000으로 묶으려면 :

sudo ssh $USERNAME@localhost -L 80:localhost:3000 -N

이는 스크립트 서버 작업과 매우 간단한 이점이 있습니다.

또는 커널을 패치하고 수표를 제거하십시오.

(최후의 수단 옵션, 권장되지 않음).

~ 안에 net/ipv4/af_inet.c, 읽은 두 줄을 제거하십시오

      if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
              goto out;

그리고 커널은 더 이상 권한있는 포트를 확인하지 않습니다.

파일의 기능에 이상적이지 않은,그들이 할 수 있기 때문에 휴식 패키지를 업데이트합니다.

는 이상적인 솔루션,이럴 있어야 만들 수 있는 능력을 가진 포탄는 상속할 CAP_NET_BIND_SERVICE 설정합니다.

여기에는 다소 복잡한 방법으로 이렇게하려면:

sg $DAEMONUSER "capsh --keep=1 --uid=`id -u $DAEMONUSER` \
     --caps='cap_net_bind_service+pei' -- \
     YOUR_COMMAND_GOES_HERE"

capsh 유틸리티에서 찾을 수 있습 libcap2-bin 패키지에서 Debian/Ubuntu 배포가 들어 있습니다.여기에 간다:

  • sg 변화 효과적인 그룹 ID 하는 데몬을 사용자.이 필요하기 때문에 capsh 잎 GID 를 변경되지 않은 그리고 우리는 확실히 원하지 않습니다.
  • 설정합 비트를'유지 능력에 UID 를 변경'.
  • 변화하는 UID $DAEMONUSER
  • 모든 모자(이 순간 모두는 여전히 존재하기 때문에 --keep=1)를 제외하고,상속가능 cap_net_bind_service
  • 실행하는 명령('--은'분리기)

결과는 과정으로 지정한 사용자와 그룹 cap_net_bind_service 권한이 있습니다.

예를 들어,라인에서 ejabberd 시작 스크립트:

sg $EJABBERDUSER "capsh --keep=1 --uid=`id -u $EJABBERDUSER` --caps='cap_net_bind_service+pei' -- $EJABBERD --noshell -detached"

다른 두 가지 간단한 가능성 :

"낮은 포트에 묶인 데몬과 손이 데몬에 컨트롤하는 데몬"에 대한 오래된 (유행이없는) 솔루션이 있습니다. inetd (또는 xinetd)라고합니다. 단점은 다음과 같습니다.

  • 데몬은 stdin/stdout에 대해 이야기해야합니다 (데몬을 제어하지 않으면 소스가 없다면 일부 서비스는 inetd- 호환성 플래그를 가질 수 있지만 이것은 아마도 Showstopper 일 것입니다).
  • 모든 연결에 대한 새로운 데몬 프로세스가 포장됩니다
  • 체인의 추가 링크입니다

장점 :

  • 모든 오래된 유닉스에서 사용할 수 있습니다
  • Sysadmin이 구성을 설정 한 후에는 개발에 참여하는 것이 좋습니다 (데몬을 다시 만들 때 Setcap 기능을 잃을 수 있습니까? 그리고 관리자에게 다시 가야합니다. . ")
  • 데몬은 그 네트워킹에 대해 걱정할 필요가 없습니다.
  • 요청대로 뿌리가 아닌 사용자로 데몬을 실행하도록 구성 할 수 있습니다.

또 다른 대안 : 해킹 된 프록시 (Netcat 또는 심지어 뭔가 더 강력합니다) 권한있는 포트에서 대상 데몬을 실행할 수있는 임의의 높은 수준의 포트로. (NetCat은 분명히 생산 솔루션이 아니라 "내 Dev Box"입니다.) 이렇게하면 서버의 네트워크 활용 가능한 버전을 계속 사용할 수 있습니다. 루트/sudo 만 프록시 (부팅시)를 시작하기 위해서만 복잡한/잠재적으로 깨지기 쉬운 기능에 의존하지 않습니다.

"표준 해결 방법"은 Socat을 사용자 공간 리디렉터로 사용합니다.

socat tcp6-listen:80,fork tcp6:8080

이것이 확장되지 않을 것이라는 점을 고려하십시오. 포킹은 비싸지 만 Socat의 작동 방식입니다.

업데이트 2017 :

사용 인증


CAP_NET_BIND_SERVICE 또는 사용자 정의 커널보다 훨씬 낫습니다.

  • CAP_NET_BIND_SERVICE는 바이너리에 대한 신뢰를 부여하지만 포트 당 액세스를 제어 할 수는 없습니다.
  • Authbind는 사용자/그룹에 대한 신뢰를 부여하고 포트 당 액세스에 대한 제어를 제공하며 IPv4 및 IPv6을 모두 지원합니다 (IPv6 지원이 늦게 추가되었습니다).

    1. 설치: apt-get install authbind

    2. 모든 사용자 및 그룹에 대한 관련 포트 (예 : 80 및 443에 대한 액세스)를 구성하십시오.

      sudo touch/etc/authbind/byport/80
      sudo touch/etc/authbind/byport/443
      Sudo Chmod 777/etc/authbind/byport/80
      Sudo Chmod 777/etc/authbind/byport/443

    3. 귀하의 명령을 통해 실행하십시오 authbind
      (선택적으로 지정 --deep 또는 기타 인수, Man Page 참조) :

      authbind --deep /path/to/binary command line args
      

      예를 들어

      authbind --deep java -jar SomeServer.jar
      

조슈아의 멋진 후속 조치로 (당신이하는 일을 모르는 경우에 권장하지 않음) 추천 커널을 해킹 할 것을 권장합니다.

처음 게시했습니다 여기.

단순한. 정상 또는 오래된 커널을 사용하면 그렇지 않습니다.
다른 사람들이 지적한 바와 같이, iptables는 포트를 전달할 수 있습니다.
다른 사람들이 지적했듯이 CAP_NET_BIND_SERVICE도 작업을 수행 할 수 있습니다.
물론 CAP_NET_BIND_SERVICE는 스크립트에서 프로그램을 시작하면 실패합니다. 쉘 통역사에 캡을 설정하지 않는 한 무의미한 경우 루트로 서비스를 실행할 수 있습니다 ...
예 : Java의 경우 Java JVM에 적용해야합니다.

sudo /sbin/setcap 'cap_net_bind_service=ep' /usr/lib/jvm/java-8-openjdk/jre/bin/java

분명히, 이는 모든 Java 프로그램이 시스템 포트를 바인딩 할 수 있음을 의미합니다.
모노/.NET를위한 DITO.

나는 또한 Xinetd가 최고의 아이디어가 아니라고 확신합니다.
그러나 두 방법 모두 해킹이므로 제한을 들어 올려 한도를 높이 지 않겠습니까?
아무도 정상적인 커널을 실행해야한다고 말하지 않았으므로 자신만의 실행할 수 있습니다.

최신 커널 (또는 현재 가지고있는 것과 동일)에 대한 소스를 다운로드합니다. 그 후, 당신은 다음으로갑니다.

/usr/src/linux-<version_number>/include/net/sock.h:

거기 에서이 줄을 찾습니다

/* Sockets 0-1023 can't be bound to unless you are superuser */
#define PROT_SOCK       1024

그리고 그것을 변경하십시오

#define PROT_SOCK 0

불안한 SSH 상황을 원하지 않으면이를 변경합니다. #Define Prot_Sock 24

일반적으로 필요한 가장 낮은 설정, 예를 들어 HTTP의 경우 79 또는 포트 25에서 SMTP를 사용할 때 24를 사용합니다.

그게 이미 전부입니다.
커널을 컴파일하고 설치하십시오.
재부팅.
완성 - 그 바보 같은 한계는 사라지고 스크립트에도 효과적입니다.

커널을 컴파일하는 방법은 다음과 같습니다.

https://help.ubuntu.com/community/kernel/compile

# You can get the kernel-source via package linux-source, no manual download required
apt-get install linux-source fakeroot

mkdir ~/src
cd ~/src
tar xjvf /usr/src/linux-source-<version>.tar.bz2
cd linux-source-<version>

# Apply the changes to PROT_SOCK define in /include/net/sock.h

# Copy the kernel config file you are currently using
cp -vi /boot/config-`uname -r` .config

# Install ncurses libary, if you want to run menuconfig
apt-get install libncurses5 libncurses5-dev

# Run menuconfig (optional)
make menuconfig

# Define the number of threads you wanna use when compiling (should be <number CPU cores> - 1), e.g. for quad-core
export CONCURRENCY_LEVEL=3
# Now compile the custom kernel
fakeroot make-kpkg --initrd --append-to-version=custom kernel-image kernel-headers

# And wait a long long time

cd ..

간단히 말해서, 안전을 유지하려면 iptables를 사용하고,이 제한이 다시는 귀찮게하지 않으려면 커널을 컴파일하십시오.

Linux가 지원합니다 기능 "이 응용 프로그램은 루트로 실행"하는 것보다 더 세밀한 권한을 지원합니다. 이러한 기능 중 하나는입니다 CAP_NET_BIND_SERVICE 그것은 특권 포트에 바인딩하는 것입니다 (<1024).

불행히도 나는 응용 프로그램을 뿌리를 내리지 않고 응용 프로그램을 실행하는 방법을 모르겠습니다. CAP_NET_BIND_SERVICE (아마도 사용 setcap, 그러나이를위한 기존 솔루션이 있어야합니다).

나는 이것이 오래된 질문이라는 것을 알고 있지만, 이제는 최근 (> = 4.3) 커널을 사용하면 마침내이 주변 기능에 대한 좋은 답변이 있습니다.

빠른 답변은 Libcap의 최신 (예고없는) 버전의 사본을 가져 오는 것입니다. git에서 그리고 그것을 컴파일하십시오. 결과를 복사하십시오 progs/capsh 이진 어딘가 (/usr/local/bin 좋은 선택입니다). 그런 다음 루트로 프로그램을 시작하십시오

/usr/local/bin/capsh --keep=1 --user='your-service-user-name' \
    --inh='cap_net_bind_service' --addamb='cap_net_bind_service' \ 
    -- -c 'your-program'

순서대로 우리는입니다

  • 사용자를 전환 할 때 현재 기능 세트를 유지하고 싶다고 선언합니다.
  • 사용자 및 그룹 전환 '귀하의 서비스 사용자 이름'으로 전환
  • 추가 cap_net_bind_service 상속 및 주변 세트에 대한 기능
  • 분기 bash -c 'your-command' (부터 capsh 이후의 인수로 자동으로 강타를 시작합니다 --)

여기에는 후드 아래에 많은 일이 일어나고 있습니다.

첫째, 우리는 루트로 실행되므로 기본적으로 전체 기능 세트를 얻습니다. 여기에는 UID & GID를 setuid 그리고 setgid SyScalls. 그러나 일반적으로 프로그램이이를 수행 할 때는 일련의 기능을 잃습니다. 이것은 루트를 떨어 뜨리는 오래된 방법입니다. setuid 여전히 작동합니다. 그만큼 --keep=1 깃발이 말한다 capsh 발행 prctl(PR_SET_KEEPCAPS) SYSCALL은 사용자를 변경할 때 기능 삭제를 비활성화합니다. 사용자의 실제 변경 capsh 그와 함께 발생합니다 --user 깃발 setuid 그리고 setgid.

우리가 해결해야 할 다음 문제는 다음과 같은 방식으로 기능을 설정하는 방법입니다. exec 우리 아이들. 기능 시스템은 항상 '상속 된'기능 세트를 가지고 있었는데,이 기능은 "Execve (2)에 걸쳐 보존 된 일련의 기능 세트"입니다.기능 (7)]. 이것이 우리의 문제를 해결하는 것처럼 들리는 동안 cap_net_bind_service 상속받을 수있는 기능, 맞습니까?), 이것은 실제로 특권 프로세스에만 적용됩니다. 우리는 이미 사용자를 변경했기 때문에 더 이상 특권이 없습니다 ( --user 깃발).

새로운 주변 기능 세트는이 문제를 중심으로 작동합니다. "특권이없는 프로그램의 실행 (2)에 걸쳐 보존 된 일련의 기능입니다. 넣어 cap_net_bind_service 주변 세트에서 언제 capsh Exec의 서버 프로그램 인 우리의 프로그램은이 기능을 상속하고 청취자가 낮은 포트에 바인딩 할 수 있습니다.

더 많은 것을 배우고 싶다면 능력이 있습니다 수동 페이지 이것을 자세히 설명합니다. 달리기 capsh ~을 통해 strace 또한 매우 유익합니다!

tldr : "답"(내가 보는 것처럼)의 경우,이 답변에서 >> tldr << 부분으로 넘어갑니다.

좋아, 나는 그것을 알아 냈다 (이번에는 이번에는),이 질문에 대한 답은 내 대답은 또한 홍보에 대해 사과하는 방법이다. 또 다른 대답 (여기와 트위터에서) 나는 "최고"라고 생각했지만 그것을 시도한 후에 나는 그것에 대해 착각했다는 것을 발견했습니다. 내 실수로부터 배우십시오. 아이들 : 실제로 직접 시도 할 때까지 무언가를 홍보하지 마십시오!

다시, 나는 여기서 모든 답변을 검토했습니다. 난 노력 했어 약간 그들 중 (그리고 단순히 솔루션을 좋아하지 않았기 때문에 다른 사람을 시도하지 않기로 선택했습니다). 솔루션은 사용하는 것이라고 생각했습니다 systemd 그것으로 Capabilities= 그리고 CapabilitiesBindingSet= 설정. 한동안 이것으로 씨름 한 후, 나는 이것이 해결책이 아니라는 것을 알았습니다. 왜냐하면:

기능은 루트 프로세스를 제한하기위한 것입니다!

OP가 현명하게 언급했듯이 언제나 그것을 피하는 것이 가장 좋습니다 (가능하면 모든 데몬을 위해!).

기능 관련 옵션을 사용할 수 없습니다 User= 그리고 Group= 안에 systemd 기능이기 때문에 단위 파일 언제나 언제 재설정하십시오 execev (또는 함수가 무엇이든) 호출됩니다. 다시 말해, 언제 systemd 포크와 파름을 떨어 뜨리면 기능이 재설정됩니다. 이 주위에는 방법이 없으며 커널의 모든 바인딩 로직은 기능이 아닌 UID = 0 주위에 기본입니다. 이것은 기능 이이 질문에 대한 정답이 될 것 같지 않다는 것을 의미합니다 (적어도 언제라도 곧). 우연히 setcap, 다른 사람들이 언급했듯이 해결책이 아닙니다. 그것은 나를 위해 작동하지 않았고, 스크립트와 잘 작동하지 않으며, 파일이 변경 될 때마다 어쨌든 재설정됩니다.

나의 빈약 한 방어에서, 나는 (내가 지금 삭제 한 의견에서), James '라고 진술했다. iptables 제안 (OP가 언급 한)은 "두 번째 최고의 솔루션"이었습니다. :-피

>> tldr <

해결책은 결합하는 것입니다 systemd 날개와 함께 iptables 이와 같은 명령 (Dnschain에서 가져 왔습니다):

[Unit]
Description=dnschain
After=network.target
Wants=namecoin.service

[Service]
ExecStart=/usr/local/bin/dnschain
Environment=DNSCHAIN_SYSD_VER=0.0.1
PermissionsStartOnly=true
ExecStartPre=/sbin/sysctl -w net.ipv4.ip_forward=1
ExecStartPre=-/sbin/iptables -D INPUT -p udp --dport 5333 -j ACCEPT
ExecStartPre=-/sbin/iptables -t nat -D PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
ExecStartPre=/sbin/iptables -A INPUT -p udp --dport 5333 -j ACCEPT
ExecStartPre=/sbin/iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
ExecStopPost=/sbin/iptables -D INPUT -p udp --dport 5333 -j ACCEPT
ExecStopPost=/sbin/iptables -t nat -D PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
User=dns
Group=dns
Restart=always
RestartSec=5
WorkingDirectory=/home/dns
PrivateTmp=true
NoNewPrivileges=true
ReadOnlyDirectories=/etc

# Unfortunately, capabilities are basically worthless because they're designed to restrict root daemons. Instead, we use iptables to listen on privileged ports.
# Capabilities=cap_net_bind_service+pei
# SecureBits=keep-caps

[Install]
WantedBy=multi-user.target

여기서 우리는 다음을 달성합니다.

  • 데몬은 5333을 듣지만 53 번의 연결이 성공적으로 받아 들여집니다. iptables
  • 우리는 단위 파일 자체에 명령을 포함시킬 수 있으므로 사람들이 두통을 저장합니다. systemd 방화벽 규칙을 정리하여 데몬이 실행되지 않을 때 제거해야합니다.
  • 우리는 뿌리로 결코 달리지 않으며, 특권 에스컬레이션을 불가능하게 만듭니다 (적어도 systemd 클레임)), 아마도 데몬이 손상되어 설정하더라도 uid=0.

iptables 불행히도 여전히 추악하고 사용하기 어려운 유틸리티입니다. 데몬이 듣고 있다면 eth0:0 대신에 eth0, 예를 들어 명령은입니다 약간 다른.

시스템 특정 기능을 갖춘 데몬을 시작할 수있는 옵션이있는 Sysvinit 교체품입니다. 옵션 기능 =, capabilityboundingset = in Systemd.exec (5) 인력.

포트 리디렉션은 우리에게 가장 의미가 있었지만, 응용 프로그램이 다시 라우팅 해야하는 URL을 로컬로 해결할 문제가 발생했습니다. (그것은 당신을 의미합니다 떠들썩한 모임).

또한 로컬 컴퓨터의 URL에 액세스 할 때 리디렉션 할 수 있습니다.

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

어떤 이유로 든 sysctl net.ipv4.ip_unprivileged_port_start를 필요한 값으로 낮추는 것에 대해 아무도 언급하지 않습니다. 예 : 앱을 443 포트에 바인딩해야합니다.

sysctl net.ipv4.ip_unprivileged_port_start=443

어떤 사람들은 잠재적 인 보안 문제가 있다고 말할 수도 있습니다. 그러나 다른 포트를 차단하여 iptables 로이 문제를 쉽게 해결할 수 있습니다.

iptables -I INPUT -p tcp --dport 444:1024 -j DROP
iptables -I INPUT -p udp --dport 444:1024 -j DROP

다른 방법과 비교. 이 방법:

  • 어느 시점에서 (IMO)는 (IMO) CAP_NET_BIND_SERVICE/SETUID를 설정하는 것보다 훨씬 안전합니다. 응용 프로그램이 전혀 설정되지 않기 때문에 (실제로 기능이 있습니다). 예를 들어, 기능 지원 애플리케이션의 Coredump를 잡으려면 CAP/SUID가 설정되면 SYSCTL fs.suid_dumpable (다른 잠재적 보안 문제로 이어짐)을 변경해야합니다. 뿌리가 아닌 사용자는 실행 프로세스의 전체 정보/제어가 없습니다. 예를 들어, 사용자는/proc/pid/fd/(netstat -APTN | grep을 통해 응용 프로그램에 어떤 연결이 어떤 연결이 응용 프로그램에 속한지를 결정할 수 없습니다. PID).
  • 보안 단점이 있습니다. 앱 (또는 Ports 443-1024를 사용하는 앱)이 어떤 이유로 든 다운되지 않지만 다른 앱은 포트를 가져갈 수 있습니다. 그러나이 문제는 CAP/SUID (예 : Java/Nodejs, 예 : Java/Nodejs에 설정된 경우) 및 iptables-sedirect에도 적용될 수 있습니다. SystemD-Socket 메소드를 사용 하여이 문제를 배제하십시오. Authbind 메소드를 사용하여 특수 사용자 바인딩 만 허용하십시오.
  • 새 버전의 응용 프로그램을 배포 할 때마다 CAP/SUID 설정이 필요하지 않습니다.
  • SystemD-Socket 메소드와 같이 응용 프로그램 지원/수정이 필요하지 않습니다.
  • 커널 재 구축이 필요하지 않습니다 (실행중인 버전 이이 sysctl 설정을 지원하는 경우)
  • Authbind/Privbind 메소드처럼 ld_preload를 수행하지 않으면 성능, 보안, 행동에 영향을 줄 수 있습니다 (테스트하지 않음). 나머지 인 Authbind는 실제로 유연하고 안전한 방법입니다.
  • 주소 변환, 연결 상태 추적 등이 필요하지 않기 때문에 IPTables를 지나치게 성능이 우수합니다. 이는 고 부하 시스템에서만 눈에 띄게됩니다.

상황에 따라 SYSCTL, CAP, Authbind 및 Iptables-Redirect 중에서 선택할 것입니다. 그리고 이것은 우리가 너무 많은 옵션을 가지고 있다는 것이 좋습니다.

시작시 :

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

그런 다음 앞으로 포트에 묶을 수 있습니다.

SystemD를 사용하면 사전화 된 소켓을 수락하기 위해 서비스를 약간 수정하면됩니다.

나중에 사용할 수 있습니다 SystemD 소켓 활성화.

기능, iptables 또는 기타 트릭이 필요하지 않습니다.

이것은 단순한이 예제의 관련 SystemD 파일의 내용입니다. 파이썬 HTTP 서버

파일 httpd-true.service

[Unit]
Description=Httpd true 

[Service]
ExecStart=/usr/local/bin/httpd-true
User=subsonic

PrivateTmp=yes

파일 httpd-true.socket

[Unit]
Description=HTTPD true

[Socket]
ListenStream=80

[Install]
WantedBy=default.target

'DJB Way'도 있습니다. 이 방법을 사용하여 TCPSERVER 아래의 모든 포트에서 실행되는 루트로 프로세스를 시작하면 프로세스가 시작된 직후에 지정한 사용자에게 프로세스를 직접 제어 할 수 있습니다.

#!/bin/sh

UID=`id -u yourusername`
GID=`id -g yourusername`
exec tcpserver -u $UID -g $GID -RHl0 0 portnumber   /path/to/your/process &

자세한 내용은 다음을 참조하십시오. http://thedjbway.b0llix.net/daemontools/uidgid.html

사용 privbind 유틸리티 : 비공식적 인 응용 프로그램이 예약 된 포트에 바인딩 할 수 있습니다.

OP는 단지 개발/테스트이므로 세련된 솔루션보다 덜 도움이 될 수 있습니다.

SetCap은 스크립트의 통역사에서 스크립트에 기능을 부여하기 위해 사용될 수 있습니다. 글로벌 통역사 바이너리의 SetCaps를 허용 할 수없는 경우 바이너리의 로컬 사본 (모든 사용자가 할 수 있음)을 만들고이 사본에서 SetCap을 설정하십시오. Python2 (적어도)는 스크립트 개발 트리의 통역사 사본과 함께 제대로 작동합니다. 루트 사용자가 사용자가 액세스 할 수있는 기능을 제어 할 수 있도록 SUID가 필요하지 않습니다.

통역사에 시스템 전체의 업데이트를 추적 해야하는 경우 다음과 같은 쉘 스크립트를 사용하여 스크립트를 실행하십시오.

#!/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 $*

나는 iPtables를 사전에 사전으로 리디렉션하는 방법을 시도했습니다. 오래된 커널에서는이 유형의 규칙이 보입니다 IPv6을 지원하지 않았습니다. 그러나 현재 IP6Tables v1.4.18 및 Linux 커널 v3.8에서 지원됩니다.

또한 소멸 리디렉션이 기계 내에서 시작된 연결에 대해서는 작동하지 않는다는 것을 알았습니다. 로컬 머신의 회의 작업을 위해 출력 규칙을 추가하십시오. iPtables 포트 리디렉션은 LocalHost에서 작동하지 않습니다. eg와 같은 것 :

iptables -t nat -I OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080

나는 또한 사전 방향 리디렉션을 발견했습니다 또한 전달 된 패킷에도 영향을 미칩니다. 즉, 기계가 인터페이스 사이에 패킷을 전달하는 경우 (예 : 이더넷 네트워크에 연결된 Wi-Fi 액세스 포인트 역할을하는 경우) IPTables 규칙은 인터넷 대상에 대한 연결된 클라이언트의 연결을 포착하여로 리디렉션합니다. 기계. 그것은 내가 원했던 것이 아닙니다. 나는 기계 자체로 향하는 연결을 방향을 바꾸고 싶었습니다. 나는 그것이 상자에 주소 된 패킷에만 영향을 줄 수 있다는 것을 알았습니다. -m addrtype --dst-type LOCAL. eg와 같은 것 :

iptables -A PREROUTING -t nat -p tcp --dport 80 -m addrtype --dst-type LOCAL -j REDIRECT --to-port 8080

또 다른 가능성은 TCP 포트 전달을 사용하는 것입니다. 예 : 사용 socat:

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

그러나이 방법의 한 가지 단점은 포트 8080에서 듣는 응용 프로그램이 들어오는 연결의 소스 주소 (예 : 로깅 또는 기타 식별 목적)를 알지 못하는 것입니다.

2015 년 9 월에 답변 :

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top