@@ -0,0 +1,7 @@ | |||
Host Type MX Destination | |||
* A 5.45.101.172 | |||
@ MX 10 srv01.dreckbu.de | |||
@ A 5.45.101.172 | |||
autoconfig CNAME srv01.dreckbu.de | |||
autodiscover CNAME srv01.dreckbu.de | |||
mail A 5.45.101.172 |
@@ -0,0 +1,162 @@ | |||
# Dreckbu.de server initial setup | |||
## ssh | |||
```bash | |||
# as root | |||
adduser noah | |||
usermod -aG sudo noah | |||
``` | |||
* Copy pub keys to server using `ssh-copy-id -i KEY_FILE user@host`. | |||
```bash | |||
nano /etc/ssh/sshd_config | |||
``` | |||
* Change *PasswordAuthentication yes* to *PasswordAuthentication no*. | |||
```bash | |||
systemctl restart sshd | |||
``` | |||
## software | |||
```bash | |||
apt update && apt upgrade | |||
apt install vim tmux htop zsh | |||
update-alternatives --config editor | |||
``` | |||
## firewall | |||
``` | |||
netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995' | |||
apt install iptables-persistent | |||
``` | |||
* iptables base: | |||
`vim /etc/iptables.up.rules` | |||
``` | |||
*filter | |||
:INPUT ACCEPT [0:0] | |||
:FORWARD DROP [0:0] | |||
:OUTPUT ACCEPT [0:0] | |||
:DOCKER-USER - [0:0] | |||
## | |||
# INPUT | |||
## | |||
# Allow localhost | |||
-A INPUT -i lo -j ACCEPT | |||
# Allow established connections | |||
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT | |||
# Allow ICMP ping | |||
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT | |||
# SSH | |||
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT | |||
# INPUT default DROP | |||
-A INPUT -j DROP | |||
## | |||
# DOCKER-USER rules | |||
## | |||
# Allow established connections | |||
-A DOCKER-USER -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT | |||
# SMTP | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 25 -j ACCEPT | |||
# http | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT | |||
# https | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT | |||
# DOCKER-USER default DROP | |||
-A DOCKER-USER -i eth0 -j DROP | |||
COMMIT | |||
``` | |||
* Modified `vim /etc/iptables.up.rules` | |||
```bash | |||
*filter | |||
:INPUT ACCEPT [0:0] | |||
:FORWARD DROP [0:0] | |||
:OUTPUT ACCEPT [0:0] | |||
:DOCKER-USER - [0:0] | |||
## | |||
### INPUT | |||
#### | |||
## | |||
### Allow localhost | |||
-A INPUT -i lo -j ACCEPT | |||
## | |||
### Allow established connections | |||
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT | |||
## | |||
### Allow ICMP ping | |||
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT | |||
## | |||
### SSH | |||
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT | |||
## | |||
### INPUT default DROP | |||
-A INPUT -j DROP | |||
## | |||
#### | |||
### DOCKER-USER rules | |||
#### | |||
## | |||
### Allow established connections | |||
-A DOCKER-USER -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT | |||
## | |||
### SMTP | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 25 -j ACCEPT | |||
### SMTPS | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 465 -j ACCEPT | |||
### Postfix Submission | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 587 -j ACCEPT | |||
### IMAP | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 143 -j ACCEPT | |||
### IMAPS | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 993 -j ACCEPT | |||
### POP3 | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 110 -j ACCEPT | |||
### POP3S | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 995 -j ACCEPT | |||
### Dovecot ManageSieve | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 4190 -j ACCEPT | |||
### http | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT | |||
### https | |||
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT | |||
# | |||
### DOCKER-USER default DROP | |||
-A DOCKER-USER -i eth0 -j DROP | |||
COMMIT | |||
``` | |||
```bash | |||
iptables-restore < /etc/iptables.up.rules | |||
iptables-save > /etc/iptables/rules.v4 | |||
ip6tables-save > /etc/iptables/rules.v6 | |||
``` | |||
**leave iptables alone, it breaks everything!!!** | |||
## datetime | |||
```bash | |||
timedatectl status | |||
``` | |||
## hostname and fqdn | |||
```bash | |||
vim /etc/hostname | |||
# replace with srv01 | |||
hostname $(cat /etc/hostname) | |||
vim /etc/resolvconf/resolv.conf.d/head | |||
# add domain dreckbu.de at the end | |||
resolvconf -u | |||
hostnamectl set-hostname srv01 | |||
vim /etc/hosts | |||
# replace with srv01 | |||
``` | |||
@@ -0,0 +1,42 @@ | |||
# Mailcow setup | |||
## install docker | |||
*https://docs.docker.com/install/linux/docker-ce/debian/#prerequisites* | |||
```bash | |||
apt install \ | |||
apt-transport-https \ | |||
ca-certificates \ | |||
curl \ | |||
gnupg2 \ | |||
software-properties-common | |||
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - | |||
apt-key fingerprint 0EBFCD88 | |||
sudo add-apt-repository \ | |||
"deb [arch=amd64] https://download.docker.com/linux/debian \ | |||
$(lsb_release -cs) \ | |||
stable" | |||
apt update | |||
apt install docker-ce docker-ce-cli containerd.io | |||
``` | |||
## install docker-compose | |||
```bash | |||
curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose | |||
chmod +x /usr/local/bin/docker-compose | |||
``` | |||
## install mailcow | |||
```bash | |||
umask | |||
# should equal 0022 | |||
cd /opt | |||
git clone https://github.com/mailcow/mailcow-dockerized | |||
cd mailcow-dockerized | |||
docker-compose pull | |||
docker-compose up -d | |||
vim mailcow.conf | |||
# enable SKIP_HTTP_VERIFICATION=n | |||
``` | |||
## troubleshooting | |||
* cannot receive mail from accounts that aren't local | |||
* applied fix: https://github.com/mailcow/mailcow-dockerized/issues/776 (srv01.dreckbu.de dest) |
@@ -0,0 +1,21 @@ | |||
# Teamspeak 3 setup | |||
*https://hub.docker.com/_/teamspeak* | |||
`docker run --name ts3 -v /opt/ts3/ts3server:/var/ts3server/ -d -p 9987:9987/udp -p 9988:9988/udp -p 10011:10011 -p 30033:30033 -e TS3SERVER_LICENSE=accept teamspeak:latest` | |||
`vim /etc/systemd/system/docker-ts3.service` | |||
``` | |||
[Unit] | |||
Description=Teamspeak 3 server | |||
Requires=docker.service | |||
After=docker.service | |||
[Service] | |||
Restart=always | |||
ExecStart=/usr/bin/docker start -a ts3 | |||
ExecStop=/usr/bin/docker stop -t 2 ts3 | |||
[Install] | |||
WantedBy=default.target | |||
``` |
@@ -0,0 +1,128 @@ | |||
# Nginx setup | |||
* https://hub.docker.com/_/nginx | |||
## Set up reverse proxy in mailcow | |||
* https://mailcow.github.io/mailcow-dockerized-docs/firststeps-rp/ | |||
* `vim /opt/mailcow-dockerized/mailcow.conf` | |||
``` | |||
HTTP_BIND=127.0.0.1 | |||
HTTP_PORT=8080 | |||
HTTPS_BIND=127.0.0.1 | |||
HTTPS_PORT=8443 | |||
``` | |||
```bash | |||
./generate_config.sh | |||
cp mailcow.conf_backup mailcow.conf | |||
docker-compose up -d | |||
``` | |||
``` | |||
docker run --name tmp-nginx-container -d nginx | |||
docker cp tmp-nginx-container:/etc/nginx /opt/nginx/ | |||
docker rm -f tmp-nginx-container | |||
``` | |||
* `vim /opt/nginx/nginx/conf.d/mailcow.conf` | |||
``` | |||
server { | |||
listen 80 default_server; | |||
listen [::]:80 default_server; | |||
server_name srv01.dreckbu.de autodiscover.* autoconfig.*; | |||
return 301 https://$host$request_uri; | |||
} | |||
server { | |||
listen 443; | |||
listen [::]:443; | |||
server_name srv01.dreckbu.de autodiscover.* autoconfig.*; | |||
ssl on; | |||
ssl_certificate /var/ssl/cert.pem; | |||
ssl_certificate_key /var/ssl/key.pem; | |||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; | |||
ssl_ciphers HIGH:!aNULL:!MD5; | |||
location /Microsoft-Server-ActiveSync { | |||
proxy_pass http://nginx-mailcow:8080/Microsoft-Server-ActiveSync; | |||
proxy_set_header Host $http_host; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
proxy_set_header X-Forwarded-Proto $scheme; | |||
proxy_connect_timeout 75; | |||
proxy_send_timeout 3650; | |||
proxy_read_timeout 3650; | |||
proxy_buffers 64 256k; | |||
client_body_buffer_size 512k; | |||
client_max_body_size 0; | |||
} | |||
location / { | |||
proxy_pass http://nginx-mailcow:8080/; | |||
proxy_set_header Host $http_host; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
proxy_set_header X-Forwarded-Proto $scheme; | |||
client_max_body_size 0; | |||
} | |||
} | |||
``` | |||
## set up main host for serving static html pages | |||
* `vim /opt/nginx/nginx/conf.d/main.conf` | |||
``` | |||
# HTTP | |||
server { | |||
listen 80; | |||
listen [::]:80; | |||
server_name dreckbu.de www.dreckbu.de; | |||
# enforce https | |||
return 301 https://$server_name$request_uri; | |||
} | |||
# HTTPS | |||
server { | |||
listen 443; | |||
listen [::]:443; | |||
server_name dreckbu.de www.dreckbu.de; | |||
ssl on; | |||
ssl_certificate /var/ssl/cert.pem; | |||
ssl_certificate_key /var/ssl/key.pem; | |||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; | |||
ssl_ciphers HIGH:!aNULL:!MD5; | |||
index index.php index.html index.htm; | |||
location / { | |||
root /var/www; | |||
} | |||
} | |||
``` | |||
## test the reverse proxy | |||
* `docker run --name nginx-reverse-proxy -p 80:80 -p 443:443 --network mailcowdockerized_mailcow-network -v /opt/nginx/nginx:/etc/nginx:ro -v /opt/mailcow-dockerized/data/assets/ssl:/var/ssl -v /opt/nginx/www:/var/www -d nginx` | |||
* `vim /opt/nginx/docker-compose.yml` | |||
``` | |||
version: "2" | |||
networks: | |||
mailcowdockerized_mailcow-network: | |||
external: true | |||
services: | |||
nginx-reverse-proxy: | |||
image: nginx | |||
volumes: | |||
- /opt/nginx/nginx:/etc/nginx:ro | |||
- /opt/mailcow-dockerized/data/assets/ssl:/var/ssl | |||
- /opt/nginx/www:/var/www | |||
ports: | |||
- "80:80" | |||
- "443:443" | |||
restart: always | |||
networks: | |||
- mailcowdockerized_mailcow-network | |||
``` | |||
* https://stackoverflow.com/questions/38088279/communication-between-multiple-docker-compose-projects |
@@ -0,0 +1,3 @@ | |||
# Dreckbu.de docs | |||
Documentation on how srv01.dreckbu.de was installed. |