For small private IRC servers you can use [miniircd](https://github.com/jrosdahl/miniircd), for large public networks [UnreadIRCd](https://www.unrealircd.org/).
By default if you run an I2Pd service, I2P will connect to the IRCd at localhost using IP 127.0.0.1
This is bad for two reasons:
First, you would be unable to separate I2P traffic from other localhost traffic.
Second, all I2P users would be unbanable because 127.0.0.1 is exempt from all bans, including glines.
So, we can fake host to separate localhost traffic from i2pd traffic.
To do this, we will create the directory that UnrealIRCd will access and create the socket file:
```
mkdir /etc/i2pd/unrealircd
chown unrealircd:unrealircd /etc/i2pd/unrealircd
chmod 750 /etc/i2pd/unrealircd
```
NOTE: This assumes your IRCd user is called unrealircd. If not, change the unrealircd:unrealircd in the chown command of above.
If you are on Debian/Ubuntu and have AppArmor installed (you probably do!) then run the next few commands. If you don't do this then everything will fail mysteriously later.
This way, when users connecting on I2P tunnel client address, they will be redirect to 127.0.0.1:5555 that will bridge to Unix Socket created by UnrealIrcd, that come up with an IP 127.0.0.3 and exempt them from ban checking.
4) Restart i2pd.
5) Find b32 destination of your anonymous IRC server.
Go to webconsole -> [I2P tunnels page](http://127.0.0.1:7070/?page=i2p_tunnels). Look for Sever tunnels and you will see address like \<long random string\>.b32.i2p next to anon-chatserver.