라즈베리 파이를 이메일 릴레이가 가능한 보안 FTP 서버로 만들기
라즈베리 파이가 먼지만 쌓이고 있나요? 최신 Pi 5, Pi 4, Pi Zero 또는 구형 모델이든 상관없이, 이 가이드는 이를 강력하고 자동화된 파일 서버이자 이메일 릴레이 기능이 있는 서버로 만드는 방법을 보여줍니다. 보안 카메라, IoT 기기 등에 완벽합니다.
호환 모델: 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, Raspberry Pi Zero.
Note
이 가이드는 Ubuntu Server 22.04 LTS가 설치된 Raspberry Pi 3 Model B에서 테스트 및 검증되었습니다.
우리가 만들 것
이 가이드는 다음을 포함하는 완전한 시스템 설정 과정을 안내합니다:
- Ubuntu Server 22.04 LTS: Pi에 적합한 견고하고 가벼운 운영체제.
- 보안 FTP 서버 (vsftpd): 안전하게 파일을 올릴 수 있는 서버.
- 방화벽 (UFW) 및 Fail2ban: 악성 접근 차단.
- 자동 파일 처리기: 새 파일을 감지해 첨부파일로 이메일을 보내고, 처리 후 정리하는 스크립트.
- 구형 기기를 위한 이메일 옵션: 최신 TLS를 지원하지 않는 기기를 위한 두 가지 방법:
- Forward Email의 구형 TLS 1.0 포트 사용 (가장 쉬움)
- Postfix SMTP 릴레이 설정 (모든 이메일 제공자와 호환)
준비되셨나요? 시작해봅시다.
1부: Pi에 Ubuntu Server 설치하기
먼저, 라즈베리 파이에 Ubuntu Server를 설치하세요. Raspberry Pi Imager 덕분에 매우 쉽습니다.
필요한 것
- 호환 가능한 라즈베리 파이 (위 목록 참조)
- 마이크로SD 카드 (최소 8GB, 16GB 이상 권장)
- 마이크로SD 카드 리더가 있는 컴퓨터
- Pi 모델에 맞는 적절한 전원 공급 장치
- 인터넷 연결 (이더넷 또는 Wi-Fi)
Note
Raspberry Pi 2나 Pi Zero 같은 구형 모델은 속도가 느릴 수 있지만 이 설정에는 문제없이 작동합니다.
OS 플래싱하기
-
Raspberry Pi Imager 다운로드: 공식 웹사이트에서 다운로드하세요.
-
운영체제 선택: Imager에서 "CHOOSE OS" > "Other general-purpose OS" > "Ubuntu"를 선택하세요.
- 64비트 모델 (Pi 3, 4, 5, Zero 2 W)에는 **"Ubuntu Server 22.04.1 LTS (64-bit)"**를 선택하세요.
- 구형 32비트 모델 (Pi 2, Pi Zero, Pi Zero W)에는 **"Ubuntu Server 22.04.1 LTS (32-bit)"**를 선택하세요.
-
저장 장치 선택: 마이크로SD 카드를 선택하세요.
Warning
이 작업은 마이크로SD 카드의 모든 데이터를 삭제합니다. 중요한 데이터는 반드시 백업하세요.
- 고급 옵션 활용: 톱니바퀴 아이콘(⚙️)을 클릭해 헤드리스 모드(모니터나 키보드 없이 사용)를 설정하세요.
- 호스트명: Pi 이름 지정 (예:
pi-server). - SSH: 활성화하고 사용자 이름과 비밀번호 설정.
- Wi-Fi: 이더넷을 사용하지 않는 경우 Wi-Fi 정보 입력.
- 로케일: 시간대와 키보드 레이아웃 설정.
- 호스트명: Pi 이름 지정 (예:
- 작성하기! "WRITE" 버튼을 클릭하고 이미저가 작업을 완료할 때까지 기다리세요.
부팅 및 연결
이미저가 완료되면 microSD 카드를 라즈베리 파이에 넣고 전원을 연결하세요. 부팅하는 데 몇 분 정도 걸립니다. 백그라운드에서 초기 설정을 진행 중입니다. 라우터 관리자 페이지에서 IP 주소를 확인한 후 SSH로 연결하세요:
ssh your_username@your_pi_ip_address
접속 완료! 라즈베리 파이가 이제 설정할 준비가 되었습니다.
2부: 보안 FTP 서버 설정
다음으로, 최대 보안을 위해 구성된 vsftpd(Very Secure FTP Daemon)를 설정합니다.
설치 및 구성
-
vsftpd 설치:
sudo apt update sudo apt install vsftpd -y -
설정 파일 백업:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup -
설정 파일 편집:
sudo nano /etc/vsftpd.conf
Tip
줄이 주석 처리되어 있으면(앞에 #가 있으면) #를 제거하여 주석을 해제하세요.
다음과 같이 변경하세요:
| 설정 | 값 | 목적 |
|---|---|---|
anonymous_enable |
NO |
익명 FTP 접근 비활성화 |
local_enable |
YES |
로컬 사용자 로그인 허용 |
write_enable |
YES |
파일 업로드 활성화 |
local_umask |
022 |
파일 권한 설정 (파일은 644, 디렉터리는 755) |
chroot_local_user |
YES |
사용자를 홈 디렉터리에 감금 |
allow_writeable_chroot |
YES |
chroot 감금 내 업로드 허용 |
-
수동 포트 범위 추가: 방화벽 설정을 위해 파일 끝에 다음 줄을 추가하세요.
pasv_enable=YES pasv_min_port=40000 pasv_max_port=50000 -
로깅 활성화: Fail2ban 로그를 위해 다음 줄을 추가하세요.
xferlog_enable=YES xferlog_file=/var/log/vsftpd.log log_ftp_protocol=YES -
저장 및 재시작:
Ctrl+O,Enter,Ctrl+X를 누른 후 서비스를 재시작하세요:sudo systemctl restart vsftpd
FTP 사용자 생성
FTP 접근을 위한 전용 제한 사용자 계정을 만듭니다.
-
사용자 생성:
sudo adduser ftpuser비밀번호 설정 프롬프트에 따라 입력하세요. 이름, 전화번호 등 다른 항목은 비워둬도 됩니다.
-
디렉터리 구조 생성:
sudo mkdir -p /home/ftpuser/ftp/uploads/home/ftpuser/ftp- 메인 FTP 디렉터리/home/ftpuser/ftp/uploads- 파일 업로드 위치
-
권한 설정:
sudo chown -R ftpuser:ftpuser /home/ftpuser/ftp sudo chmod 755 /home/ftpuser/ftp sudo chmod 755 /home/ftpuser/ftp/uploads
3부: 방화벽 및 무차별 대입 공격 방지
UFW(간단 방화벽)와 Fail2ban으로 라즈베리 파이를 보호하세요.
UFW 설정
-
UFW 설치:
sudo apt install ufw -y -
기본 정책 설정:
sudo ufw default deny incoming sudo ufw default allow outgoing -
SSH 허용 (중요!):
sudo ufw allow ssh comment 'SSH access'
Warning
방화벽을 활성화하기 전에 반드시 SSH를 허용하세요. 그렇지 않으면 접속이 차단됩니다!
-
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' -
방화벽 활성화:
sudo ufw enable
Fail2ban 설정
Fail2ban은 반복된 로그인 실패 시 IP 주소를 자동으로 차단합니다.
-
Fail2ban 설치:
sudo apt install fail2ban -y -
로컬 설정 파일 생성:
sudo nano /etc/fail2ban/jail.local -
다음 설정 추가:
[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 -
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:
Option 1: Using Forward Email API (Recommended)
If you have a Forward Email account, use the Email API for the most reliable delivery.
Get Your API Key
- Log in to Forward Email
- Navigate to My Account → Security
- Scroll down to the "Developer Access" section at the bottom
- 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
실행 가능하게 만드세요:
sudo chmod +x /usr/local/bin/ftp-monitor.sh
Systemd 서비스 생성
sudo nano /etc/systemd/system/ftp-monitor.service
다음 내용을 추가하세요:
[Unit]
Description=FTP 업로드 모니터
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ftp-monitor.sh
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
서비스 활성화 및 시작:
sudo systemctl daemon-reload
sudo systemctl enable ftp-monitor.service
sudo systemctl start ftp-monitor.service
상태 확인:
sudo systemctl status ftp-monitor.service
5부: 구형 장치를 위한 이메일 옵션
FOSSCAM 카메라 같은 장치는 종종 최신 TLS 버전을 지원하지 않습니다. 두 가지 해결책이 있습니다:
옵션 1: Forward Email의 구형 TLS 1.0 포트 사용 (권장)
Forward Email을 사용 중이라면, 이것이 가장 쉬운 해결책입니다. Forward Email은 카메라, 프린터, 스캐너, 팩스기 같은 구형 장치를 위해 전용 구형 TLS 1.0 포트를 제공합니다.
가격
Forward Email은 여러 요금제를 제공합니다:
| 요금제 | 가격 | 기능 |
|---|---|---|
| 무료 | 월 $0 | 이메일 전달만 가능 (발송 불가) |
| 향상된 보호 | 월 $3 | SMTP 접근 + 구형 TLS 1.0 포트 지원 |
| 팀 | 월 $9 | 향상된 보호 + 팀 기능 |
| 엔터프라이즈 | 월 $250 | 팀 + 무제한 API 요청 |
Important
SMTP 접근 및 구형 TLS 1.0 포트 지원을 위해서는 향상된 보호 요금제($3/월) 이상이 필요합니다.
자세한 내용은 Forward Email 가격에서 확인하세요.
비밀번호 생성
장치를 설정하기 전에 Forward Email에서 비밀번호를 생성하세요:
- Forward Email에 로그인
- 내 계정 → 도메인 → [내 도메인] → 별칭으로 이동
- 별칭 생성 또는 선택 (예:
camera@yourdomain.com) - 별칭 옆의 "비밀번호 생성" 클릭
- 생성된 비밀번호 복사 - SMTP 인증에 사용
Tip
별칭마다 별도의 비밀번호를 설정할 수 있습니다. 어떤 장치가 어떤 이메일을 보냈는지 추적하는 데 유용합니다.
장치 설정
카메라, 프린터, 스캐너 또는 기타 구형 장치에 다음 설정을 사용하세요:
| 설정 | 값 |
|---|---|
| SMTP 서버 | smtp.forwardemail.net |
| 포트 (SSL/TLS) | 2455 |
| 포트 (STARTTLS) | 2555 (대체 포트) |
| 사용자 이름 | 별칭 이메일 (예: camera@yourdomain.com) |
| 비밀번호 | "비밀번호 생성"에서 받은 비밀번호 |
| 인증 | 필요 |
| 암호화 | SSL/TLS (권장) 또는 STARTTLS |
Warning
이 포트들은 알려진 보안 취약점(BEAST, POODLE)이 있는 구형 TLS 1.0 프로토콜을 사용합니다. 장치가 최신 TLS 1.2 이상을 지원하지 않는 경우에만 사용하세요.
이 설정으로 장치를 구성하면 로컬 릴레이 서버 없이 Forward Email을 통해 직접 이메일을 보낼 수 있습니다.
자세한 내용은 Forward Email 구형 TLS 지원 FAQ를 참조하세요.
옵션 2: Postfix SMTP 릴레이 설정
Forward Email을 사용하지 않거나 로컬 릴레이 솔루션을 선호하는 경우, Raspberry Pi에 Postfix를 설치하여 중계 서버로 설정하세요. Gmail, Outlook, Yahoo, AOL 등 모든 이메일 제공자와 함께 작동합니다.
Postfix 설치
sudo apt update
sudo apt install postfix mailutils libsasl2-modules -y
설치 중:
- "인터넷 사이트" 선택
- "시스템 메일 이름"에 Pi의 호스트명 입력 (예:
raspberrypi-ftp)
이메일 제공업체 선택
| 제공업체 | SMTP 서버 | 포트 | 앱 비밀번호 필요? |
|---|---|---|---|
| Gmail | smtp.gmail.com | 587 | 예 |
| Outlook | smtp-mail.outlook.com | 587 | 예 |
| Yahoo | smtp.mail.yahoo.com | 465 | 예 |
| AOL | smtp.aol.com | 587 | 예 |
앱 전용 비밀번호 받기
대부분의 제공업체는 타사 애플리케이션용 앱 비밀번호를 요구합니다. 이메일 제공업체의 보안 설정에서 생성하세요:
- Gmail: Google Account Security
- Outlook: Microsoft Account Security
- Yahoo: Yahoo Account Security
- AOL: AOL Account Security
Important
일반 이메일 비밀번호는 절대 사용하지 마세요. 항상 앱 전용 비밀번호를 사용하세요.
SASL 인증 구성
선택한 제공업체용 비밀번호 파일을 만듭니다. 이 예시는 Yahoo를 사용합니다:
sudo mkdir -p /etc/postfix/sasl
sudo chmod 700 /etc/postfix/sasl
sudo nano /etc/postfix/sasl/sasl_passwd
다음 줄을 추가하세요 (서버와 포트는 제공업체에 맞게 조정):
[smtp.mail.yahoo.com]:465 your_email@yahoo.com:your_app_password
Gmail의 경우:
[smtp.gmail.com]:587 your_email@gmail.com:your_app_password
파일 권한 설정 및 해시 생성:
sudo chmod 600 /etc/postfix/sasl/sasl_passwd
sudo postmap /etc/postfix/sasl/sasl_passwd
이메일 주소 매핑 구성
로컬 이메일 주소를 이메일 제공업체 주소로 재작성합니다:
sudo mkdir -p /etc/postfix/map
sudo chmod 700 /etc/postfix/map
sudo nano /etc/postfix/map/regex_map
다음 줄을 추가하세요 (HOSTNAME을 Pi의 호스트명으로 바꾸고 이메일을 사용):
/.+@HOSTNAME/ your_email@provider.com
예시:
/.+@raspberrypi-ftp/ john@yahoo.com
파일 권한 설정:
sudo chmod 600 /etc/postfix/map/regex_map
Postfix 메인 설정 구성
메인 설정 파일을 편집하세요:
sudo nano /etc/postfix/main.cf
릴레이 호스트를 찾거나 파일 끝에 추가하세요:
relayhost = [smtp.mail.yahoo.com]:465
파일 끝에 다음 설정을 추가하세요:
# SMTP 릴레이 구성
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
# 네트워크 설정
inet_interfaces = all
inet_protocols = ipv4
mynetworks = 127.0.0.0/8 [::1]/128 192.168.1.0/24
Tip
Gmail(포트 587)의 경우 smtp_tls_wrappermode = yes 대신 no로 설정하세요.
Warning
mynetworks를 실제 네트워크 범위로 업데이트하세요. 신뢰할 수 있는 네트워크만 추가하세요 - 이 네트워크 내의 모든 장치는 인증 없이 메일을 릴레이할 수 있습니다.
일반 네트워크 범위:
| 네트워크 범위 | 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 |
방화벽 업데이트 및 재시작
sudo ufw allow 25/tcp comment 'SMTP for local devices'
sudo systemctl restart postfix
Postfix 실행 상태 확인:
sudo systemctl status postfix
릴레이 테스트
테스트 이메일 보내기:
echo "Test from Postfix" | mail -s "Test" your_email@provider.com
로그 확인:
sudo tail -f /var/log/mail.log
성공 여부는 status=sent를 확인하세요.
장치 구성
카메라 또는 장치 설정에서:
- SMTP 서버: Pi의 IP 주소 (예:
192.168.1.100) - SMTP 포트:
25 - 인증: 없음
- 암호화: 없음 (로컬 네트워크 전용)
문제 해결
문제가 발생하면 다음 로그 파일을 확인하세요:
FTP 서버:
sudo tail -f /var/log/vsftpd.log
Fail2ban:
sudo fail2ban-client status
sudo tail -f /var/log/fail2ban.log
파일 모니터:
sudo journalctl -u ftp-monitor.service -f
Postfix 메일:
sudo tail -f /var/log/mail.log
mailq # 메일 큐 보기
마무리
Raspberry Pi는 이제 보안 파일 업로드, 첨부파일이 포함된 자동 이메일 알림, 그리고 레거시 장치를 위한 SMTP 릴레이 기능을 갖춘 완전한 자동화 시스템이 되었습니다. Forward Email의 레거시 TLS 포트나 로컬 Postfix 릴레이를 사용하든, 오래된 장치들도 이제 현대 이메일 제공자를 통해 안정적으로 이메일을 보낼 수 있습니다.