지난 번에 한 일
https가 아닌 https로 연결한 걸 테스트 하는 이유로
cloudflare의 프록시 설정을 잠깐 꺼두고
example:커스텀포트번호 로 요청해서
ios로 접속 가능한 것 까지 했습니당.
오늘은 HTTPS 설정을 통해
보안 설정 + nginx로 443 포트와 제 로컬 커스텀 포트를 연결해주는 작업에 대한 글을 작성하려고 합니당.
사실 이 과정은 HTTPS가 아니라 HTTP도 가능한데
저희집 와이파이 자체가 80포트는 지원을 안하더라구요??
관련해서 알아두실 점이
http://example.com 검색
=> http의 경우 자동으로 80포트로 전송
=> cloudflare에서 도메인의 ip:80포트를 우리집 공인 와이파이로 전송
=> 공인 와이파이에서 DNAT을 통해 이 80포트를 내부의 서버로 전달을 해야하는데
문제는 이 DNAT이었어요. 안되더라구요 ?
80을 지원을 안해주더라구요 ㅋㅋㅋ (일 잘하네 . . )
그래서 어쩔 수 없이 443은 지원을 하길래
HTTPS 설정을 먼저 해주기로 했습니당.
1. HTTPS (TLS 인증서) 하기
이 HTTPS와 HTTP에 대한 차이를 여기서 많이 언급하기는 어렵고
https://blog.naver.com/programming_my00/223719812000
3. HTTPS의 기본 개념과 심화 개념 + SSL 핸드셰이크
지난 포스팅에서는 HTTP의 심화 개념에 대해서 공부해봤어요 HTTP의 Keep-alive 속성이나, 비연결...
blog.naver.com
뭐 제 네이바 블로그 글에 요런요런 글을 작성을 해놨었기 때문에 다시 읽어보면서 리마인드 하겠습니당.
아무튼, 인증서를 만들어 줘야해요
https://goldsony.tistory.com/223
SSL 사설 인증서 생성하기(feat, openssl)
#223 1. SSL(Secure Sockets Layer) 인증서란? 웹 서비스를 이용하는데 신원을 확인하고 암호화 통신을 하기위해 사용되는 디지털 인증서입니다. SSL 프로토콜을 사용하여 SSL 인증서로 불립니다. 서비스하
goldsony.tistory.com
=> 저는 기왕하는거 직접 인증서 만들어보는거 어떠냐는 어떠한 개발자의 자문에 의해 괜찮다는 생각이 들어
OpenSSL로 직접 만들었습니다 ㅎ;
보통 뭐 만들지 않으신다면
Let's Encrypt => 무료사이트라 인증된 사이트로 많이 쓰고 DigiCert 등등 인터넷에 많으니 인증서 발급을 잘 해보아욤
아무튼 이렇게 만든
인증서 키를 nginx로 HTTPS 적용 하면 되거든요 !!
2. Nginx에 HTTPS 적용
server {
listen 443 ssl;
server_name your.domain.com;
ssl_certificate [crt 파일 경로]
ssl_certificate_key [인증키 경로]
location / {
proxy_pass http://localhost:[커스텀도메인]; # 내부 서비스
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
그리고 방화벽에서도 이제 443 포트를 열어주어야 해요
sudo ufw allow 443
( ㅎ ; 블로그에 올렸다가 해킹당할까봐 무서워서 웬만한 거 다 안올리는데
https가 443인건 뭐 모두가 다 아는 사실이니까 이 정돈 올려도 되겠죠 .. )
이쯤에서 흐름을 좀 보자면
1. 사용자가 https://example.com에 접속
브라우저가 URL을 입력하거나 클릭하면
어떤 일이 발생하냐면
example.com의 IP 주소를 찾기 위해 DNS 질의 발생
2. DNS 질의 → Cloudflare가 응답
- 사용자의 PC가 example.com에 대해 Cloudflare 네임서버에 질의
(그렇다 보니, 이 CloudFlare가 어떻게 보면 프록시 역할을 해주고 있는 거라고 볼 수 있져.'
바로 저희집 공인 ip로 연결 안하니까 보안적으로 좋습니다)
- Cloudflare가 DNS 응답:
example.com → [저희집 공유기의 공인 IP]
3. 브라우저가 공인 IP로 HTTPS 요청 (443 포트)
- 브라우저가 다음 요청을 보냄:
GET / HTTP/1.1 Host: example.com
→ 대상: [공유기 공인 IP]:443 - TLS Handshake도 포함돼 있음
4. 공유기(라우터)가 요청을 받음
- 공유기 NAT에서 포트포워딩(DNAT) 규칙 확인:
외부 443 → 내부 192.168.0.10:443
- 그래서 요청을 내부 서버로 전달함
외부 443 → 우분투 서버의 내부ip:443으로 (예를 들어192.168.0.10:443)
5. 내부 서버의 Nginx가 443 요청 수신
- 서버에서는 Nginx가 443 포트를 listen 중
- Nginx는 ssl_certificate로 인증서 사용해 TLS 핸드셰이크 완료
- 클라이언트와 보안 연결 성립
6. Nginx가 내부 커스텀 포트로 프록시 요청
location / { proxy_pass http://localhost:9000; }
- TLS 복호화된 후 HTTP 요청을 내부 앱으로 전달
7. 내부 앱이 응답 → 다시 브라우저까지 역방향으로 전송
- 내부 앱이 HTTP 응답 → Nginx가 받아서
- HTTPS로 다시 암호화 → 공유기 → 공인IP → 인터넷 → 클라이언트 브라우저
최종 요약 흐름도
[1] example.com 입력
↓
[2] Cloudflare DNS 응답: A → [공유기 공인 IP]
↓
[3] 브라우저: HTTPS 요청 (443) → 공유기 공인 IP
↓
[4] 공유기: 443 포트포워딩 → 내부 IP:443
↓
[5] Nginx(443): 인증서로 TLS 처리
↓
[6] Nginx → 내부 커스텀 포트 프록시
↓
[7] 앱 응답 → Nginx → 암호화 → 클라이언트로 응답
이렇게 됩니다.
그 결과
이런식으로
포트번호 없이 https://구입도메인
으로 내부 우분투 서버에 띄운 프로그램을 ios 앱으로 접속할 수 있게 되었습니다 ㅎㅎㅎㅎㅎㅎㅎ티히키
'OS' 카테고리의 다른 글
3. 온프레미스에서 FQDN 구축하기: 유동 IP 환경에서 DDNS + 도메인 네임 서비스 구성 실습 (1) | 2025.06.11 |
---|---|
2. 외부에서 내부 Ubuntu 서버에 접근하기 – 포트 포워딩과 방화벽 설정 (1) | 2025.05.29 |
1. 집에서 온프레미스 구동하기 (0) | 2025.05.10 |
온프레미스를 내가 왜 해야 할까 (0) | 2025.05.10 |