💾 Archived View for dfdn.info › dfdn › tcpmux.gmi captured on 2024-06-16 at 12:49:18. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2024-05-10)

-=-=-=-=-=-=-

The forgotten protocol: TCPMUX (Transmission Control Protocol Port Multiplexer)

This is the first entry in RFC5335, have you ever wondered what is is really for?

Ports are really important in networking. Basically ports provide multiple connections to the same machine, 1 IP address can have multiple open ports. TcpMux was invented to solve the problem of not knowing which application runs on which port.

Some examples of port numbers and services

How it works

TcpMux runs on tcp port 1. You need to send the name of the service to it, you want to connect to. TcpMux connects you to that service without you needing to know the port of that service.

Xinetd

To use TcpMux you first have to install xinetd. This is a super-server, that launches servers when you connect to them, rather than running the server all the time. First we have to create a PoC server application. I will use python for this, It's only 2 (or 1) lines of code.

server.py:

! /usr/bin/python2.7

print ("Application ended")

We will use print because Xinetd connects the TcpMux socket with the stdin and stdout of the real server.

Next we have to setup and configure Xinetd, but first we need to install it:

apt-get install xinetd, if you get prompted if you want to install it, just type y and press enter

Next we will have to add configurations to xinetd:

Adding TcpMux

By default xinetd loads service configuration files from the /etc/xinetd.d directory. You will need to create a new file here. The name of the file can be anything, it's not related to the service. I will name it tcpmux.

Place the following line to tcpmux:

service tcpmux

{

type = INTERNAL

id = tcpmux

socket_type = stream

protocol = tcp

user = root

wait = no

}

where:

type = INTERNAL means that this service is provided by xinetd itself.

id = tcpmuxis a unique ID for this service

socket_type = stream this is a stream socket

protocol = tcp, use TCP as a protocol

user = root, launch this service as root

wait = no, means our service is multi-threaded and xinetd will handle more than one request until the application closes

Adding our test service

Navigate to the same folder /etc/xinetd.d and add a new file. I will name it myservice.

Place the following lines into myservice:

service ftp

{

disable = no

type = TCPMUX UNLISTED

socket_type = stream

protocol = tcp

wait = no

user = root

server = /root/public/server.py

instances = 10

log_type = SYSLOG daemon debug

}

where:

disable = no, means that this service is enabled

type = TCPMUX UNLISTED, means that tcpmux will handle requests for this service, unlisted means, that this service isn't listed under /etc/services or the name and the port number listed there doesn't match.

server = /root/public/server.py specifies the path of our server to execute.

instances = 10, specifies the maximum number of server applications to start.

log_type = SYSLOG daemon debug, specifies to log to the syslog file with the daemon facility, with debug set for the log level

Now go ahead and restart xinetd by executing:

service xinetd restart

Testing out TcpMux

To test it out we need to send a message to port 1 to the server, with the name of the service we want to start and a CRLF or \r\n. If we succeed, we will get the message sent by python. If we have a configuration error we will get something like: -Service name not found. I wrote a quick c# code to test this out:

using System.Net.Sockets;

namespace Application

{

public class App

{

private void TcpMux()

{

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

byte[] data = Encoding.ASCII.GetBytes("ftp\r\n");

s.Connect("192.168.10.62", 1);

s.Send(data);

byte[] response = new byte[2048];

s.Receive(response, 0, response.Length, SocketFlags.None);

Console.WriteLine(Encoding.ASCII.GetString(response));

}

public static void Main(String[] args)

{

TcpMux();

}

}

}

Summary

TcpMux is not really a supported protocol according to Wikipedia it has been deprecated in 2016. I just figured it will be intresting to look at this rare protocol. We will for sure look at xinetd more briefly in another post. Now go and test out TcpMux in your linux box!