Re: udp socket-activation "fake-service"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Am 18.03.19 um 17:29 schrieb Reindl Harald:
> Am 18.03.19 um 11:31 schrieb Reindl Harald:
>> Am 18.03.19 um 10:54 schrieb Lennart Poettering:
>>> I am not fully grokking what you are trying to do, but to recv UDP
>>> dgrams you'd have to write a tiny program that calls recvfrom() (or a
>>> similar syscall) on the sockets passed, and then replies to it with
>>> sendto() (or a similar syscall), using the address of the source
>>> (i.e. the struct sockaddr recvfrom() returns) to respond to the dgram.
>>
>> listen on UDP 1-1024 with socket activation to NMAP scan over ac omplete
>> network (the dummy machine has all ip addresses from 2-254 in the /24)
>> and verify a firewall setup which goes so 1:1 into production
>>
>> in other words: i don't care what process after socket activation does,
>> i just need to see in NMAP if the port is open cor closed through the
>> firewall

FWIW attached the c-code, a sample socket/service and php code which
deals with the fact that systemd activation obviously don't buffer and
forward already received packets after spawn up the service

that "RuntimeMaxSec=1" has no option to not fail but just stop the
service isn't that funny but it works for the usecase

Attachment: check.php
Description: application/php

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <systemd/sd-daemon.h>
#define MAXLINE 1024
int main()
{
 if(sd_listen_fds(0) != 1)
 {
  fprintf(stderr, "No or too many file descriptors received\n");
  exit(EXIT_FAILURE);
 }
 int len;
 int sockfd;
 char buffer[MAXLINE];
 char *pong = "PONG\n";
 struct sockaddr_in6 servaddr, cliaddr;
 sockfd = SD_LISTEN_FDS_START + 0;
 memset(&servaddr, 0, sizeof(servaddr));
 memset(&cliaddr, 0, sizeof(cliaddr));
 while(1)
 {
  recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, (struct sockaddr *) &cliaddr, &len);
  sendto(sockfd, (const char *)pong, strlen(pong), MSG_CONFIRM, (const struct sockaddr *) &cliaddr, len);
 }
}
[Unit]
Description=Demo UDP Server
StartLimitIntervalSec=1
StartLimitBurst=5

[Service]
Type=simple
ExecStart=/etc/systemd/system/demo-udp-systemd-activation.bin
RuntimeMaxSec=1

StandardOutput=null
StandardError=null

User=nobody
Group=nobody

LockPersonality=yes
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
PrivateDevices=yes
PrivateTmp=yes
ProtectControlGroups=yes
ProtectHome=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectSystem=strict
RestrictAddressFamilies=AF_INET AF_INET6 AF_LOCAL AF_UNIX AF_NETLINK
RestrictNamespaces=yes
RestrictRealtime=yes
SystemCallArchitectures=native
SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap

ReadWritePaths=-/run
ReadWritePaths=-/tmp
[Unit]
Description=Demo UDP 172.16.0.4:53 Socket
StartLimitIntervalSec=1
StartLimitBurst=5

[Socket]
ListenDatagram=172.16.0.4:53

[Install]
WantedBy=sockets.target
_______________________________________________
systemd-devel mailing list
systemd-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/systemd-devel

[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux