추가 읽기

추가 읽기

저는 RedHat7.5에서 작업 중입니다.

나는 systemd 소켓(/etc/systemd/system/barfoo.socket)을 만들었습니다:

[Unit]
Description=This is the barfoo socket

[Socket]
ListenStream=0.0.0.0:123
NoDelay=true
BindIPv6Only=both

학습자의 경우: BindIPv6Only=both는 IPv6 및 IPv4 포트를 엽니다. 형식 ListenStream=0.0.0.0:123 IPv4용 포트를 명시적으로 엽니다.

그리고 해당 시스템 서비스(/etc/systemd/system/barfoo.service):

학습자의 경우: 서비스 파일과 소켓 파일의 이름이 동일한 것이 중요합니다.

[Unit]
Description=This is the barfoo service
Requires=barfoo.socket

[Service]
RestartSec=2s
User=installation
Group=installation
ExecStart=/home/installation/tests/a.out
Restart=always

[Install]
WantedBy=multi-user.target

학습자의 경우: "Requires=barfoo.socket"을 사용하면 서비스에서 소켓을 사용할 수 있습니다. RestartSec 및 Restart를 사용하면 서비스가 2초마다(종료 후) 다시 시작됩니다. 사용자 및 그룹을 사용하면 설치 권한으로 서비스를 실행할 수 있습니다. ExecStart는 실제 시작 바이너리입니다.

나는 또한 작은 테스트 프로그램(test.c)도 만들었습니다:

#include<stdio.h> 
#include<arpa/inet.h> 

int main() 
{ 
    int server = socket(AF_INET, SOCK_STREAM, 0); 
    if (server < 0) 
        printf("Error in server creating\n"); 
    else
        printf("Server Created\n"); 

    struct sockaddr_in my_addr, peer_addr; 
    my_addr.sin_family = AF_INET; 
    my_addr.sin_addr.s_addr = INADDR_ANY; 
    my_addr.sin_addr.s_addr = inet_addr("10.0.1.10"); 
    int b = 1, i = 123; 

    my_addr.sin_port = htons(i); 

    b = bind(server, (struct sockaddr*) &my_addr, sizeof(my_addr)); 

    if(b)
      printf("Error binding to port %d, return %d\n", i, b);
    else
      printf("Bound to port %d, return %d\n", i, b); 

   return 0;
}

그런 다음 나는 다음을 수행했습니다.

  • gcc test.c(이것은 a.out을 생성합니다)
  • systemctl daemon-reload(이것은 systemd가 내 barfoo 파일을 읽게 만듭니다)
  • systemctl start barfoo

이렇게 하면 netstat -tulpensystemd가 포트를 열었음을 알 수 있습니다. 그러나 서비스(a.out)는 항상 "포트 바인딩 오류..."를 반환합니다.

아이디어는 루트가 아닌 권한으로 실행되는 프로그램에서 포트 123을 사용할 수 있도록 하는 것입니다. 일반적으로 1024 미만의 포트는 루트에서만 사용할 수 있습니다.

내 질문은 다음과 같습니다왜 작동하지 않나요/내가 뭘 잘못하고 있나요?

답변1

내가 뭘 잘못했나요?

실제 테스트 프로그램 코드를 작성하지 않았습니다.

거의 모든 코드 줄지금까지는 테스트 프로그램에서 불필요했습니다. systemd는 소켓을 열고 바인딩한 다음 열린 파일 설명자로 프로그램에 전달했습니다. 전혀당신이 직접 만들었습니다.

return 0;현재는 프로그램에서 유일하게 적절한 명령문 입니다 .

프로그램이 청취 프로그램인지 수신 프로그램인지 결정해야 합니다. 리스너는 청취 소켓의 열린 파일 설명자를 받습니다. 수락자는 허용된 연결 소켓의 열린 파일 설명자를 받습니다.

추가 읽기

답변2

포트 123은 네트워크 시간 포트입니다. ntpd나 chronyd 서비스가 있거나 NTP(Network Time Protocol)를 사용하여 서버의 시간을 동기화하는 다른 서비스가 있습니까?

사용자 정의 서비스의 경우 /etc/services 파일에 아직 정의되지 않은 포트를 사용하는 것이 좋습니다.

관련 정보