Back to article list

Setting up i2p with the router on an external server

I2P (short for Invisible Internet Protocol) is an anonymizing layer for TCP and UDP. It is a much smaller darknet than Tor, but more resilient to Sybil (aka 51%) attacks. It also doesn't have a notion of "exit nodes" – all traffic stays inside the i2p network. Well, there is a thing called outproxies, but from my experience they aren't very useful. I2P is just not meant to be used as a VPN to the clearnet.

It all seems dandy, until you learn that for it to become at all usable, your node (or router, in I2P terms) needs to be running for some time. Ideally, you would have it run 24/7, but of course that's off the table for most people. The solution though is to run a router on a server (can be a rented VPS, or one you physically own), and then connect to that server from your local machine when you want to browse i2p. This article will guide you through creating such a setup, assuming you already have a Debian server up and running and that you're using Linux locally. (It probably will work with Mac OS, and it might work with Windows, but no guarantees there)

Server-side setup

First, we are going to want to make sure our system is up to date. Then, we will install i2pd – a lightweight implementation of an I2P router. The "official" implementation is written in Java, and is pretty memory-hungry, so I'm opting for using i2pd instead.

Now if you're using a "Stable" version of Debian, the version of i2pd in your package repository is probably months-, if not years-old, so I recommend switching to Debian Unstable. Don't get fooled by the name – I use it exclusively and never had any stability problems. If you really don't want to do that, either you'll have to be content with an old i2pd version (don't), or add an external repository. You can see how to do that here. I'm also going to add an entry for it to Extrepo (see my article on Extrepo).

sudo apt update
sudo apt upgrade
sudo apt install i2pd

Next we're going to configure i2pd to fit our needs. First, look into the /etc/i2pd/i2pd.conf file. The main point of interest there for us it the ipv4 and ipv6 options. There you can enable the use of IPv6 by your router. Do that if you know your server can use IPv6 and you know what that means. Don't change anything otherwise. Everything else is using sane defaults, but the default configuration also adds some tunnels for IRC, which we don't need right now. To turn those off, comment out everything in /etc/i2pd/tunnels.conf by prefixing lines with hashes, and make sure that the content of files inside /etc/i2pd/tunnels.d is also commented.

With i2pd configured, we now want to reload it in order for the configuration to take effect.

sudo systemctl reload i2pd

That is all we need to do from the server's side.

Local setup

On your local machine (the one you will be browsing i2p from) you are now going to write a shell script that does something called SSH port forwarding. More precisely, I've already written a script for you:

#!/bin/sh
ssh -nTNL 127.0.0.1:4444:127.0.0.1:4444 your_user@your_ddress &
sshpid="$!"
your_browser
kill "$sshpid"

Just replace your_user with the username of the user on your server, your_address with the address of your server, and your_browser with your browser of choice. Mind you, this only works if your browser doesn't detach from the shell it's launched in. In particular, I know this doesn't work with Brave, which leads me to believe it won't work with most if not all Chromium-based browsers. I know it works with Firefox (and LibreWolf, so probably most forks of Firefox) though. But I generally recommend using a different browser for i2p than the one you use daily, so you might as well install LibreWolf, GNU IceCat, or just Firefox – whichever one you don't use for browsing the normal web. How to do that is beyond the scope of this guide, but I'm sure you'll manage. Anyway, just copy that shell script with your details filled in to a file in your filesystem, for example ~/.local/bin/browse-i2p or ~/bin/browse-i2p – wherever you store your user-installed scripts. The only important thing is for it to be on your PATH. Then run chmod +x path/to/your/script to be able to run it.

Run that script, and in your browser, configure it to use the HTTP proxy located at 127.0.0.1 (or just localhost), port 4444. In Firefox/LibreWolf it's in Settings → General → Network Settings → Settings... → Manual proxy configuration. You will also want to disable any HTTPS-only-like settings, since most eepsites (that's how services on i2p are commonly called) use plain old HTTP. HTTPS is generally not needed when communicating over i2p, since i2p itself is already a layer of encryption, and it's not very useful for traffic encryption anyway because of how SSL/TLS certificates work. Also, in Firefox and Firefox-based browsers, I recommend visiting about:config, searching for keyword.enable, and disabling that option. You will not be able to search anything on Google or DuckDuckGo anyway, so this only improves user experience.

Et voilà, you have an i2p router and browser set up. As the last thing, you can run the command ssh -nTNL 127.0.0.1:7070:127.0.0.1:7070 your_user@your_address in a terminal window, and go to http://localhost:7070 in your browser (should also work in the i2p-configured one) to see the router console. There you can see some stats about your router, like the tunnel creation success rate. If Network status says OK, and your tunnel creation success rate is above 40%, it means all's working fine and there should not be any issues. Otherwise, is the success rate is very low (like single-digit low), that means something's gone wrong, and you can try and look for help on the internet.

As a starter, you can visit some eepsites that provide a list of other eepsites:


If you liked the article, consider donating Monero to my address: 45ZFoDAouGHH1gC697mRLPK9zMAxnnnccSYQj1Aa2BJnjZhWnbeojWRE5RKR9CeY7qYtt2eESYC4mYqypxE7sfxqLdLi3Eh (QR)