Rocky Linux 8.10에서 사설 IP로 Nextcloud SSL 설정 가이드 (대체 포트)
이 가이드는 Rocky Linux 8.10에 설치된 Nextcloud를 공유기 아래 사설 IP(예: 192.168.1.100
) 환경에서 실행하고, 외부에서 HTTPS로 접근하도록 설정하는 방법을 설명합니다. 공유기에서 80, 443 포트가 이미 사용 중이므로, 대체 포트(8080: HTTP, 8443: HTTPS)를 사용합니다. 동적 DNS(DDNS)로 DuckDNS를 사용하며, ddclient
설치 문제로 Python 스크립트를 활용해 IP를 업데이트합니다. Let's Encrypt로 SSL 인증서를 발급받아 보안을 강화합니다.
왜 대체 포트와 SSL이 필요한가요?
Nextcloud는 민감한 데이터를 처리하므로 HTTPS를 통해 암호화가 필수입니다. 공유기에서 80, 443 포트가 사용 중인 경우:
- 대체 포트(8080, 8443)를 사용해 Nextcloud 서비스 실행.
- 공유기의 공인 IP와 포트 포워딩으로 외부 요청을 서버로 전달.
- DuckDNS로 동적 공인 IP를 고정 도메인에 연결.
- Let's Encrypt로 무료 SSL 인증서를 발급받아 HTTPS 활성화.
사전 요구사항
- Rocky Linux 8.10에 설치된 Nextcloud (Apache, MariaDB, PHP 설정 완료).
- 서버에 할당된 사설 IP (예:
192.168.1.100
). - 공유기 관리자 접근 권한 (포트 포워딩 설정용).
- DuckDNS 계정 (duckdns.org).
- 루트 또는 sudo 권한.
- 80 포트 일시적 사용 가능 (Let's Encrypt 인증서 발급용, 또는 대체 포트 챌린지 설정).
주의: Let's Encrypt의 HTTP-01 챌린지는 기본적으로 80 포트를 사용합니다. 80 포트가 다른 서비스에 의해 점유된 경우, 인증서 발급 중에만 80 포트를 임시로 열거나, 대체 포트(8080)로 챌린지를 처리해야 합니다.
1. 서버의 사설 IP 확인 및 고정
서버의 사설 IP를 확인하고, 고정 IP를 설정하여 공유기와의 연결 안정성을 확보합니다.
ip addr show
예: eth0
에 192.168.1.100
이 할당됨.
고정 IP 설정:
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
다음 내용을 추가/수정 (IP와 게이트웨이는 공유기 설정에 맞게):
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
네트워크 재시작:
sudo nmcli con reload
sudo nmcli con up eth0
2. 동적 DNS(DDNS) 설정 - Python 스크립트
Rocky Linux 8.10에서 ddclient
설치가 어려운 경우, Python 스크립트로 DuckDNS의 공인 IP를 주기적으로 업데이트합니다. 이 스크립트는 서버의 공인 IP를 DuckDNS에 등록하여 외부에서 도메인(예: mynextcloud.duckdns.org
)으로 접속 가능하게 합니다.
2.1 DuckDNS 계정 설정
- DuckDNS에 가입하고 도메인을 생성 (예:
mynextcloud.duckdns.org
). - 서버의 공인 IP 확인:
결과(예:curl ifconfig.me
203.0.113.1
)를 DuckDNS 관리 페이지에 등록.
2.2 Shell 스크립트 생성
업데이트용 스크립트 작성
mkdir -p ~/duckdns
vi ~/duckdns/duck.sh
스크립트 파일을 생성합니다:
echo "url=\"https://www.duckdns.org/update?domains=mynextcloud&token=your-duckdns-token&ip=\" | curl -k -o ~/duckdns/duck.log -K -" > ~/duckdns/duck.sh
※ mynextcloud를 본인 도메인으로, your-duckdns-token을 DuckDNS 홈페이지에서 발급받은 토큰으로 바꾸세요.
스크립트에 실행 권한을 부여하여 실행 가능하도록 만듭니다:
chmod 700 ~/duckdns/duck.sh
IP를 주기적으로 업데이트하도록 Cron 작업을 설정합니다 (5분마다 실행):
sudo crontab -e
다음 줄을 추가:
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1
3. 공유기에서 포트 포워딩 설정 (대체 포트)
공유기에서 외부 요청(8080, 8443 포트)을 서버의 사설 IP로 포워딩합니다. Let's Encrypt 인증서 발급 시 80 포트를 임시로 사용할 수 있어야 합니다.
- 공유기 관리자 페이지에 로그인 (예:
192.168.1.1
). - "포트 포워딩" 또는 "가상 서버" 메뉴로 이동.
- 규칙 추가:
- 서비스: HTTP, 외부 포트: 8080, 내부 IP:
192.168.1.100
, 내부 포트: 8080. - 서비스: HTTPS, 외부 포트: 8443, 내부 IP:
192.168.1.100
, 내부 포트: 8443. - 인증서 발급 시: 외부 포트: 80, 내부 IP:
192.168.1.100
, 내부 포트: 8080 (임시).
- 서비스: HTTP, 외부 포트: 8080, 내부 IP:
- 설정 저장 및 공유기 재부팅 (필요 시).
포트 포워딩 테스트:
curl http://mynextcloud.duckdns.org:8080
Nextcloud 또는 Apache 페이지가 반환되면 성공.
주의: 80 포트가 다른 서비스에 의해 점유된 경우, Let's Encrypt 인증서 발급 중에만 80 포트를 임시로 Nextcloud 서버로 포워딩하거나, 아래 대체 포트 챌린지 방법을 사용하세요.
4. Apache 포트 변경
Apache를 8080(HTTP)와 8443(HTTPS) 포트로 설정합니다.
4.1 Apache 포트 설정
Apache 설정 파일을 수정하여 기본 포트를 변경합니다:
sudo vi /etc/httpd/conf/httpd.conf
Listen 80
을 찾아 다음으로 변경:
Listen 8080
SSL 포트 설정:
sudo vi /etc/httpd/conf.d/ssl.conf
Listen 443
을 찾아 다음으로 변경:
Listen 8443
VirtualHost도 수정:
sudo vi /etc/httpd/conf.d/nextcloud.conf
내용을 다음으로 업데이트:
<VirtualHost *:8080>
ServerName mynextcloud.duckdns.org
ServerAdmin admin@mynextcloud.duckdns.org
DocumentRoot /var/www/html/nextcloud
<Directory /var/www/html/nextcloud>
Options +FollowSymLinks
AllowOverride All
Require all granted
SetEnv HOME /var/www/html/nextcloud
SetEnv HTTP_HOME /var/www/html/nextcloud
</Directory>
# 로그 설정 (필요시)
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
4.2 Apache 재시작
설정을 적용합니다:
sudo apachectl configtest
sudo systemctl restart httpd
5. Let's Encrypt로 SSL 인증서 발급 (대체 포트)
DuckDNS 도메인을 사용해 Let's Encrypt 인증서를 발급받습니다. 80 포트가 사용 중이므로, `--http-01-port 8080`을 사용해 챌린지를 처리합니다.
sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-apache -y
sudo certbot --apache --http-01-port 8080 -d mynextcloud.duckdns.org
프롬프트 응답:
- 이메일: 갱신 알림용 이메일.
- 약관 동의:
A
. - 마케팅 이메일:
N
. - HTTP→HTTPS 리디렉션:
2
(리디렉션 활성화).
인증서는 /etc/letsencrypt/live/mynextcloud.duckdns.org/
에 저장됩니다.
참고: 공유기에서 80 포트를 임시로 열 수 있다면, --http-01-port 8080
없이 표준 80 포트로 인증서를 발급받을 수 있습니다. 발급 후 80 포트 포워딩을 제거하세요.
6. Apache SSL VirtualHost 설정
Certbot이 생성한 SSL 설정을 8443 포트로 수정합니다:
sudo vi /etc/httpd/conf.d/nextcloud-le-ssl.conf
다음으로 업데이트:
<VirtualHost *:8443>
ServerName mynextcloud.duckdns.org
DocumentRoot /var/www/html/nextcloud
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mynextcloud.duckdns.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mynextcloud.duckdns.org/privkey.pem
<Directory /var/www/html/nextcloud>
Options +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 로그 설정 (필요시)
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Apache 재시작:
sudo apachectl configtest
sudo systemctl restart httpd
7. 방화벽 설정
8080(HTTP)와 8443(HTTPS) 포트를 허용합니다.
sudo firewall-cmd --add-port=8080/tcp --zone=public --permanent
sudo firewall-cmd --add-port=8443/tcp --zone=public --permanent
sudo firewall-cmd --reload
포트 확인:
sudo firewall-cmd --list-ports
8. 자동 갱신 설정
Let's Encrypt 인증서 갱신을 위해 Cron 작업을 설정합니다. 대체 포트 사용 시 갱신에도 동일 포트 지정:
sudo certbot renew --dry-run --http-01-port 8080
Cron 작업 추가:
sudo crontab -e
0 0 * * * /usr/bin/certbot renew --quiet --http-01-port 8080
또는 systemd 타이머 (대체 포트 미지원, 수동 갱신 권장):
sudo systemctl enable certbot-renew.timer
sudo systemctl start certbot-renew.timer
9. HTTPS 연결 테스트
브라우저에서 https://mynextcloud.duckdns.org:8443/nextcloud
에 접속:
- 자물쇠 아이콘 표시 시 SSL 설정 성공.
- Nextcloud 로그인 페이지 확인.
접속 실패 시:
- DuckDNS 상태:
ping mynextcloud.duckdns.org
. - 포트 포워딩: 공유기에서 8080, 8443 포트 확인.
- 방화벽:
sudo netstat -tuln | grep 8443
.
10. Nextcloud 설정 업데이트
Nextcloud가 새 포트를 인식하도록 trusted_domains
에 도메인과 포트를 추가합니다:
sudo vi /var/www/html/nextcloud/config/config.php
다음 내용을 추가/수정:
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'mynextcloud.duckdns.org:8080',
2 => 'mynextcloud.duckdns.org:8443',
),
11. 보안 및 최적화
Nextcloud의 보안과 성능 강화:
- HSTS 활성화:
sudo vi /etc/httpd/conf.d/nextcloud-le-ssl.conf Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
- TLS 제한:
sudo vi /etc/httpd/conf.d/ssl.conf SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
문제 해결
일반적인 문제와 해결 방법:
- Certbot 챌린지 실패:
- 원인: 8080 포트 차단.
- 해결:
sudo firewall-cmd --add-port=8080/tcp --permanent
, 공유기 포트 포워딩 확인.
- DNS 연결 실패:
- 원인: DuckDNS IP 미업데이트.
- 해결:
sudo python3 /usr/local/bin/update_duckdns.py
재실행.
- Connection refused:
- 원인: Apache 포트 미설정.
- 해결:
sudo systemctl start httpd
,Listen 8080
및Listen 8443
확인.
- Python 스크립트 오류:
- 원인:
requests
모듈 누락. - 해결:
sudo pip3 install requests
.
- 원인: