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 */ }; };