Welcome to the Invisible Internet! — Setting up I2P on a VPS

A major hurdle for the wider adoption of the I2P protocol is the same as with many other purely P2P protocols: you need to reach a certain peer connectivity level before anything becomes usable. For example, this Mental Outlaw video about I2P shows that it can take many hours of waiting before most eepsites become accessible. This is drastically different from e.g. Tor, which is basically plug-and-play.

Setting up I2P on a remote VPS and port forwarding that connection with SSH provides a robust solution to this problem, as the client being online 24/7 guarantees excellent connectivity.

Setting up I2P

It’s advisable to create a separate .env file and set the EXT_PORT environment variable there (this is the exposed host port where I2NP will be reachable, i.e. it must also be unblocked from the firewall).

The advertised memory usage for I2P’s JVM is 128 MB, but it’s still good to set a cap using the JVM_XMX environment variable. Additionally, the i2ptorrents:i2psnark volume can be commented out if you don’t need BitTorrent support. See the official documentation for more information on possible configuration options.

services:
  i2p:
    image: geti2p/i2p
    container_name: i2p
    restart: unless-stopped
    ports:
      - ${EXT_PORT}:${EXT_PORT}/tcp
      - ${EXT_PORT}:${EXT_PORT}/udp
    volumes:
      - ${PWD}/i2pconfig:/i2p/.i2p:rw # Mandatory configs
      - ${PWD}/i2ptorrents:/i2psnark:rw # Torrenting support
    environment:
      JVM_XMX: 256m
      EXT_PORT: ${EXT_PORT:?host port must be manually set}

Once the container is fully configured, run docker compose up -d and check the i2p container’s logs. You should see something like this (there should be no warnings about the connection being firewalled):

Starting I2P
[startapp] Running in container
[startapp] Running in docker network
[startapp] setting reachable IP to container IP 172.18.0.1
Starting I2P 2.7.0-0

Connecting via an SSH tunnel

The AllowTcpForwarding variable in the OpenSSH configuration (/etc/ssh/sshd_config) defaults to yes, but must be modified if explicitly set to no. After this the following command can be used to start the tunnel in the background (implied by -f and -n flags):

ssh -fnN -L [LOCAL_PORT]:[CONTAINER_LOCAL_IP]:[REMOTE_PORT] [USERNAME]@[VPS_IP]

Once the container is booted up for the first time, the installation setup must be completed by accessing the router console via port 7657. Then, configure the I2P proxy via port 4444 to your browser and you’re ready to go. If you want to configure any additional services, here’s the complete list of the ports used by I2P.