Ever want to run an IRC server? I recently set one up at irc.datente.com using a Digital Ocean VM running CentOS 6.5 x64.
Here’s what I did, if you want to replicate the process for yourself (full documentation available from Unreal’s website):
- acquire CentOS 6.5 x64 server (as I mentioned, I used Digital Ocean)
- `yum -y install screen wget gcc`
- `yum -y upgrade`
- `adduser unreal`
- `su – unreal`
- download Unreal to your server (http://www.unrealircd.com/downloads/unreal/source – `wget http://www.unrealircd.com/downloads/Unreal3.2.10.2.tar.gz`)
- `tar zxf Unreal*.gz`
- `cd Unreal*`
- `make clean`
- `./Config`
- answer prompts – most can be left default
- `make`
- `cp doc/example.conf unrealircd.conf`
- edit unrealircd.conf (use your editor of choice)
- see sample config file below for what I did (minus passwords / emails)
- if all has gone well, start Unreal
- `screen ./unreal start`
- create a startup script to ensure Unreal launches on reboot as user `unreal`
That’s it. Thankfully, while the config file isn’t pleasant to play with, it’s a lot better than it used to be.
loadmodule "src/modules/commands.so";
loadmodule "src/modules/cloak.so";
include "help.conf";
include "badwords.channel.conf";
include "badwords.message.conf";
include "badwords.quit.conf";
include "spamfilter.conf";
me
{
name "your.irc.server.tld";
info "Your IRC Server";
numeric 1;
};
admin {
"Your Name";
"yournick";
"your@email.tld";
};
class clients
{
pingfreq 90;
maxclients 500;
sendq 100000;
recvq 8000;
};
class servers
{
pingfreq 90;
maxclients 10; /* Max servers we can have linked at a time */
sendq 1000000;
connfreq 100; /* How many seconds between each connection attempt */
};
allow {
ip *@*;
hostname *@*;
class clients;
maxperip 25;
};
/* Passworded allow line */
allow {
ip *@255.255.255.255;
hostname *@*.passworded.ugly.people;
class clients;
password "f00Ness";
maxperip 1;
};
allow channel {
channel "#WarezSucks";
class "clients";
};
oper youroperatornick {
class clients;
from {
userhost bob@smithco.com;
};
password "yourpassword";
flags
{
netadmin;
can_zline;
can_gzline;
can_gkline;
global;
};
};
listen *:6697
{
options
{
// uncomment this line if you chose to compile Unreal with SSL support
// ssl;
clientsonly;
};
};
listen *:8067;
listen *:6667;
/* not linking to any other servers right now
link hub.mynet.com
{
username *;
hostname 1.2.3.4;
bind-ip *;
port 7029;
hub *;
password-connect "LiNk";
password-receive "LiNk";
class servers;
options {
/* Note: You should not use autoconnect when linking services */
autoconnect;
ssl;
zip;
};
};
*/
ulines {
services.roxnet.org;
stats.roxnet.org;
};
drpass {
restart "I-love-to-restart";
die "die-you-stupid";
};
log "ircd.log" {
/* Delete the log file and start a new one when it reaches 20MB, leave this out to always use the
same log */
maxsize 20971520;
flags {
oper;
connects;
server-connects;
kills;
errors;
sadmin-commands;
chg-commands;
oper-override;
spamfilter;
};
};
alias NickServ { type services; };
alias ChanServ { type services; };
alias OperServ { type services; };
alias HelpServ { type services; };
alias StatServ { type stats; };
alias "identify" {
format "^#" {
target "chanserv";
type services;
parameters "IDENTIFY %1-";
};
format "^[^#]" {
target "nickserv";
type services;
parameters "IDENTIFY %1-";
};
type command;
};
alias "services" {
format "^#" {
target "chanserv";
type services;
parameters "%1-";
};
format "^[^#]" {
target "nickserv";
type services;
parameters "%1-";
};
type command;
};
alias "identify" {
format "^#" {
target "chanserv";
type services;
parameters "IDENTIFY %1-";
};
format "^[^#]" {
target "nickserv";
type services;
parameters "IDENTIFY %1-";
};
type command;
};
alias "glinebot" {
format ".+" {
command "gline";
type real;
parameters "%1 2d Bots are not allowed on this server, please read the faq at http://www.example.com/faq/123";
};
type command;
};
files
{
/* The Message Of The Day shown to users who log in: */
/* motd ircd.motd; */
/*
* A short MOTD. If this file exists, it will be displayed to
* the user in place of the MOTD. Users can still view the
* full MOTD by using the /MOTD command.
*/
/* shortmotd ircd.smotd; */
/* Shown when an operator /OPERs up */
/* opermotd oper.motd; */
/* Services MOTD append. */
/* svsmotd ircd.svsmotd; */
/* Bot MOTD */
/* botmotd bot.motd; */
/* Shown upon /RULES */
/* rules ircd.rules; */
/*
* Where the IRCd stores and loads a few values which should
* be persistent across server restarts. Must point to an
* existing file which the IRCd has permission to alter or to
* a file in a folder within which the IRCd may create files.
*/
/* tunefile ircd.tune; */
/* Where to save the IRCd's pid. Should be writable by the IRCd. */
/* pidfile ircd.pid; */
};
/*
tld {
mask *@*.fr;
motd "ircd.motd.fr";
rules "ircd.rules.fr";
};
*/
/* note: you can just delete the example block above,
* in which case the defaults motd/rules files (ircd.motd, ircd.rules)
* will be used for everyone.
*/
ban nick {
mask "*C*h*a*n*S*e*r*v*";
reason "Reserved for Services";
};
ban ip {
mask 195.86.232.81;
reason "Delinked server";
};
ban server {
mask eris.berkeley.edu;
reason "Get out of here.";
};
ban user {
mask *tirc@*.saturn.bbn.com;
reason "Idiot";
};
ban realname {
mask "sub7server";
reason "sub7";
};
except ban {
/* don't ban stskeeps */
mask *stskeeps@212.*;
};
deny dcc {
filename "*sub7*";
reason "Possible Sub7 Virus";
};
deny channel {
channel "*warez*";
reason "Warez is illegal";
class "clients";
};
vhost {
vhost i.hate.microsefrs.com;
from {
userhost *@*.image.dk;
};
login stskeeps;
password moocowsrulemyworld;
};
set {
network-name "Datente";
default-server "irc.datente.com";
services-server "irc.datente.com";
stats-server "irc.datente.com";
help-channel "#datente";
hiddenhost-prefix "rox";
/* prefix-quit "no"; */
/* Cloak keys should be the same at all servers on the network.
* They are used for generating masked hosts and should be kept secret.
* The keys should be 3 random strings of 5-100 characters
* (10-20 chars is just fine) and must consist of lowcase (a-z),
* upcase (A-Z) and digits (0-9) [see first key example].
* HINT: On *NIX, you can run './unreal gencloak' in your shell to let
* Unreal generate 3 random strings for you.
*/
cloak-keys {
"aoAr1HnR6gl3sJ7hVz4Zb7x4YwpW";
"aaAr1HnR6gl3sJ7hVz4Zb7x4YwpW";
"aeAr1HnR6gl3sJ7hVz4Zb7x4YwpW";
};
/* on-oper host */
hosts {
local "locop.roxnet.org";
global "ircop.roxnet.org";
coadmin "coadmin.roxnet.org";
admin "admin.roxnet.org";
servicesadmin "csops.roxnet.org";
netadmin "netadmin.roxnet.org";
host-on-oper-up "no";
};
};
set {
kline-address "your@email.tld";
modes-on-connect "+ixw";
modes-on-oper "+xwgs";
oper-auto-join "#opers";
options {
hide-ulines;
/* You can enable ident checking here if you want */
/* identd-check; */
show-connect-info;
};
maxchannelsperuser 10;
/* The minimum time a user must be connected before being allowed to use a QUIT message,
* This will hopefully help stop spam */
anti-spam-quit-message-time 10s;
/* Make the message in static-quit show in all quits - meaning no
custom quits are allowed on local server */
/* static-quit "Client quit"; */
/* You can also block all part reasons by uncommenting this and say 'yes',
* or specify some other text (eg: "Bye bye!") to always use as a comment.. */
/* static-part yes; */
/* This allows you to make certain stats oper only, use * for all stats,
* leave it out to allow users to see all stats. Type '/stats' for a full list.
* Some admins might want to remove the 'kGs' to allow normal users to list
* klines, glines and shuns.
*/
oper-only-stats "okfGsMRUEelLCXzdD";
/* Throttling: this example sets a limit of 3 connection attempts per 60s (per host). */
throttle {
connections 3;
period 60s;
};
/* Anti flood protection */
anti-flood {
nick-flood 3:60; /* 3 nickchanges per 60 seconds (the default) */
};
/* Spam filter */
spamfilter {
ban-time 1d; /* default duration of a *line ban set by spamfilter */
ban-reason "Spam/Advertising"; /* default reason */
virus-help-channel "#help"; /* channel to use for 'viruschan' action */
/* except "#help"; channel to exempt from filtering */
};
};
ty