Mail-in-a-box – serwer mailowy w jednym skrypcie, w kontenerze lxc

Jak łatwo i szybko postawić dobry serwer mailowy, z niemal wszystkimi możliwymi wodotryskami?
Wydawać by się mogło, że to nie możliwe, a z pewnością wymagałoby dużo pracy… jakby więc podjąć temat tak, żeby sie nie narobić..?
Z pomocą przyszedł mi całkiem niezły skrypt, mail-in-a-box!

Oh, ubuntu only. No nic, może zadziała na Debianie.

Jednak nie działa, lecz na ratunek przyszło LXC!

Nowy kontener:

lxc-create -n ubuntu -t ubuntu

odpalam:

lxc-start -n ubuntu

Kontener nie działa!
Brakuje wpisu w /etc/fstab, wystarczy wykonać:

echo "none        /cgroup        cgroup        defaults    0    0" >> /etc/fstab
mkdir -p /cgroup
mount -a

Ops… nie działa internet. No to zaprzęgamy Google do pracy, szukam, szukam…

konieczne było utworzenie odpowiedniego interfejsu i (wraz z routingiem):

brctl addbr br0
ifconfig br0 10.0.0.1/24 up
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

no i plik konfiguracyjny mojego kontenera wygląda następująco:

lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 00:18:f3:d3:ec:ac
lxc.network.ipv4 = $ip_LXC/24
lxc.network.ipv4.gateway = 10.0.0.1
lxc.network.flags = up
# Container specific configuration
lxc.rootfs = /var/lib/lxc/ubuntu/rootfs
lxc.mount = /var/lib/lxc/ubuntu/fstab
lxc.utsname = ubuntu
lxc.arch = amd64

Startujemy:

lxc-start -n ubuntu

domyślne logowanie to oczywiście ubuntu/ubuntu.
Ubuntu w kontenerze już jest, ale w wersji 12 LTS… potrzebujemy 14.04

sudo su
apt-get update && apt-get upgrade -y && apt-get install bridge-utils git host aptitude update-manager -y
do-release-upgrade

I leci 😉

Uwaga, w trakcie aktualizacji wydania skrypt będzie zadawał mnóstwo irytujących pytań.

Gita mamy już zainstalowanego, więc teraz zgodnie z instrukcją na stronie domowej projektu, grzecznie wykonujemy:

curl -s https://mailinabox.email/bootstrap.sh | sudo bash

I leci znów! W trakcie wykonywania skryptu zostaniecie poproszeni o nazwę użytkownika, hasło, kraj i różne inne niezwykle istotne rzeczy. Nudy.

O, skrypt się skończył, ładnie ostrzegł o samopodpisanym(self-signed) certyfikacie, odpalamy przeglądarkę i… nie działa!

No tak, całość odpalona w kontenerze, nie dziw że z zewnątrz nie działa!

Z pomocą przychodzi firewall oparty o iptables, nat, oraz przekierowanie portów!

Nie zagłębiając się zbytnio w szczegóły, machnąłem malutki skrypcik który załatwia problem z portami
(https wystawiony na port 444 ze względu na to, że na matce uruchomiona już była tam usługa).
Cały skrypt jest oczywiście dostoswany do konfiguracji kontenera LXC którą podałem wcześniej.

###############
# UWAGA!!
# wszystkie wpisy zostaną usunięte.
###############

iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X

$zew_IP = zewnętrzne IP!
$ip_LXC = ip kontenera LXC(10.0.0.10)

//LXC

iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT


iptables -t nat -I PREROUTING -p tcp -d $zew_IP --dport 25 -j DNAT --to $ip_LXC:25
iptables -A FORWARD -p tcp -d $ip_LXC --dport 25 -j ACCEPT

iptables -t nat -I PREROUTING -p tcp -d $zew_IP --dport 53 -j DNAT --to $ip_LXC:53
iptables -A FORWARD -p tcp -d $ip_LXC --dport 53 -j ACCEPT

iptables -t nat -I PREROUTING -p tcp -d $zew_IP --dport 444 -j DNAT --to $ip_LXC:443
iptables -A FORWARD -p tcp -d $ip_LXC --dport 444 -j ACCEPT

iptables -t nat -I PREROUTING -p tcp -d $zew_IP --dport 587 -j DNAT --to $ip_LXC:587
iptables -A FORWARD -p tcp -d $ip_LXC --dport 587 -j ACCEPT

iptables -t nat -I PREROUTING -p tcp -d $zew_IP --dport 993 -j DNAT --to $ip_LXC:993
iptables -A FORWARD -p tcp -d $ip_LXC --dport 993 -j ACCEPT

Śmiga, o ile dobrze są ustawione DNSy. Informacje jak to zrobić można uzyskać na stronie projektu, bądź w zakładce panelu administracyjnego.

/mail -> roundcube
/cloud -> owncloud
/admin -> panel administracyjny, sprawdzanie poprawności, dodawanie użytkowników, aliasów, instrukcja połączenia z innymi usługami.

Leave a Reply

Your email address will not be published. Required fields are marked *