← Retornar aos Artigos

Hospedando o seu próprio servidor de IRC para mensagens seguras.

Este artigo foi atualizado em: 20 de setembro de 2021

Este artigo foi readaptado mas teve sua fonte de consulta nos sites landchad e do github oficial do ergo. Meus agradecimentos a ambos!


O IRC significa nostálgia para mim, a primeira vez que utilizei foi em 1997. O meu primo que tinha condições financeiras melhores tinha um computador e se comunicava com os amigos(as) por este mensageiro. Fiquei encantado com aquilo, o cliente que ele estava utilizando se chamava MIrc que rodava no windows.

Quando adquiri meu primeiro computador em 1999, foi a primeira coisa que fiz! Instalar o IRC para me comunicar com as pessoas.

Vamos hoje aprender a instalar e configurar um servidor de IRC chamado Ergo. O mesmo é um protocolo IRC refinado e com bastante opções interessantes para se configurar.

=====> Configurações Iniciais.

Para uma instalação de serviço manual em um servidor, recomendo sempre adicionar um usuário especifico para o mesmo, vamos então começar criando um usuário chamado ergo e se logar com o mesmo

useradd -m ergo -s /bin/bash
su ergo

Em seguida criamos um diretório chamado servidor

mkdir -v server

Preste bastante atenção nesta PARTE. A versão que vamos usar neste artigo é a 2.7.0! Como os softwares tendem a ter correções e modifcações de versões você precisa fazer a verificação no github do projeto e alinhar a versão neste artigo. O link: o github oficial do ergo. Vamos agora baixar a última versão do ergo em seu repositório do github. Para não precisa compilar, vou baixar uma versão já em binário! Talvez você possa prefirir baixar o fonte e compilar em seu servidor, se caso prefirir de uma olhada no github do mesmo.

wget https://github.com/ergochat/ergo/releases/download/v2.7.0/ergo-2.7.0-linux-x86_64.tar.gz

Vamos descompactar e mover todo conteúdo que acabamos de baixar um diretório acima e excluir os arquivos que não precisamos mais.

tar xvf ergo-2.7.0-linux-x86_64.tar.gz
mv -v ergo-2.7.0-linux-x86_64/* .
rm -vr ergo-2.7.0-linux-x86_64*

=====> Configuração do Ergo

Primeiramente faça a verificação se você esta no diretório aonde descompactou os arquivos, o diretório deve ser: /home/ergo/server/

$ pwd
/home/ergo/server

Tambem é altamente recomendado fazer a verificação se você ainda está com usuário ergo.Se retornar ergo está tudo ok e você pode continuar. Se não entre com o usuário ergo novamente.

$ echo $USER
ergo

Começamos nossa configuração do ergo renomeando dois arquivos que precisam estar com outro nome. A documentação oficial do ergo pede isso, então vamos seguir fielmente. Faça uma listagem no diretório e veja se você está com estes arquivos:

$ ls
CHANGELOG.md  default.yaml  docs  ergo  ergo.motd  languages  README  traditional.yaml

Caso você não esteja vendo estes arquivos você deve voltar ao diretório servidor que criamos.

Os arquivos que devemos mover são: default.yaml e ergo.motd.
O arquivo default.yaml é a configuração do servidor IRC em si e o ergo.motd é a mensagem de boas vindas que você pode setar de acordo com sua necessidade.

mv -v default.yaml ircd.yaml
mv -v ergo.motd ircd.motd

Abra o arquivo recém renomeado ircd.yaml com seu editor de texto favorito e vamos começar alterando o nome do servidor para o seu dominio.

Busque pelo seguinte bloco:

# network configuration
network:
    # name of the network
    name: ErgoTest

Altere a linha: name: ErgoTest pelo nome do seu servidor! Não podem haver espaços no nome do servidor, use traços ou underlines.

# network configuration
network:
    # name of the network
    name: Servidor-do-Jeffe

Vamos agora alterar o dominio de exemplo para o seu dominio. Procure pela linha:

# server configuration
server:
    # server name
    name: ergo.test

Substitua a linha name: ergo.test pelo seu dominio. Caso você não tenha um dominio você pode adicionar o endereço IP do servidor.

# server configuration
server:
    # server name
    name: slackjeff.com.br

=====> Segurança

O primeiro passo é limitar a quantidade de conexões por IP. Limite a um número baixo variando entre 2 e 4 conexões simultâneas. Isso vai ajudar a proteger em casao de ataque DoS.

# maximum concurrent connections per IP/CIDR
max-concurrent-connections: 2

O IRC mostra o ip de usuários na rede, você pode ver o mesmo com o comando /whois Usuario por exemplo, ou ao entrar e sair. Para dar mais privacidade aos usuários o ergo define por padrão o Cloaking. Ou seja ao invés de mostrar o ip do usuário mostrará algo "falso" no lugar ficando: exemplo@12349198897NOMErede.

Para alterar o nome de Cloaking procure pela linha netname e altere para o nome que quiser.

# fake TLD at the end of the hostname, e.g., pwbs2ui4377257x8.irc
# you may want to use your network name here
netname: "irc"

Eu alterei para slackjeffHONOR

# fake TLD at the end of the hostname, e.g., pwbs2ui4377257x8.irc
# you may want to use your network name here
netname: "slackjeffHONOR"

Vamos agora definir a senha do Operador (OPER). Feche e salve o documento com editor de texto e execute o comando ergo.

./ergo genpasswd

Vai ser gerado uma hash por exemplo: $2a$04$c4nA4uEf2NzmaJJEIan0HO4sgRRXhFJ/3ichSJ4bRrDoXxlQfMS4y
Esta hash você precisa guardar para alterar no documento a seguir.

Feito o processo localize a linha # ircd operators e troca a linha password O hash foi gerado anteriormente com o comando ./ergo genpasswd.

password: "$2a$04$0123456789abcdef0123456789abcdef0123456789abcdef01234"

Por padrão as mensagens em geral do IRC não são gravadas em arquivos mas ficam disponiveis (de uma forma não persistente) na memória RAM do servidor/máquina até o reboot. Esta opção vem habilitada, por questões de privacidade é interessante desabilitar.

Afinal as mensagems se o usuário desejar devem ser armazenadas no computador do mesmo e não no servidor.

history:
    # should we store messages for later playback?
    # by default, messages are stored in RAM only; they do not persist
    # across server restarts. however, you may want to understand how message
    # history interacts with the GDPR and/or any data privacy laws that apply
    # in your country and the countries of your users.
    enabled: false

Altere a linha: enabled: true para: enabled: false

=====> Criação de certificados

Hoje é normal se conectar na porta 6697 que indica que a conexão é criptografada nos servidores IRC. Antigamente utilizava a porta 6667 (até hoje em dia se utilizada) é uma porta que não está criptografada. Normalmente utilizamos criptografia na conexão de entrada e saida impedindo bisbilhoteiros de snifar o trafego do usuário.

Esta opção já está habilitada por padrão e você deve apenas gerar o certificado! O certificado será auto assinado, ou seja o usuário a se conectar terá uma mensagem dizendo que o certificado pode não ser seguro justamento por ser auto assinado por você.

Esta mensagem é apenas um aviso e se o certificado ser gerado corretamente terá criptografia na conexão.

Para gerar o certificado rode o comando ergo!

./ergo mkcerts

Você deve ter uma saida parecida com esta:

$ ./ergo mkcerts
2021/09/21 22:07:21 making self-signed certificates
2021/09/21 22:07:21  making cert for :6697 listener
2021/09/21 22:07:21   Certificate created at fullchain.pem : privkey.pem

!!!!!!!!! ATENÇÃO !!!!!!!!!!

Caso você queira gerar um certificado com Let's Encrypt você pode utilizar o certbot para isso. É a maneira mais fácil. Certifique-se de ter o certbot instalado na sua distribuição GNU/Linux. Após a instalação o processo é feito da seguinte forma:

Para esta operação você precisa se logar como usuário root para ter acesso a estes arquivos!

# certbot certonly --standalone --preferred-challenges http -d exemplo.com.br

Troque o dominio exemplo.com.br pelo seu dominio.

O certificado se gerado será encontrado no diretório /etc/letsencrypt/live/exemplo.com.br copie o certificado fullchain.pem e sua chave privada privkey.pem para o diretório do servidor do ergo. Em nosso caso: /home/ergo/server/ .

# cp -v /etc/letsencrypt/live/exemplo.com.br/fullchain.pem /home/ergo/server/
# cp -v etc/letsencrypt/live/example.com/privkey.pem /home/ergo/server/

Ambos certificados precisam ter como dono/grupo o usuário ergo.

# chown ergo:ergo /home/ergo/server/*.pem

O certificado expira a cada 3 meses. Você pode fazer um script em Shell para a cada 1 mês por exemplo renovar o certificado, não se esqueça que você deve copiar o certificado e chave pública para o diretório do ergo /home/ergo/server/

=====> Iniciando servidor IRC como serviço com systemd.

Para as coisas ficarem mais profissionais é interessante criarmos um daemon. Com o systemd é simples, primeiramente vamos criar um script em shell para executar o ergo! Isto deve ser feito no diretório do ergo: /home/ergo/server. Vamos tambem dar a permissão de execução para este script.

$ cat << EOF > start.sh
#!/bin/bash
./ergo run
EOF

$ chmod +x start.sh

Vamos agora criar o serviço ergo.service.

$ cat << EOF > ergo.service
[Unit]
Description=Ergo IRC server
After=network.target
# If you are using MySQL for history storage, comment out the above line
# and uncomment these two instead (you must independently install and configure
# MySQL for your system):
# Wants=mysql.service
# After=network.target mysql.service

[Service]
Type=simple
User=ergo
WorkingDirectory=/home/ergo/server
ExecStart=/home/ergo/server/start.sh
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
LimitNOFILE=1048576
# Uncomment this for a hidden service:
# PrivateNetwork=true

[Install]
WantedBy=multi-user.target

EOF

Vamos agorar instalar e habilitar o serviço para o systemd conseguir "enxergar". Para isso você deve estar logado como root.

# ln -s /home/ergo/server/ergo.service /etc/systemd/system/ergo.service
# systemctl enable ergo

Agora o grande momento... Vamos iniciar o serviço e ver tudo funcionando..

# systemctl start ergo

=====> Atualização do Servidor.

Para uma atualização manual vocẽ deve seguir os seguintes passos: