Pinpoint: A virtual user conference Register today
Smarty

How to setup a tinc VPN

Smarty header pin graphic
Jonathan Duncan
Jonathan Duncan
 | 
October 23, 2015
Tags
Smarty header pin graphic

I was given the task of setting up a tinc VPN so that we could test performance for comparison against other VPN systems. This task took much longer than it should have. For that reason, I am making this post to help me and others remember how to do it again in the future.


Installing tinc is straightforward enough. You can download the latest release and build it or install it from your favorite package manager.

The configuration for tinc lives in /etc/tinc. The configuration is what seems to be the hard part of getting tinc to work.

Here is what my final directory structure looked like:

/etc
	/smartynet
		/hosts
			master
			client
		rsa_key.priv
		tinc-down
		tinc-up
		tinc.conf

For this testing setup, I used two hosts. One of them I called master , and the other I called client. It is good to keep in mind that tinc uses a peer-to-peer model, not client/server.

To do the configuration, you will need to be root or at least use sudo for elevated privileges in order to work in the /etc directory.

Step 1

Setup the directory structure on both machines:

# mkdir -p /etc/tinc/smartynet/hosts/

Step 2

Create the /etc/tinc/smartynet/tinc.conf file on both machines.

# ------- master -------
Name = master
Device = /dev/net/tun
# ------- client -------
Name = client
Device = /dev/net/tun
ConnectTo = master

Note: ConnectTo is optional. If this field is not specified, tinc will still listen for connections but will not try to connect to any other node.

Step 3

Create the public and private keypair on both machines:

# tincd -n smartynet -K

This command will create the keys and put them in the following files for you:

/etc/tinc/smartynet/rsa_key.priv
/etc/tinc/smartynet/hosts/master # on the master host
-- or --
/etc/tinc/smartynet/hosts/client # on the client host

Step 4

Add host addresses to the host files that tinc created:

# ------- master -------
# /etc/tinc/smartynet/hosts/master
Address = 198.198.198.198
Subnet = 10.0.7.1/32
# Public key goes below here
# ------- client -------
# /etc/tinc/smartynet/hosts/client
Subnet = 10.0.7.2/32
# Public key goes below here

Note: The Address in the master host file should be the public address of the host machine.

Step 5

Copy host files to the other hosts.

From the master you will copy the /etc/tinc/smartynet/hosts/master file to the client machine, and put it in exactly the same location: /etc/tinc/smartynet/hosts/master.

From the client you will copy the /etc/tinc/smartynet/hosts/client file to the master machine, and put it in exactly the same location: /etc/tinc/smartynet/hosts/client.

Note: Make sure to copy the entire contents of the host files, including the public key that tinc put in them.

Step 6

Create network interface control scripts. There are two files I used that react when tinc switches from online to offline. The files are nearly identical on both hosts, except for the interface address.

# /etc/tinc/smartynet/tinc-up
ifconfig $INTERFACE 10.0.7.1 netmask 255.255.255.0
# /etc/tinc/smartynet/tinc-down
ifconfig $INTERFACE down

Note: remember to change the IP address in the tinc-up script to match the address found in the host file.

Once the interface control scripts are created, change their mode to be executable:

# chmod u+x /etc/tinc/smartynet/tinc-*

Step 7

Start the VPN.

One thing you may need to do before running the VPN is to disable any firewall, or even take the time to punch a hole in it specifically for VPN traffic. I just disabled ufw while I was testing. The VPN did not work for me while the firewall was on.

# ufw disable

You may now commence primary ignition on both hosts:

# tincd -n smartynet -d3

Note: The optional -d switch sets the debug level.

The tinc VPN should now be running. You should be able to run ifconfig and see the new interface that was created for the VPN traffic. You should also be able to ping and even ssh from one host to the other using the private IP addresses that you chose.


For reference, here are all of the files I used for both hosts:

------- files on master -------

======= /etc/tinc/smartynet/tinc.conf =======
Name = master
Device = /dev/net/tun

======= /etc/tinc/smartynet/tinc-up =======
ifconfig $INTERFACE 10.0.7.1 netmask 255.255.255.0

======= /etc/tinc/smartynet/tinc-down =======
ifconfig $INTERFACE down

======= /etc/tinc/smartynet/hosts/master =======
Address = 198.198.198.198
Subnet = 10.0.7.1/32

-----BEGIN RSA PUBLIC KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END RSA PUBLIC KEY-----

======= /etc/tinc/smartynet/hosts/client =======
Subnet = 10.0.7.2/32

-----BEGIN RSA PUBLIC KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END RSA PUBLIC KEY-----

------- files on client -------

======= /etc/tinc/smartynet/tinc.conf =======
Name = client
Device = /dev/net/tun
ConnectTo = master

======= /etc/tinc/smartynet/tinc-up =======
ifconfig $INTERFACE 10.0.7.2 netmask 255.255.255.0

======= /etc/tinc/smartynet/tinc-down =======
ifconfig $INTERFACE down

======= /etc/tinc/smartynet/hosts/master =======
Address = 198.198.198.198
Subnet = 10.0.7.1/32

-----BEGIN RSA PUBLIC KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END RSA PUBLIC KEY-----

======= /etc/tinc/smartynet/hosts/client =======
Subnet = 10.0.7.2/32

-----BEGIN RSA PUBLIC KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END RSA PUBLIC KEY-----

Take a look at the official tinc manual for many more details on how to use this tool.

Subscribe to our blog!
Learn more about RSS feeds here.
rss feed icon
Subscribe Now
Read our recent posts
Tariffs are high. Your address accuracy should be higher.
Arrow Icon
Tariffs are spiking. Shipping costs are climbing. Margins are shrinking. You can’t control global trade policy, but you can control how efficient and accurate your operations are in response. Most ecommerce teams, logistics planners, and data managers miss one of their best cost-saving opportunities: addressing accuracy. Bad address data isn’t hidden. It sits in your systems, shows up in carrier returns, and quietly drains profits every day. When tariffs rise to 15 to 50 percent in some product categories and import volumes are falling, every shipment becomes more expensive, every delay costs more, and every lost customer hurts more.
Pinpoint: The Smarty virtual user conference, because the world is better validated
Arrow Icon
November 2025 | 100% online | 100% awesomeJoin us this November for the Smarty Virtual User Conference, a two-day event packed with insights, tools, laughs, and $1000 worth of prizes. This event is for you, whether you’re optimizing delivery accuracy, improving compliance, or just trying to figure out if your neighbor really has a breakfast nook. What to expect:2 days, 12 hours of content, zero fluffLive sessions from address data prosHands-on demos of Smarty’s latest tools and pluginsGiveaways galore, like gift cards, swag, and even a chance at a massive LEGO setHidden Easter eggs throughout the event (no, seriously—find them and win)An after-party with games (shoutout to Brady Amundson)Tailored tracks for every roleFor developers:Roll up your sleeves.
Welcome to the Address Zoo #1 | Override & underride city addresses
Arrow Icon
The benefits of reliable, easy-to-implement address data are straightforward. Actual addresses, on the other hand, aren’t always so cut and dry. If you’re looking to become an expert in everything that begins or ends with an address, this series is for you. We’ll demystify the types of addresses that have developers scratching their heads and introduce you to the tools keeping your address data best-in-class. Come one, come all, and enter the wonderful world of peculiar addresses! Let’s see what’s on exhibit.

Ready to get started?