나는 방화벽에서 다음과 같이 포트포워딩을 통하여 인터네 망에서 서버로 접근해오고 있었다
하나의 도메인에 다음과 같이 웹 서비스에 접근할 수 있었다.
접속주소 | 내부주소 | 비고 |
http://www.kokonut.today:8062 | A 서버 : 8080 | |
http://www.kokonut.today:8081 | B 서버 : 8080 | |
http://www.kokonut.today:80 | C서버 : 8080 | |
http://www.kokonut.today:7777 | D 서버 : 8080 | |
https://www.kokonut.today:443 | D 서버 : 443 |
서비스를 운영하는 입장에서는 포트번호 노출이 그렇게 달갑지는 않았다. 나의 목표는 서브도메인으로 접근해서 통일한 포트 443, 80으로 운영하고 싶었다.
그 와중 알아낸 지식이 apache의 virtual host 사용 또는 nginx의 proxy pass였다. nginx는 apache의 C10K 문제점 해결을 위해 만들어진 Event-Driven 구조의 웹서버 소프트웨어 이름이다. C10K 문제란 한 시스템에 동시 접속자수가 1만명이 넘어갈 때 발생하는 성능저하를 의미한다.
즉, Apache의 성능문제를 해결하기 위해 만들어진 기술인 것이다.
일반사용자 입장에서 서비스의 퍼포먼스 등을 고려할 정도는 아니여서 도입에 있어 apache 보다 나은 개선점으로만 인식하여 적용하기로 했다.
결론만 말하면 방화벽 정책의 결과는 다음과 같아졌다.
외부에서 nginx 서버로 domain 명으로 질의를 하면 어느 서비스 들이든 접근이 가능해진다! 와우
접속주소 | 내부주소 | 비고 |
https://gitlab.kokonut.today | A 서버 : 8080 | |
https://richable.kokonut.today | B 서버 : 8080 | |
https://www.kokonut.today | C서버 : 8080 | |
https://jenkins.kokonut.today | D 서버 : 8080 | |
https://kokonut.today | D 서버 : 443 |
너무 깔끔하다. 내가 원하던 서브도메인으로 접근이 가능해지는 것이다.
위에서 개선 전 후를 확인하였으니 바로 본론으로 들어가보도록 하자. 아울러 https 통신을 위한 SSL 인증서 까지 설정해보자
수행방법
1.DNS 등록
2.nginx 설정(ssl 인증서 포함)
3.방화벽 설정
1.DNS 등록
나는 CloudFlare DNS를 사용한다. 원하는 서브도메인 레코드를 등록해준다.
나의 도메인 kokonut.today에 서브도메인 king을 등록하고자하면 A 레코드에 king.kokonut.today를 추가해주면 된다. 또는 bind9와 같은 DNS가 있다면 각 서버에 맞는 설정을 하면 된다.
2. nginx 설정
우분투 기준으로 진행하겠다.
A. nginx 설치하기
apt install nginx -y
B. nginx 설정파일 만들기
내가 원하는 이름의 파일을 만든다.
nano /etc/nginx/sites-enabled/anti.kokonut.today
다음의 설정파일의 내용은 다음과 같다.
http://anti.kokonut.today:80로 요청이오면 443포트로 rewrite를 하며 http://anti.kokonut.loca.:8080 으로 전달해준다.
https://anti.kokonut.today:443로 요청이오면 http://anti.kokonut.loca.:8080로 통신을 전달 해준다.
# /etc/nginx/sites-enabled/anti.kokonut.today
server {
# 443 포트 리스닝
listen 443 ssl;
listen [::]:443 ssl;
# ssl 통신설정을 한다
# 해당 설정 부분은 아래에서 자세히 설명한다.
ssl_certificate /etc/letsencrypt/live/kokonut.today/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/kokonut.today/privkey.pem; # managed by Certbot
# anti.kokonut.today로 요청이 들어온다면
server_name anti.kokonut.today;
# http://anti.kokonut.local:8080으로 통신시킨다.
location / {
proxy_pass http://anti.kokonut.local: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;
}
}
server {
# 80 포트로 리스닝한다.
# anti.kokonut.today로 요청이오면 https로 rewrite한다.
if ($host = anti.kokonut.today) {
rewrite ^ https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name anti.kokonut.today;
return 301 https://$server_name$request_uri;
}
이제 httls 통신을 위한 ssl 인증서를 발급받아보자
인증서를 발급받기 위해서는 인증서 발급 기관(CA, Certificate Authority)에게 신청을 해야 합니다. 대표적으로 Let's Encrypt라는 무료 인증 기관을 사용할 수 있습니다. 아래는 anti.kokonut.today 도메인에 대해 Let's Encrypt에서 인증서를 발급받는 방법입니다.
certbot 설치 certbot은 Let's Encrypt에서 인증서를 발급받는 데 사용하는 도구입니다. certbot을 설치하기 위해 우분투 기준으로는 다음 명령어를 입력합니다.
$ sudo apt-get update
$ sudo apt-get install certbot
C.인증서 발급
certbot을 사용해 anti.kokonut.today 도메인에 대한 인증서를 발급합니다. 이 때, Nginx가 실행 중이어야 합니다.
$ sudo certbot --nginx -d anti.kokonut.today
위 명령어를 입력하면 certbot이 자동으로 Nginx 설정 파일을 업데이트하고, 인증서를 발급받아 설정 파일에 등록합니다.
Nginx 구성 업데이트
인증서 발급이 완료되면 Nginx 구성 파일에서 인증서 경로를 수정해야 합니다. /etc/nginx/sites-available/default 파일을 열고 다음과 같이 수정합니다.
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name anti.kokonut.today;
ssl_certificate /etc/letsencrypt/live/anti.kokonut.today/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/anti.kokonut.today/privkey.pem;
location / {
proxy_pass http://anti.kokonut.local: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;
}
}
server {
if ($host = anti.kokonut.today) {
rewrite ^ https://$host$request_uri;
}
listen 80;
listen [::]:80;
server_name anti.kokonut.today;
return 301 https://$server_name$request_uri;
}
위 설정 파일에서 ssl_certificate와 ssl_certificate_key 경로를 Let's Encrypt에서 발급받은 인증서 경로로 수정합니다.
D.Nginx 재시작
Nginx 구성 파일을 수정한 후에는 Nginx를 재시작해야 적용됩니다. 다음 명령어를 입력하여 Nginx를 재시작합니다.
$ sudo systemctl restart nginx
이제 anti.kokonut.today 도메인에 대해 Let's Encrypt에서 발급받은 SSL 인증서를 사용하는 Nginx 서버를 운영할 수 있습니다.
3.방화벽 설정
방화벽은 다음과 같이 nginx 서버 80 및 443 포트를 오픈하고 anti.kokonut.today를 요청하면 https://anti.kokonut.today로 로 연결을 해준다
이렇게 하면 끝난다. https로 통제 가능하며 서브도메인으로 깔끔하게 접속할 수 있다.
기타 참고사항
nginx에서 proxy pass로 접근 시 cloudflare proxy를 설정하게 되면 too many redirection 이 발생해서 접속이 불가능 했다.
Let's Encrypt 인증서는 90일마다 갱신해야 합니다. certbot은 이를 자동으로 처리해주는 기능을 제공합니다. 아래는 인증서 자동 갱신 방법입니다.
$ sudo nano /etc/letsencrypt/cli.ini
certbot 설정 인증서 자동 갱신을 위해 certbot 설정 파일(/etc/letsencrypt/cli.ini)을 열고 다음과 같이 수정합니다.
# Renewal config file version
version = 1.16.0
# Automatically renew at 30 days before expiration
renew_before_expiry = 30 days
# Uncomment and update email to receive renewal reminders and security notices
email = your-email@domain.com
# Uncomment and update domains to renew automatically
domains = anti.kokonut.today
renew_before_expiry를 30일로 설정하면 인증서 만료 30일 전부터 자동으로 갱신을 시도합니다.
자동 갱신 테스트
certbot을 사용해 인증서를 자동 갱신할 수 있는지 테스트합니다. 다음 명령어를 입력합니다.
$ sudo certbot renew --dry-run
--dry-run 옵션을 사용하면 실제로 인증서를 갱신하지 않고 테스트만 수행합니다.
cron 작업 등록
인증서 자동 갱신을 위해 cron 작업을 등록합니다. 다음 명령어를 입력합니다.
$ sudo crontab -e
그러면 에디터가 열리는데, 아래와 같이 입력합니다.
0 0 * * 1 certbot renew
이렇게 등록하면 매주 월요일 자정에 인증서 갱신을 시도합니다.
이제 인증서는 자동으로 갱신되므로, 90일마다 수동으로 인증서를 갱신할 필요가 없습니다.
'기타정보' 카테고리의 다른 글
[정보] 애플페이 설정 방법(지갑 앱에 카드 추가) (0) | 2023.03.21 |
---|---|
[정보] Kibana server is not ready yet 해결 방법 (0) | 2023.03.16 |
[업데이트] RSS-Boho v2.0 - 보호나라 개편 반영 (0) | 2023.03.10 |
[정보] proxmox 운영 후기 (0) | 2023.03.09 |
DLP 동작 유형 (0) | 2023.03.02 |