nip.io란?
nip.io는 동적 DNS 서비스이다. 특정 IP 주소에 쉽게 접근할 수 있도록 자동으로, 무료로 도메인 이름을 생성해준다.
IP 주소 기반 도메인 생성
IP 주소가 123.456.78.90일 경우, 123.456.78.90.nip.io와 같은 도메인 이름을 사용할 수 있도록 해준다.
HTTPS 지원
Let's Encrypt와 같은 인증서와 Certbot을 사용하여 HTTPS를 설정할 수 있다.
개발 및 테스트 용도로 사용
- 로컬 개발 환경에서 HTTPS를 설정할 수 있도록 해준다.
- 로컬 서버가 localhost:8080에서 실행중인 경우, 이를 외부에서 123.456.789.90.nip.io로 접근할 수 있다.
- 개발 중인 기능을 테스트할 때, 외부에서 쉽게 접근 가능한 도메인을 제공받을 수 있다.
원리
1. nip.io 도메인
서버의 IP 주소를 바탕으로 도메인을 특정하여 사용할 수 있도록 도와준다.
ex) 123.456.78.90:8080 > 123.456.78.90.nip.io
2. Nginx
Nginx는 웹 서버, 리버스 프록시 서버이다.
Nginx 설정 파일을 수정하여, nip.io 도메인으로 들어오는 요청을 내부 서버(localhost:8080)으로 프록시한다.
여기서는 123.456.78.90.nip.io로 들어온 클라이언트의 요청을 localhost:8080으로 전달하고,
localhost:8080의 응답을 클라이언트에게 반환하는 역할을 한다.
이를 통해 외부 클라이언트가 도메인(123.456.78.90.nip.io)를 통해 내부서버(localhost:8080)으로 접근할 수 있다.
3. Let's Encrypt와 Certbot을 이용한 HTTPS 설정
Let's Encrypt
Let's Encrypt는 무료로 SSL/TLS 인증서를 발급하는 인증 기관이다.
Certbot
Certbot은 Let's Encrypt와 통신하여 인증서를 자동으로 발급받고 설치해주는 도구이다.
흐름
Certbot은 nip.ip 도메인을 사용하여 서버의 소유권을 확인하고 인증한다.
인증이 완료되면 Let's Encrypt로 부터 SSL/TLS 인증서를 발급한다.
Certbot이 Nginx 설정 파일을 수정하여 발급받은 인증서를 적용하고, HTTPS를 활성화한다.
HTTPS 적용 과정
1. Nginx 설치
$ sudo apt update
# Nginx 설치
$ sudo apt install nginx
# Nginx 실행
$ sudo service nginx start
2. Nginx 설정 파일 수정
Nginx 설정 파일을 열어서 수정한다.
sudo nano /etc/nginx/sites-available/default
server_name에 nip.io 도메인을 사용하도록 하고, 내부 서버를 localhost:8080으로 프록시하는 설정이다.
123.456.78.90 대신, 본인의 실제 url을 넣어준다.
server {
listen 80;
server_name 123.456.78.90.nip.io;
location / {
proxy_pass http://localhost:8080;
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;
}
}
3. Nginx 테스트, 재시작
sudo nginx -t
sudo systemctl restart nginx
4. Certbot 설치 및 HTTPS 인증서 발급
Let's Encrypt의 Certbot을 설치하고 인증서를 발급받는다.
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d 123.456.78.90.nip.io
5. 인증서 자동 갱신 설정
Let's Encrypt 인증서는 90일동안 유효하다.
따라서 Certbot이 자동으로 갱신할 수 있도록 설정한다.
sudo certbot renew --dry-run
6. Nginx 설정 확인
Certbot이 HTTPS 설정을 자동으로 설정해줬을것이다.
그래도 다시한번 설정 파일을 열어 확인한다.
sudo nano /etc/nginx/sites-available/default
문제가 있다면 아래와 비교하여 수정해준다.
server {
listen 80; # HTTP 80 포트에서 들어오는 요청을 수신
server_name 123.456.78.90.nip.io; # 이 server 블록이 처리할 도메인 이름 지정
return 301 https://$host$request_uri; # 모든 요청을 HTTPS로 redirection
}
server {
listen 443 ssl; # 포트 443에서 SSL/TLS를 사용하여 HTTPS요청을 수신하도록 설정
server_name 123.456.78.90.nip.io; # 이 server 블록이 처리할 도메인 이름 지정
ssl_certificate /etc/letsencrypt/live/123.456.78.90.nip.io/fullchain.pem; # SSL 인증서 경로
ssl_certificate_key /etc/letsencrypt/live/123.456.78.90.nip.io/privkey.pem; # SSL 인증서 key 경로
include /etc/letsencrypt/options-ssl-nginx.conf; # Let's Encrypt에서 제공하는 기본 SSL 설정을 포함시킴
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # DH(Diffle-Hellman) 파라미터 파일 경로 (보안 강화용)
location / {
proxy_pass http://localhost:8080; # 모든 요청을 localhost:8080으로 프록시
proxy_set_header Host $host; # 원본 요청의 HOST header를 프록시 요청에 설정
proxy_set_header X-Real-IP $remote_addr; # 원본 클라이언트의 IP 주소를 프록시 요청에 설정
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 원본 클라이언트의 IP 주소 목록을 프록시 요청에 설정
proxy_set_header X-Forwarded-Proto $scheme; # 원본 요청의 프로토콜(HTTP/HTTPS)를 프록시 요청에 설정
}
}
위의 설정에 따라 모든 HTTP 요청을 HTTPS로 리다이렉션하고,
HTTPS를 통해 들어오는 요청을 Nginx를 통해 내부 서버의 localhost:8080으로 프록시한다.
또한, Let's Encrypt에서 발급받은 SSL 인증서를 사용하여 보안 연결을 설정한다.
7. HTTPS 설정 완료
설정이 완료되었으면, https://{YOUR_IP}.nip.io/{path}로 요청을 보내보자.
용어 정리
프록시(Proxy)
프록시는 클라이언트와 서버 사이에서 중개 역할을 하는 서버, S/W를 의미한다.
클라이언트의 요청을 받아서 목적지 서버로 전달하고, 서버의 응답을 받아서 클라이언트에게 다시 전달하는 역할을 한다.
따라서 클라이언트는 프록시 서버를 통해서만 요청하고 응답을 받게된다.
리버스 프록시(Reverse Proxy)
리버스 프록시는 서버 앞에 위치하여 클라이언트 요청을 받아 내부 서버에 전달하는 프록시로, 부하 분산(로드 밸런싱), 캐싱, 서버 보안, 암호화등의 목적으로 쓰인다. 리버스 프록시 서버로는 Nginx, Apache가 주로 쓰인다.
포워드 프록시(Forward Proxy)
포워드 프록시는 클라이언트 바로 뒤에 위치하여, 같은 내부 망에 위치한 클라이언트의 요청을 받아 외부 서버로 전달하는 역할을 한다. 주로 클라이언트 보안, 캐싱, 암호화의 목적으로 쓰인다.
SSL/TLS
SSL(Secure Sockets Layer) / TLS(Transport Layer Security)는 시스템에서 ID를 확인하고, SSL과 전송계층 보안 프로토콜을 사용하여 다른 시스템에 대한 암호화된 네트워크 연결을 설정할 수 있도록 한다.
'DevOps > Deploy' 카테고리의 다른 글
[Linux / 배포] 배포 시 사용하는 Shell Script (저장용) (0) | 2024.01.28 |
---|---|
[Linux / ubuntu] AWS Ubuntu 20.04에 swap 메모리 설정하기, Freetier 메모리 부족 현상 해결 (0) | 2024.01.28 |
[AWS EC2 / 배포] SpringBoot Project 배포, EC2 ubuntu, docker (2) | 2024.01.24 |
[Spring / S3] SpringBoot 프로젝트 - S3 이미지 업로드 (4) | 2024.01.21 |
[AWS/S3] Spring boot project 이미지 업로드를 위해 S3 버켓 만들기 (0) | 2024.01.21 |