xinetd and painless TCP servers
Learnt something new today.
Was looking for a way to wrap up standalone programs and spinning them up as network services by splicing stdin
, stdout
and stderr
descriptors with the network socket file descriptors. Before ending up reinventing the wheel, I found that xinetd (extended Internet daemon) did what exactly I was looking for.
We have a simple echo server here.
#!/usr/bin/python3
while True:
print(input())
It reads from stdin
and writes whatever has been read to stdout
.
Let us first create the configuration file for this service, I would like to call dumbecho
/etc/xinetd.d/dumbecho
service dumbecho
{
type = UNLISTED
socket_type = stream
wait = no
user = gtux
group = gtux
server = /home/gtux/dumbecho.py
log_on_failure += USERID HOST
disable = no
port = 1593
}
user
, group
, server
and port
are the parameters which needs to be changed for new TCP services. Rest, we can leave it as such.
You can also specify server_args
to specify additional command line options before executing whatever is present in the server
field. man
pages for xinetd.conf
is sure an interesting read.
A simple
systemctl restart xinetd
and then
netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:1593 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:9050 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
And voila, our TCP server is online!
For each and every request, a fork is made and dumbecho.py
is executed. A painless way of securely running a simple forking TCP server.