저는 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 -tulpen
systemd가 포트를 열었음을 알 수 있습니다. 그러나 서비스(a.out)는 항상 "포트 바인딩 오류..."를 반환합니다.
아이디어는 루트가 아닌 권한으로 실행되는 프로그램에서 포트 123을 사용할 수 있도록 하는 것입니다. 일반적으로 1024 미만의 포트는 루트에서만 사용할 수 있습니다.
내 질문은 다음과 같습니다왜 작동하지 않나요/내가 뭘 잘못하고 있나요?
답변1
내가 뭘 잘못했나요?
실제 테스트 프로그램 코드를 작성하지 않았습니다.
거의 모든 코드 줄지금까지는 테스트 프로그램에서 불필요했습니다. systemd는 소켓을 열고 바인딩한 다음 열린 파일 설명자로 프로그램에 전달했습니다. 전혀당신이 직접 만들었습니다.
return 0;
현재는 프로그램에서 유일하게 적절한 명령문 입니다 .
프로그램이 청취 프로그램인지 수신 프로그램인지 결정해야 합니다. 리스너는 청취 소켓의 열린 파일 설명자를 받습니다. 수락자는 허용된 연결 소켓의 열린 파일 설명자를 받습니다.
추가 읽기
- https://unix.stackexchange.com/a/331104/5132
- Lennart Potlinget al.
sd_listen_fds()
. 시스템 매뉴얼 페이지. freedesktop.org.
답변2
포트 123은 네트워크 시간 포트입니다. ntpd나 chronyd 서비스가 있거나 NTP(Network Time Protocol)를 사용하여 서버의 시간을 동기화하는 다른 서비스가 있습니까?
사용자 정의 서비스의 경우 /etc/services 파일에 아직 정의되지 않은 포트를 사용하는 것이 좋습니다.