Gjør din Raspberry Pi til en sikker FTP-server med e-post videresending

Har du en Raspberry Pi som samler støv? Enten det er den nyeste Pi 5, en Pi 4, Pi Zero eller til og med en eldre modell, vil denne guiden vise deg hvordan du kan gjøre den om til en kraftig, automatisert filserver med e-post videresending. Perfekt for sikkerhetskameraer, IoT-enheter og mer.

Kompatibel med: Raspberry Pi 5, Raspberry Pi 4 Model B, Raspberry Pi 3 Model B+, Raspberry Pi 3 Model B, Raspberry Pi 2 Model B, Raspberry Pi Zero 2 W, Raspberry Pi Zero W, og Raspberry Pi Zero.

Note

Denne guiden ble testet og verifisert på en Raspberry Pi 3 Model B som kjører Ubuntu Server 22.04 LTS.

Hva vi bygger

Denne guiden vil lede deg gjennom oppsettet av et komplett system som inkluderer:

  • Ubuntu Server 22.04 LTS: Et solid, lettvekts operativsystem for Pi.
  • En sikker FTP-server (vsftpd): For sikker filoverføring.
  • En brannmur (UFW) & Fail2ban: For å holde uvedkommende ute.
  • En automatisert filbehandler: Et skript som henter nye filer, sender dem som vedlegg på e-post, og deretter rydder opp.
  • E-postalternativer for eldre enheter: To metoder for enheter som ikke støtter moderne TLS:
    • Bruk Forward Emails eldre TLS 1.0-porter (enklest)
    • Sett opp en Postfix SMTP-relé (fungerer med alle e-postleverandører)

Klar? La oss sette i gang.

Del 1: Få Ubuntu Server på din Pi

Først og fremst, få Ubuntu Server til å kjøre på Raspberry Pi-en. Dette er overraskende enkelt takket være Raspberry Pi Imager.

Hva du trenger

  • En kompatibel Raspberry Pi (se listen over)
  • Et microSD-kort (minst 8GB, 16GB+ anbefalt)
  • En datamaskin med microSD-kortleser
  • Passende strømforsyning for din Pi-modell
  • Internett-tilgang (Ethernet eller Wi-Fi)

Note

Eldre modeller som Raspberry Pi 2 eller Pi Zero kan være tregere, men fungerer fint for dette oppsettet.

Flashing av OS

  1. Last ned Raspberry Pi Imager: Last det ned fra den offisielle nettsiden.

  2. Velg OS: I imageren, velg "CHOOSE OS" > "Other general-purpose OS" > "Ubuntu".

    • For 64-bit modeller (Pi 3, 4, 5, Zero 2 W), velg "Ubuntu Server 22.04.1 LTS (64-bit)".
    • For eldre 32-bit modeller (Pi 2, Pi Zero, Pi Zero W), velg "Ubuntu Server 22.04.1 LTS (32-bit)".
  3. Velg lagringsenhet: Velg ditt microSD-kort.

Warning

Dette vil slette microSD-kortet ditt. Sørg for at du har sikkerhetskopiert viktige filer.

  1. Avanserte innstillinger er din venn: Klikk på tannhjulikonet (⚙️) for å sette opp Pi-en i headless-modus (ingen skjerm eller tastatur nødvendig).
    • Vertsnavn: Gi Pi-en et navn (f.eks. pi-server).
    • SSH: Aktiver det og sett brukernavn og passord.
    • Wi-Fi: Hvis du ikke bruker Ethernet, skriv inn Wi-Fi-detaljene dine.
    • Lokalisering: Sett tidssone og tastaturoppsett.
  2. Skriv! Klikk på "WRITE"-knappen og la imageren gjøre jobben sin.

Oppstart og tilkobling

Når imageren er ferdig, sett microSD-kortet inn i Pi-en og koble den til. Gi den noen minutter til å starte opp. Den gjør noe initial oppsett i bakgrunnen. Finn IP-adressen fra ruteren din sin administrasjonsside, og koble til via SSH:

ssh your_username@your_pi_ip_address

Du er inne! Raspberry Pi-en er nå klar for konfigurasjon.

Del 2: Sette opp en sikker FTP-server

Neste steg er å sette opp vsftpd (Very Secure FTP Daemon), konfigurert for maksimal sikkerhet.

Installasjon og konfigurasjon

  1. Installer vsftpd:

    sudo apt update
    sudo apt install vsftpd -y
    
  2. Ta backup av konfigurasjonsfilen:

    sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup
    
  3. Rediger konfigurasjonen:

    sudo nano /etc/vsftpd.conf
    

Tip

Hvis en linje er kommentert ut (starter med #), fjern # for å aktivere den.

Gjør disse endringene:

Innstilling Verdi Formål
anonymous_enable NO Deaktiver anonym FTP-tilgang
local_enable YES Tillat lokale brukere å logge inn
write_enable YES Aktiver filopplastinger
local_umask 022 Sett filrettigheter (644 for filer, 755 for mapper)
chroot_local_user YES Lås brukere til hjemmemappen deres
allow_writeable_chroot YES Tillat opplastinger i chroot jail
  1. Legg til passiv portrekkevidde: Legg til disse linjene på slutten av filen. Dette trengs for brannmuren.

    pasv_enable=YES
    pasv_min_port=40000
    pasv_max_port=50000
    
  2. Aktiver logging: Legg til disse linjene for å aktivere logging for Fail2ban.

    xferlog_enable=YES
    xferlog_file=/var/log/vsftpd.log
    log_ftp_protocol=YES
    
  3. Lagre og start på nytt: Trykk Ctrl+O, Enter, Ctrl+X, og start deretter tjenesten på nytt:

    sudo systemctl restart vsftpd
    

Opprette en FTP-bruker

Opprett en dedikert, begrenset bruker for FTP-tilgang.

  1. Opprett brukeren:

    sudo adduser ftpuser
    

    Følg instruksjonene for å sette passord. De andre feltene (navn, telefon, osv.) kan stå tomme.

  2. Opprett mappestrukturen:

    sudo mkdir -p /home/ftpuser/ftp/uploads
    
    • /home/ftpuser/ftp - Hoved FTP-mappe
    • /home/ftpuser/ftp/uploads - Der filer skal lastes opp
  3. Sett rettigheter:

    sudo chown -R ftpuser:ftpuser /home/ftpuser/ftp
    sudo chmod 755 /home/ftpuser/ftp
    sudo chmod 755 /home/ftpuser/ftp/uploads
    

Del 3: Brannmur og beskyttelse mot brute-force

Sikre Pi-en med UFW (Uncomplicated Firewall) og Fail2ban.

Sette opp UFW

  1. Installer UFW:

    sudo apt install ufw -y
    
  2. Sett standardregler:

    sudo ufw default deny incoming
    sudo ufw default allow outgoing
    
  3. Tillat SSH (kritisk!):

    sudo ufw allow ssh comment 'SSH access'
    

Warning

Tillat alltid SSH før du aktiverer brannmuren, ellers låser du deg ute!

  1. Tillat FTP-porter:

    sudo ufw allow 20/tcp comment 'FTP data'
    sudo ufw allow 21/tcp comment 'FTP control'
    sudo ufw allow 40000:50000/tcp comment 'FTP passive mode'
    
  2. Aktiver brannmuren:

    sudo ufw enable
    

Sette opp Fail2ban

Fail2ban blokkerer automatisk IP-adresser etter gjentatte mislykkede påloggingsforsøk.

  1. Installer Fail2ban:

    sudo apt install fail2ban -y
    
  2. Opprett lokal konfigurasjon:

    sudo nano /etc/fail2ban/jail.local
    
  3. Legg til disse konfigurasjonene:

    [DEFAULT]
    bantime = 3600
    findtime = 600
    maxretry = 5
    
    [sshd]
    enabled = true
    port = ssh
    logpath = /var/log/auth.log
    
    [vsftpd]
    enabled = true
    port = ftp,ftp-data,40000:50000
    logpath = /var/log/vsftpd.log
    maxretry = 3
    
  4. Restart Fail2ban:

    sudo systemctl restart fail2ban
    

Part 4: Automated File Processing with Email Notifications

Now for the magic: a script that monitors the FTP folder, emails new files as attachments, and deletes them. There are two approaches depending on your email provider:

If you have a Forward Email account, use the Email API for the most reliable delivery.

Get Your API Key

  1. Log in to Forward Email
  2. Navigate to My Account → Security
  3. Scroll down to the "Developer Access" section at the bottom
  4. Copy your API key

Warning

Keep your API key private at all times. Never share it publicly or commit it to version control.

Note

The Enhanced Protection plan ($3/month) or higher is required for API access.

Install inotify-tools

sudo apt install inotify-tools -y

Create the Monitoring Script

sudo nano /usr/local/bin/ftp-monitor.sh

Paste this script:

#!/bin/bash

# Configuration
WATCH_DIR="/home/ftpuser/ftp/uploads"
FROM_EMAIL="noreply@yourdomain.com"
TO_EMAIL="your-email@example.com"
API_KEY="your_forward_email_api_key"  # Replace with your actual API key

# Monitor for new files
inotifywait -m -e close_write --format '%w%f' "$WATCH_DIR" | while read FILEPATH
do
    FILENAME=$(basename "$FILEPATH")
    FOLDERNAME=$(basename "$WATCH_DIR")
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    SUBJECT="$TIMESTAMP - $FOLDERNAME - $FILENAME"

    # Base64 encode the file
    FILE_CONTENT=$(base64 -w 0 "$FILEPATH")

    # Send email with attachment via Forward Email API
    RESPONSE=$(curl -X POST https://api.forwardemail.net/v1/emails \
      -u "$API_KEY:" \
      -H "Content-Type: application/json" \
      -d '{
        "from": "'"$FROM_EMAIL"'",
        "to": "'"$TO_EMAIL"'",
        "subject": "'"$SUBJECT"'",
        "text": "New file uploaded: '"$FILENAME"'",
        "attachments": [
          {
            "filename": "'"$FILENAME"'",
            "content": "'"$FILE_CONTENT"'",
            "encoding": "base64"
          }
        ]
      }')

    # Check if email was sent successfully
    if echo "$RESPONSE" | grep -q '"statusCode":200'; then
        echo "Email sent successfully for $FILENAME"
        # Delete the file
        rm -f "$FILEPATH"
        echo "Deleted $FILENAME"
    else
        echo "Failed to send email for $FILENAME"
        echo "Response: $RESPONSE"
    fi
done

Make it executable:

sudo chmod +x /usr/local/bin/ftp-monitor.sh

Option 2: Using Other Email Providers

If you prefer to use Gmail, Outlook, Yahoo, or another provider, modify the script to use sendmail or msmtp instead of the Forward Email API.

Install msmtp

sudo apt install msmtp msmtp-mta -y

Configure msmtp

Create the configuration file:

sudo nano /etc/msmtprc

Add your provider's settings (example for Gmail):

defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        /var/log/msmtp.log

account        gmail
host           smtp.gmail.com
port           587
from           your-email@gmail.com
user           your-email@gmail.com
password       your-app-password

account default : gmail

Secure the file:

sudo chmod 600 /etc/msmtprc

Create the Alternative Monitoring Script

sudo nano /usr/local/bin/ftp-monitor.sh

Paste this script:

#!/bin/bash

# Configuration
WATCH_DIR="/home/ftpuser/ftp/uploads"
FROM_EMAIL="your-email@gmail.com"
TO_EMAIL="recipient@example.com"

# Monitor for new files
inotifywait -m -e close_write --format '%w%f' "$WATCH_DIR" | while read FILEPATH
do
    FILENAME=$(basename "$FILEPATH")
    FOLDERNAME=$(basename "$WATCH_DIR")
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    SUBJECT="$TIMESTAMP - $FOLDERNAME - $FILENAME"

    # Send email with attachment using msmtp
    (
        echo "To: $TO_EMAIL"
        echo "From: $FROM_EMAIL"
        echo "Subject: $SUBJECT"
        echo "MIME-Version: 1.0"
        echo "Content-Type: multipart/mixed; boundary=\"BOUNDARY\""
        echo ""
        echo "--BOUNDARY"
        echo "Content-Type: text/plain; charset=utf-8"
        echo ""
        echo "New file uploaded: $FILENAME"
        echo ""
        echo "--BOUNDARY"
        echo "Content-Type: application/octet-stream; name=\"$FILENAME\""
        echo "Content-Transfer-Encoding: base64"
        echo "Content-Disposition: attachment; filename=\"$FILENAME\""
        echo ""
        base64 "$FILEPATH"
        echo ""
        echo "--BOUNDARY--"
    ) | msmtp -t

    # Check if email was sent successfully
    if [ $? -eq 0 ]; then
        echo "Email sent successfully for $FILENAME"
        # Delete the file
        rm -f "$FILEPATH"
        echo "Deleted $FILENAME"
    else
        echo "Failed to send email for $FILENAME"
    fi
done

Gjør det kjørbart:

sudo chmod +x /usr/local/bin/ftp-monitor.sh

Opprett en Systemd-tjeneste

sudo nano /etc/systemd/system/ftp-monitor.service

Legg til dette innholdet:

[Unit]
Description=FTP Upload Monitor
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/ftp-monitor.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Aktiver og start tjenesten:

sudo systemctl daemon-reload
sudo systemctl enable ftp-monitor.service
sudo systemctl start ftp-monitor.service

Sjekk status:

sudo systemctl status ftp-monitor.service

Del 5: E-postalternativer for eldre enheter

Enheter som FOSSCAM-kameraer støtter ofte ikke moderne TLS-versjoner. Det finnes to løsninger:

Hvis du bruker Forward Email, er dette den enkleste løsningen. Forward Email tilbyr dedikerte legacy TLS 1.0-porter spesielt for eldre enheter som kameraer, skrivere, skannere og faksmaskiner.

Priser

Forward Email tilbyr flere planer:

Plan Pris Funksjoner
Gratis $0/måned Kun e-postvideresending (ingen sending)
Forbedret beskyttelse $3/måned SMTP-tilgang + legacy TLS 1.0-porter
Team $9/måned Forbedret + teamfunksjoner
Enterprise $250/måned Team + ubegrensede API-forespørsler

Important

Forbedret beskyttelsesplan ($3/måned) eller høyere kreves for SMTP-tilgang og støtte for legacy TLS 1.0-porter.

Lær mer på Forward Email Pricing.

Generer passordet ditt

Før du konfigurerer enheten din, generer et passord i Forward Email:

  1. Logg inn på Forward Email
  2. Gå til Min konto → Domener → [Ditt domene] → Alias
  3. Opprett eller velg et alias (f.eks. camera@yourdomain.com)
  4. Klikk "Generate Password" ved siden av aliaset
  5. Kopier det genererte passordet – dette bruker du til SMTP-autentisering

Tip

Hvert alias kan ha sitt eget passord. Dette er nyttig for å spore hvilken enhet som sendte hvilken e-post.

Konfigurer enheten din

Bruk disse innstillingene i kameraet, skriveren, skanneren eller annen eldre enhet:

Innstilling Verdi
SMTP-server smtp.forwardemail.net
Port (SSL/TLS) 2455
Port (STARTTLS) 2555 (alternativ)
Brukernavn Din alias-e-post (f.eks. camera@yourdomain.com)
Passord Passordet fra "Generate Password"
Autentisering Påkrevd
Kryptering SSL/TLS (anbefalt) eller STARTTLS

Warning

Disse portene bruker den utdaterte TLS 1.0-protokollen som har kjente sikkerhetssårbarheter (BEAST, POODLE). Bruk kun hvis enheten din ikke støtter moderne TLS 1.2+.

Konfigurer enheten din med disse innstillingene, så sender den e-post direkte gjennom Forward Email uten behov for en lokal reléserver.

For flere detaljer, se Forward Email FAQ om Legacy TLS-støtte.

Alternativ 2: Sett opp en Postfix SMTP-relé

Hvis du ikke bruker Forward Email, eller foretrekker en lokal reléløsning, sett opp Postfix på Raspberry Pi for å fungere som mellomledd. Dette fungerer med hvilken som helst e-postleverandør (Gmail, Outlook, Yahoo, AOL, osv.).

Installer Postfix

sudo apt update
sudo apt install postfix mailutils libsasl2-modules -y

Under installasjonen:

  • Velg "Internet Site"
  • Skriv inn Pi-ens vertsnavn (f.eks. raspberrypi-ftp) for "System mail name"

Velg din e-postleverandør

Leverandør SMTP-server Port Krever app-passord?
Gmail smtp.gmail.com 587 Ja
Outlook smtp-mail.outlook.com 587 Ja
Yahoo smtp.mail.yahoo.com 465 Ja
AOL smtp.aol.com 587 Ja

Skaff et app-spesifikt passord

De fleste leverandører krever app-passord for tredjepartsapplikasjoner. Generer ett fra sikkerhetsinnstillingene til e-postleverandøren din:

Important

Bruk aldri ditt vanlige e-postpassord. Bruk alltid et app-spesifikt passord.

Konfigurer SASL-autentisering

Opprett passordfilen for valgt leverandør. Dette eksempelet bruker Yahoo:

sudo mkdir -p /etc/postfix/sasl
sudo chmod 700 /etc/postfix/sasl
sudo nano /etc/postfix/sasl/sasl_passwd

Legg til denne linjen (juster server og port for din leverandør):

[smtp.mail.yahoo.com]:465 your_email@yahoo.com:your_app_password

For Gmail, bruk:

[smtp.gmail.com]:587 your_email@gmail.com:your_app_password

Sikre og hashe filen:

sudo chmod 600 /etc/postfix/sasl/sasl_passwd
sudo postmap /etc/postfix/sasl/sasl_passwd

Konfigurer e-postadresse-mapping

Omskriv lokale e-postadresser for å matche e-postleverandøren din:

sudo mkdir -p /etc/postfix/map
sudo chmod 700 /etc/postfix/map
sudo nano /etc/postfix/map/regex_map

Legg til denne linjen (erstatt HOSTNAME med Pi-ens vertsnavn og bruk din e-post):

/.+@HOSTNAME/    your_email@provider.com

Eksempel:

/.+@raspberrypi-ftp/    john@yahoo.com

Sikre filen:

sudo chmod 600 /etc/postfix/map/regex_map

Konfigurer Postfix hovedinnstillinger

Rediger hovedkonfigurasjonen:

sudo nano /etc/postfix/main.cf

Finn og oppdater relay host (eller legg til på slutten):

relayhost = [smtp.mail.yahoo.com]:465

Legg til disse innstillingene på slutten av filen:

# SMTP Relay Configuration
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_wrappermode = yes
smtp_tls_security_level = encrypt
smtp_generic_maps = regexp:/etc/postfix/map/regex_map

# Network settings
inet_interfaces = all
inet_protocols = ipv4
mynetworks = 127.0.0.0/8 [::1]/128 192.168.1.0/24

Tip

For Gmail (port 587), sett smtp_tls_wrappermode = no i stedet for yes.

Warning

Oppdater mynetworks med ditt faktiske nettverksområde. Legg kun til pålitelige nettverk – enheter på disse nettverkene kan sende e-post uten autentisering.

Vanlige nettverksområder:

Nettverksområde IP-adresseområde
192.168.0.0/24 192.168.0.1 - 192.168.0.254
192.168.1.0/24 192.168.1.1 - 192.168.1.254
10.0.0.0/8 10.0.0.0 - 10.255.255.255

Oppdater brannmur og start på nytt

sudo ufw allow 25/tcp comment 'SMTP for local devices'
sudo systemctl restart postfix

Sjekk at Postfix kjører:

sudo systemctl status postfix

Test reléet

Send en test-epost:

echo "Test from Postfix" | mail -s "Test" your_email@provider.com

Sjekk loggene:

sudo tail -f /var/log/mail.log

Se etter status=sent for å bekrefte suksess.

Konfigurer enheten din

I kamera- eller enhetsinnstillingene dine:

  • SMTP-server: Din Pi sin IP-adresse (f.eks. 192.168.1.100)
  • SMTP-port: 25
  • Autentisering: Ingen
  • Kryptering: Ingen (kun lokalt nettverk)

Feilsøking

Hvis problemer oppstår, sjekk disse loggfilene:

FTP-server:

sudo tail -f /var/log/vsftpd.log

Fail2ban:

sudo fail2ban-client status
sudo tail -f /var/log/fail2ban.log

Filovervåker:

sudo journalctl -u ftp-monitor.service -f

Postfix Mail:

sudo tail -f /var/log/mail.log
mailq  # Vis mail-kø

Avslutning

Raspberry Pi er nå et komplett automatisert system med sikre filopplastinger, automatiske e-postvarsler med vedlegg, og SMTP-relay-funksjoner for eldre enheter. Enten du bruker Forward Email sine eldre TLS-porter eller en lokal Postfix-relay, kan eldre enheter nå sende e-poster pålitelig gjennom moderne e-postleverandører.