Biến Raspberry Pi của Bạn Thành Máy Chủ FTP An Toàn với Chuyển Tiếp Email

Bạn có một chiếc Raspberry Pi đang để không? Dù đó là Pi 5 mới nhất, Pi 4, Pi Zero, hay thậm chí là một mẫu cũ hơn, hướng dẫn này sẽ chỉ cho bạn cách biến nó thành một máy chủ tập tin mạnh mẽ, tự động với khả năng chuyển tiếp email. Hoàn hảo cho camera an ninh, thiết bị IoT, và nhiều hơn nữa.

Tương thích với: 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, và Raspberry Pi Zero.

Note

Hướng dẫn này đã được thử nghiệm và xác minh trên Raspberry Pi 3 Model B chạy Ubuntu Server 22.04 LTS.

Chúng Ta Đang Xây Dựng Gì

Hướng dẫn này sẽ dẫn bạn qua việc thiết lập một hệ thống hoàn chỉnh bao gồm:

  • Ubuntu Server 22.04 LTS: Một hệ điều hành nhẹ, ổn định cho Pi.
  • Máy Chủ FTP An Toàn (vsftpd): Để gửi tập tin một cách an toàn.
  • Tường Lửa (UFW) & Fail2ban: Để ngăn chặn kẻ xấu.
  • Trình Xử Lý Tập Tin Tự Động: Một script tự động lấy tập tin mới, gửi email kèm tập tin đính kèm, rồi dọn dẹp sau đó.
  • Tùy Chọn Email cho Thiết Bị Cũ: Hai cách tiếp cận cho các thiết bị không hỗ trợ TLS hiện đại:
    • Dùng cổng TLS 1.0 cũ của Forward Email (dễ nhất)
    • Thiết lập relay SMTP Postfix (hoạt động với mọi nhà cung cấp email)

Sẵn sàng chưa? Bắt đầu thôi.

Phần 1: Cài Đặt Ubuntu Server trên Pi của Bạn

Trước tiên, hãy cài Ubuntu Server chạy trên Raspberry Pi. Việc này khá dễ dàng nhờ Raspberry Pi Imager.

Những Gì Bạn Cần

  • Bất kỳ Raspberry Pi tương thích nào (xem danh sách ở trên)
  • Thẻ microSD (tối thiểu 8GB, khuyến nghị 16GB trở lên)
  • Máy tính có đầu đọc thẻ microSD
  • Nguồn điện phù hợp với mẫu Pi của bạn
  • Kết nối Internet (Ethernet hoặc Wi-Fi)

Note

Các mẫu cũ như Raspberry Pi 2 hoặc Pi Zero có thể chậm hơn nhưng vẫn hoạt động tốt cho thiết lập này.

Ghi Hệ Điều Hành

  1. Tải Raspberry Pi Imager: Tải về từ trang chính thức.

  2. Chọn Hệ Điều Hành: Trong imager, chọn "CHOOSE OS" > "Other general-purpose OS" > "Ubuntu".

    • Với các mẫu 64-bit (Pi 3, 4, 5, Zero 2 W), chọn "Ubuntu Server 22.04.1 LTS (64-bit)".
    • Với các mẫu 32-bit cũ hơn (Pi 2, Pi Zero, Pi Zero W), chọn "Ubuntu Server 22.04.1 LTS (32-bit)".
  3. Chọn Bộ Nhớ: Chọn thẻ microSD của bạn.

Warning

Việc này sẽ xóa sạch thẻ microSD của bạn. Hãy chắc chắn bạn đã sao lưu mọi dữ liệu quan trọng.

  1. Tùy Chọn Nâng Cao là Người Bạn Của Bạn: Nhấn vào biểu tượng bánh răng (⚙️) để thiết lập Pi chạy chế độ không đầu (không cần màn hình hay bàn phím).
    • Hostname: Đặt tên cho Pi của bạn (ví dụ: pi-server).
    • SSH: Bật SSH và đặt tên người dùng cùng mật khẩu.
    • Wi-Fi: Nếu không dùng Ethernet, nhập thông tin Wi-Fi của bạn.
    • Locale: Đặt múi giờ và bố cục bàn phím.
  2. Viết! Nhấn nút "WRITE" và để trình tạo ảnh làm việc của nó.

Khởi động & Kết nối

Khi trình tạo ảnh hoàn tất, hãy cắm thẻ microSD vào Pi và cắm nguồn. Đợi vài phút để khởi động. Nó đang thực hiện một số thiết lập ban đầu ở nền. Tìm địa chỉ IP của nó từ trang quản trị router của bạn, sau đó kết nối qua SSH:

ssh your_username@your_pi_ip_address

Bạn đã vào! Raspberry Pi bây giờ đã sẵn sàng để cấu hình.

Phần 2: Thiết lập Máy chủ FTP An toàn

Tiếp theo, thiết lập vsftpd (Very Secure FTP Daemon), được cấu hình để bảo mật tối đa.

Cài đặt & Cấu hình

  1. Cài đặt vsftpd:

    sudo apt update
    sudo apt install vsftpd -y
    
  2. Sao lưu file cấu hình:

    sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup
    
  3. Chỉnh sửa cấu hình:

    sudo nano /etc/vsftpd.conf
    

Tip

Nếu một dòng bị chú thích (bắt đầu bằng #), hãy bỏ chú thích bằng cách xóa #.

Thực hiện các thay đổi sau:

Cài đặt Giá trị Mục đích
anonymous_enable NO Vô hiệu hóa truy cập FTP ẩn danh
local_enable YES Cho phép người dùng địa phương đăng nhập
write_enable YES Cho phép tải lên tập tin
local_umask 022 Đặt quyền tập tin (644 cho tập tin, 755 cho thư mục)
chroot_local_user YES Giới hạn người dùng trong thư mục chính của họ
allow_writeable_chroot YES Cho phép tải lên trong môi trường chroot
  1. Thêm dải cổng Passive: Thêm các dòng này vào cuối file. Điều này cần thiết cho tường lửa.

    pasv_enable=YES
    pasv_min_port=40000
    pasv_max_port=50000
    
  2. Bật ghi nhật ký: Thêm các dòng này để bật ghi nhật ký cho Fail2ban.

    xferlog_enable=YES
    xferlog_file=/var/log/vsftpd.log
    log_ftp_protocol=YES
    
  3. Lưu và Khởi động lại: Nhấn Ctrl+O, Enter, Ctrl+X, sau đó khởi động lại dịch vụ:

    sudo systemctl restart vsftpd
    

Tạo Người dùng FTP

Tạo một người dùng riêng biệt, bị giới hạn cho truy cập FTP.

  1. Tạo người dùng:

    sudo adduser ftpuser
    

    Làm theo hướng dẫn để đặt mật khẩu. Các trường khác (tên, điện thoại, v.v.) có thể để trống.

  2. Tạo cấu trúc thư mục:

    sudo mkdir -p /home/ftpuser/ftp/uploads
    
    • /home/ftpuser/ftp - Thư mục FTP chính
    • /home/ftpuser/ftp/uploads - Nơi các tập tin sẽ được tải lên
  3. Đặt quyền:

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

Phần 3: Tường lửa và Bảo vệ Chống Tấn công Brute-Force

Bảo mật Pi với UFW (Uncomplicated Firewall) và Fail2ban.

Thiết lập UFW

  1. Cài đặt UFW:

    sudo apt install ufw -y
    
  2. Đặt chính sách mặc định:

    sudo ufw default deny incoming
    sudo ufw default allow outgoing
    
  3. Cho phép SSH (rất quan trọng!):

    sudo ufw allow ssh comment 'SSH access'
    

Warning

Luôn cho phép SSH trước khi bật tường lửa, nếu không bạn sẽ bị khóa truy cập!

  1. Cho phép các cổng FTP:

    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. Bật tường lửa:

    sudo ufw enable
    

Thiết lập Fail2ban

Fail2ban tự động chặn các địa chỉ IP sau nhiều lần đăng nhập thất bại.

  1. Cài đặt Fail2ban:

    sudo apt install fail2ban -y
    
  2. Tạo cấu hình cục bộ:

    sudo nano /etc/fail2ban/jail.local
    
  3. Thêm các cấu hình sau:

    [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

Làm cho nó có thể thực thi:

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

Tạo một dịch vụ Systemd

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

Thêm nội dung này:

[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

Kích hoạt và khởi động dịch vụ:

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

Kiểm tra trạng thái:

sudo systemctl status ftp-monitor.service

Phần 5: Tùy chọn Email cho các Thiết bị Cũ

Các thiết bị như camera FOSSCAM thường không hỗ trợ các phiên bản TLS hiện đại. Có hai giải pháp:

Nếu bạn đang sử dụng Forward Email, đây là giải pháp dễ nhất. Forward Email cung cấp các cổng TLS 1.0 cũ dành riêng cho các thiết bị cũ như camera, máy in, máy quét và máy fax.

Bảng giá

Forward Email cung cấp một số gói:

Gói Giá Tính năng
Miễn phí $0/tháng Chuyển tiếp email chỉ (không gửi)
Bảo vệ Nâng cao $3/tháng Truy cập SMTP + cổng TLS 1.0 cũ
Nhóm $9/tháng Bảo vệ nâng cao + tính năng nhóm
Doanh nghiệp $250/tháng Nhóm + yêu cầu API không giới hạn

Important

Gói Bảo vệ Nâng cao ($3/tháng) hoặc cao hơn là bắt buộc để truy cập SMTP và hỗ trợ cổng TLS 1.0 cũ.

Tìm hiểu thêm tại Forward Email Pricing.

Tạo Mật khẩu của bạn

Trước khi cấu hình thiết bị, tạo mật khẩu trong Forward Email:

  1. Đăng nhập vào Forward Email
  2. Điều hướng đến Tài khoản của tôi → Tên miền → [Tên miền của bạn] → Bí danh
  3. Tạo hoặc chọn một bí danh (ví dụ: camera@yourdomain.com)
  4. Nhấn "Generate Password" bên cạnh bí danh
  5. Sao chép mật khẩu được tạo - bạn sẽ dùng nó để xác thực SMTP

Tip

Mỗi bí danh có thể có mật khẩu riêng. Điều này hữu ích để theo dõi thiết bị nào đã gửi email nào.

Cấu hình Thiết bị của bạn

Sử dụng các thiết lập này trong camera, máy in, máy quét hoặc thiết bị cũ khác:

Cài đặt Giá trị
Máy chủ SMTP smtp.forwardemail.net
Cổng (SSL/TLS) 2455
Cổng (STARTTLS) 2555 (thay thế)
Tên đăng nhập Email bí danh của bạn (ví dụ: camera@yourdomain.com)
Mật khẩu Mật khẩu từ "Generate Password"
Xác thực Bắt buộc
Mã hóa SSL/TLS (khuyến nghị) hoặc STARTTLS

Warning

Các cổng này sử dụng giao thức TLS 1.0 đã lỗi thời và có các lỗ hổng bảo mật đã biết (BEAST, POODLE). Chỉ sử dụng nếu thiết bị của bạn không hỗ trợ TLS 1.2+ hiện đại.

Chỉ cần cấu hình thiết bị với các thiết lập này và nó sẽ gửi email trực tiếp qua Forward Email mà không cần máy chủ chuyển tiếp cục bộ.

Để biết thêm chi tiết, xem Câu hỏi thường gặp về Hỗ trợ TLS Cũ của Forward Email.

Lựa chọn 2: Thiết lập một máy chủ chuyển tiếp SMTP Postfix

Nếu bạn không sử dụng Forward Email hoặc muốn giải pháp chuyển tiếp cục bộ, hãy thiết lập Postfix trên Raspberry Pi để làm trung gian. Điều này hoạt động với bất kỳ nhà cung cấp email nào (Gmail, Outlook, Yahoo, AOL, v.v.).

Cài đặt Postfix

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

Trong quá trình cài đặt:

  • Chọn "Internet Site"
  • Nhập hostname của Pi của bạn (ví dụ, raspberrypi-ftp) cho "System mail name"

Chọn Nhà Cung Cấp Email Của Bạn

Nhà Cung Cấp Máy chủ SMTP Cổng Cần Mật Khẩu Ứng Dụng?
Gmail smtp.gmail.com 587
Outlook smtp-mail.outlook.com 587
Yahoo smtp.mail.yahoo.com 465
AOL smtp.aol.com 587

Lấy Mật Khẩu Ứng Dụng Riêng

Hầu hết các nhà cung cấp yêu cầu mật khẩu ứng dụng cho các ứng dụng bên thứ ba. Tạo một mật khẩu từ cài đặt bảo mật của nhà cung cấp email của bạn:

Important

Không bao giờ sử dụng mật khẩu email thông thường của bạn. Luôn sử dụng mật khẩu ứng dụng riêng.

Cấu Hình Xác Thực SASL

Tạo file mật khẩu cho nhà cung cấp bạn chọn. Ví dụ này dùng Yahoo:

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

Thêm dòng này (điều chỉnh máy chủ và cổng cho nhà cung cấp của bạn):

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

Với Gmail, dùng:

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

Bảo mật và băm file:

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

Cấu Hình Bản Đồ Địa Chỉ Email

Viết lại địa chỉ email nội bộ để phù hợp với nhà cung cấp email của bạn:

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

Thêm dòng này (thay HOSTNAME bằng hostname của Pi và dùng email của bạn):

/.+@HOSTNAME/    your_email@provider.com

Ví dụ:

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

Bảo mật file:

sudo chmod 600 /etc/postfix/map/regex_map

Cấu Hình Các Thiết Lập Chính Của Postfix

Chỉnh sửa cấu hình chính:

sudo nano /etc/postfix/main.cf

Tìm và cập nhật relay host (hoặc thêm vào cuối file):

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

Thêm các thiết lập này vào cuối file:

# Cấu hình SMTP Relay
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

# Thiết lập mạng
inet_interfaces = all
inet_protocols = ipv4
mynetworks = 127.0.0.0/8 [::1]/128 192.168.1.0/24

Tip

Với Gmail (cổng 587), đặt smtp_tls_wrappermode = no thay vì yes.

Warning

Cập nhật mynetworks với phạm vi mạng thực tế của bạn. Chỉ thêm các mạng tin cậy - bất kỳ thiết bị nào trong các mạng này có thể chuyển tiếp mail mà không cần xác thực.

Các phạm vi mạng phổ biến:

Phạm Vi Mạng Dải Địa Chỉ IP
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

Cập Nhật Tường Lửa và Khởi Động Lại

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

Kiểm tra Postfix đang chạy:

sudo systemctl status postfix

Kiểm Tra Relay

Gửi email thử:

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

Kiểm tra nhật ký:

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

Tìm status=sent để xác nhận thành công.

Cấu Hình Thiết Bị Của Bạn

Trong cài đặt camera hoặc thiết bị của bạn:

  • Máy chủ SMTP: Địa chỉ IP của Pi của bạn (ví dụ, 192.168.1.100)
  • Cổng SMTP: 25
  • Xác thực: Không có
  • Mã hóa: Không có (chỉ mạng nội bộ)

Khắc phục sự cố

Nếu gặp sự cố, hãy kiểm tra các tệp nhật ký sau:

Máy chủ FTP:

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

Fail2ban:

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

Giám sát tệp:

sudo journalctl -u ftp-monitor.service -f

Thư Postfix:

sudo tail -f /var/log/mail.log
mailq  # Xem hàng đợi thư

Kết thúc

Raspberry Pi giờ đây là một hệ thống tự động hoàn chỉnh với tải lên tệp an toàn, thông báo email tự động kèm tệp đính kèm, và khả năng chuyển tiếp SMTP cho các thiết bị cũ. Dù sử dụng các cổng TLS kế thừa của Forward Email hay bộ chuyển tiếp Postfix cục bộ, các thiết bị cũ giờ đây có thể gửi email một cách đáng tin cậy qua các nhà cung cấp email hiện đại.