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?