WireGuard VPN 을 활용하여 필자만 접속이 가능했다면 이제는 외부에서 접속이 가능하도록 배포하려고 합니다.
1. 도메인 구매
도메인을 판매하는 대표적인 사이트를 검색하면 가비아, CLOUDFLARE, AWS CloudFront 등 검색이 됩니다. 저는 가비아 아니면 CLOUDFLARE 에서 구매하고싶은 도메인을 검색한 뒤 가비아가 조금 더 비싸서 CLOUDFLARE 에서 구매하게 되었습니다.
도메인을 구매한 뒤에 해당 도메인을 서버에 연결해 외부에서 접근하기 위해선 DNS 설정을 해야 합니다. CLOUDFLARE 에서의 도메인설정은 다음과 같습니다.
1.1 DNS 설정
홈에서 등록한 도메인을 클릭합니다.
좌측 사이드바에서 DNS 를 클릭합니다. 그러면 아래와 같은 설정 창이 나타나게 될 것입니다.
구매한 도메인 앞에 이름을 붙이지 않고 접근하려면 @로 설정하면 되지만 필자의 경우 포트폴리오를 배포할 예정이라 portfolio 라고 지정해주었고, IPv4 에는 공인 IP 주소를 설정하였습니다.
그 다음 저장을 누르게 되면 설정이 완료되게 됩니다. 완료된 설정은 다음과 같습니다. 이제 외부에서 portfolio.jeenukchung.com 으로 접근하게 됩니다.
2. Nginx 설정 (도메인 연결)
DNS 를 설정하였으니 Nginx 설정을 통해 서버레서 도메인을 사용하여 웹사이트에 접근할 수 있게 설정합니다. 기존에 설정했던 nginx.conf 로 접근하여 server_name localhost;
로 되어 있었던 부분을 server_name [도메인주소];
로 변경합니다.
2.1 문제 발생
DNS 설정후에 도메인까지 연결 까지 잘 해주었는데 CLOUDFLARE 의 Turnstile 에서 로봇 검증 후에 무한 로딩 상태에 빠졌습니다.
원인을 파악하기 위해 다음과 같은 작업을 시도해보았습니다.
1. 브라우저 캐시 및 쿠키 삭제
2. nginx.conf 설정 재확인
3. DNS 설정에서 프록시 해제 후 TLS 자동으로 설정
그러던 중 마지막 설정에서 Cloudflare 에서 자동으로 SSL/TLS 설정이 Flexible 로 되어 있는 것을 확인했습니다. Cloudflare 에서 Flexible 모드는 Cloudflare와 사용자 간의 트래픽은 암호화 되지만, Cloudflare 와 원본서버 간의 트래픽은 암호화되지 않았있어 Nginx 에서 SSL 인증서를 설정할 필요가 없습니다. 그럼에도 불구하고 접속이 불가하여 그냥 SSL 인증을 받기로 하였습니다.
3. SSL 인증서 발급 받기
SSL 인증서는 다음 블로그를 참고하였습니다. 설정 방법에서 조금의 차이가 있어 다시 적어보기로 합니다. https://www.owl-dev.me/blog/42
3.1 SSL 인증을 위한 Cerboot tool 설치
Let's Encrypt SSL 인증서 발금은 Cerboot 을 이용합니다.
sudo apt update
sudo apt-get install letsencrypt -y
3.2 Cerboot 으로 인증서 생성
SSL 인증서를 발급받기 전에 80 포트를 사용하는 nginx 를 정지합니다.
cd /data/nginx/
sudo docker compose down
Cerboot 명령을 이용해 SSL 인증을 시작합니다. standalone 명령을 사용하고 도메인 이름만으로 이증이 진행되는 -d 옵션을 사용합니다. (-d 뒤에는 실제 도메인을 입력하면 되고, 여러개일 경우 -d [도메인주소] -d [도메인주소] 의 형태로 설정하면 됩니다.)
cerboot certonly --standalone -d portfolio.jeenukchung.com
그러면 아래 질문이 나오며 인증이 진행됩니다. 본인 이메일을 적어주면 됩니다.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel)
:
ACME 서버 등록에 동의하는지와 재단에 이메일 주소를 공유할 것인지 질문합니다. Y 로 동의하면 됩니다.
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf.
You must agree in order to register with the ACME server. Do you agree?
(Y)es/ (N)o:
3.3 문제 발생
동의 후에 SSL 인증서를 발급받으려고 하니 아래와 같이 권한 문제로 인해 발급 요청이 거절되었습니다.
Certbot failed to authenticate some domains (authenticator: standalone).
The Certificate Authority reported these problems:
Domain: portfolio.jeenukchung.com
Type: unauthorized
Detail: 2606:4700:3035::6815:bc5: Invalid response from http://portfolio.jeenukchung.com/.well-known/acme-challenge/ySEk3ZUe2AyLbpheK85tRDjx2WiUK2rX1YjYHn-OXu4: 403
Hint: The Certificate Authority failed to download the challenge files from the temporary standalone webserver started by Certbot on port 80. Ensure that the listed domains point to this machine and that it can accept inbound connections from the internet.
Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
Cerbot 이 인증을 위해 필요한 파일들을 해당 경로에 배치할 수 있게 nginx.conf 설정에 다음과 같이 추가하였습니다.
location /.well-known/acme-challenge/ {
root /usr/share/nginx/html;
allow all;
}
후에 다시 실행했더니 이번에는 다음과 같은 문제가 발생하였습니다.
Certbot failed to authenticate some domains (authenticator: standalone). The Certificate Authority reported these problems:
Domain: portfolio.jeenukchung.com
Type: connection
Detail: 121.169.160.100: Fetching http://portfolio.jeenukchung.com/.well-known/acme-challenge/Nd0utMGaNIRj-8ve1EWYjgstB-3zjGAc4NAY59hZo8s: Timeout during connect (likely firewall problem)
Hint: The Certificate Authority failed to download the challenge files from the temporary standalone webserver started by Certbot on port 80. Ensure that the listed domains point to this machine and that it can accept inbound connections from the internet.
Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
이번에는 방화벽 문제라고 생각하여 공유기에 80, 443 포트를 열어주었고 더불어 라즈베리파이 방화벽도 함께 설정하였습니다.
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
하고 난 뒤에 재시도하였더니 SSL 인증서 발급에 성공하였습니다... !
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/portfolio.jeenukchung.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/portfolio.jeenukchung.com/privkey.pem
This certificate expires on 2025-01-17.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
We were unable to subscribe you the EFF mailing list. You can try again later by visiting https://act.eff.org.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4. Nginx 에 SSL 인증서 등록하기
SSL 인증서를 발급 받았으니 이제 nginx.conf 설정을 변경해주어야 합니다. 기존에 nginx.conf 를 다음과 같이 변경합니다.
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
server {
listen 80;
server_name portfolio.jeenukchung.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name portfolio.jeenukchung.com;
ssl_certificate /etc/letsencrypt/live/portfolio.jeenukchung.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/portfolio.jeenukchung.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "HIGH:!aNULL:!MD5";
location / {
root /usr/share/nginx/html/univers;
index index.html;
}
location /.well-known/acme-challenge/ {
root /usr/share/nginx/html;
allow all;
}
location /wireguard {
proxy_pass http://wg-easy:51821;
proxy_set_header Host $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;
}
}
}
그 다음 nginx가 SSL 인증서를 로드할 수 있게 볼륨 바인딩을 해줍니다.
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./univers:/usr/share/nginx/html/univers
- /etc/letsencrypt:/etc/letsencrypt #추가
networks:
- shared_network
restart: unless-stopped
networks:
shared_network:
external: true
이제 외부에서 portfolio.jeenukchung.com 으로 접근하면 SSL 인증된 주소로 리다이렉션 되어 접근이 가능합니다 !!
'라즈베리파이 가지고 놀기' 카테고리의 다른 글
라즈베리파이에 Object Storage Minio 설정하기 (3) | 2024.10.29 |
---|---|
docker compose 설정 변경하기 (0) | 2024.10.18 |
라즈베리파이4에 nginx 올리기 (1) | 2024.10.18 |
라즈베리파이4에 wg-easy VPN 설정하여 외부에서 접속하기 (6) | 2024.10.18 |
라즈베리파이4에 Ubuntu 22.04.05 LTS 설치하기 (4) | 2024.10.17 |