stunnel (“Secure Tunnel”) is a
- multi-platform application used to provide a universal TLS/SSL tunneling service. It is sort of proxy designed to add TLS encryption functionality to existing clients and servers without any changes in the programs' code. It is designed for security, portability, and scalability (including load-balancing), making it suitable for large deployments. It uses openssl, and distributed under GNU GPL version 2 or later with OpenSSL exception.
Can tunnel only TCP packets. Its FAQ has some work around for UDP.
Authentication can also be used by the server to allow access only to approved clients.
The main configuration file is read from
A client is one to accept non TLS encrypted data. Stunnel will TLS encrypts its data and connects to the stunnel server. The stunnel server accepts TLS encrypted data and extracts it. It then connects to where the data should be sent to.
Byte order mark (BOM)
The configuration file should have a UTF-8 byte order mark (BOM), at the beginning of the file. A BOM is the unicode character U+FEFF. Its UTF-8 representation is the (hexadecimal) byte sequence 0xEF, 0xBB, 0xBF. Inserting those bytes into the beginning of a file can be done by
# echo -e '\xEF\xBB\xBF; BOM can not be seen, but is there. Before the semicolon!' > /etc/stunnel/stunnel.conf
To test if those bytes appear, one can use
% od --address-radix=n --format=x1c --read-bytes=8 /etc/stunnel/stunnel.conf ef bb bf 3b 20 42 4f 4d 357 273 277 ; B O M
Note that when printing the file to the screen, such as with
cat, or when editing the file with a text editor, the BOM bytes are usually not displayed. They should be there, though. Which is why you might want to verify that they are still there after editing is completed with the above
od, or similar, command.
At least one of the client and the server, and optionally both, should be authenticated. Either a pre shared secret, or a key and certificate pair, can be used for authentication. A pre shared secret has to be transfered to all the involved machines a priory by other means, such as SCP and SFTP. When such transfer is acceptable, pre shared key is the fastest method. Its speed might help defending attacks. A simple configuration for a server with a single client that are using a pre shared secret is:
; BOM can not be seen, but is there. Before the semicolon! [trivial client] client = yes accept = 127.0.0.1:<src_port> connect = <server_host>:<server_port> PSKsecrets = psk.txt
; BOM can not be seen, but is there. Before the semicolon! [trivial server] accept = <server_port> connect = <dst_port> ciphers = PSK PSKsecrets = psk.txt
/etc/stunnel/psk.txt could be created on one machine by
# openssl rand -base64 -out /etc/stunnel/psk.txt 40 # sed -i '1s/^/psk:/' /etc/stunnel/psk.txt
and copied to the other machine by secure means before starting stunnel. The files permissions for each
psk.txt file should be set appropriately. The psk string from the sed command is just a random name for the sake of the example. Do read .
Tips and Tricks
DNS over TLS
bind does not offer builtin facilities for encryption of queries and answers. Bind knowledge base suggests using stunnel. See https://kb.isc.org/docs/aa-01386. The link mentions unbound at the bottom of the page. A user that have only shell accounts on both the client and the server can still tunnel DNS traffic even when both the resolver and the NS do not support DNS over TLS.