systemd abre o soquete, o serviço falha ao ligar a este soquete

0

Estou trabalhando no RedHat7.5.

Eu fiz um socket systemd (/etc/systemd/system/barfoo.socket):

[Unit]
Description=This is the barfoo socket

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

Para os alunos: BindIPv6Only = ambos abrem a porta para IPv6 e IPv4. O formato ListenStream = 0.0.0.0: 123 abre a porta explicitamente para o IPv4.

e um serviço systemd correspondente (/etc/systemd/system/barfoo.service):

Para os alunos: É importante que o arquivo de serviço e o arquivo de soquete tenham o mesmo nome

[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

Para os alunos: "Requer = barfoo.socket" disponibiliza o socket para este serviço. RestartSec e Restart farão o serviço reiniciado a cada 2 segundos (após a saída). Usuário e Grupo fazem o serviço rodar com os privilégios de instalação. ExecStart é o binário real para começar.

Eu também fiz um pequeno programa de teste (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;
}

Então eu fiz:

  • gcc test.c (que cria a.out)
  • systemctl daemon-reload (o que faz o systemd ler meus arquivos barfoo)
  • systemctl start barfoo

Quando eu faço netstat -tulpen , vejo que o systemd abriu a porta. Mas o serviço (a.out) retorna sempre "Ligação de erro à porta ...".

A idéia é tornar a porta 123 disponível para um programa que está sendo executado com privilégios não-root. Normalmente, as portas abaixo de 1024 estão disponíveis apenas para o root.

Minha pergunta é: Por que não está funcionando / O que estou fazendo de errado?

    
por kiigass 14.09.2018 / 15:12

2 respostas

3

What am I doing wrong?

Você não escreveu nenhum código de programa de teste real.

Quase todas as linhas de código do seu programa de teste são desnecessárias. O systemd abriu o socket, ligou-o e passou-o como um descritor de arquivo aberto para o seu programa. Nenhum disso você mesmo faz.

No momento, isso deixa return 0; como a única declaração apropriada em seu programa.

Você deve decidir se o seu programa é de escuta ou de aceitação. Os programas de escuta recebem um descritor de arquivo aberto para um soquete de escuta; aceitar programas recebe um descritor de arquivo aberto para um soquete de conexão aceito.

Leitura adicional

por 14.09.2018 / 18:59
0

A porta 123 é a porta para o tempo de rede. Você tem o serviço ntpd ou chronyd ou algum outro serviço que usa o Network Time Protocol (NTP) para sincronizar a hora no servidor?

Para serviços personalizados, é recomendável usar portas ainda não definidas no arquivo / etc / services.

Espero que isso ajude

    
por 14.09.2018 / 15:49

Tags