역방향 Reverse Proxy 작동하는 방법
안녕하세요. 달소입니다.
이번글은 홈서버에서 가장 유용하게 사용할수 있는 팁이자 이해만하신다면 정말 쉽게 사용할 수 있는방법입니다.
보통 우리가 사용하는 환경은 도메인을 직접 구매하거나 공유기의 DDNS를 사용하는것이라고 생각합니다.
이렇게 공인 IP를 도메인에 할당하게 되면 해당 도메인으로 접근하면 내부의 서버에 포트포워딩/DMZ 설정을 사용해서 내부로 요청을 보내게 되는데요.
Reverseproxy를 사용하지않는환경이라면 포트를 통해 내부 서비가 분기되며 서비스당 포트 1개씩을 사용하게됩니다.
이렇게되면 실제로 사용하는 포트도 많아질뿐더러 여러 서버를 운영할 경우 관리하기가 매우 복잡해집니다.(인증서 등등)
ReverseProxy를 사용하면 이러한 문제점을 쉽게 해결할 수 있게됩니다.
Reverse Proxy란?
역방향 프록시로 일반적인 내부에서 외부로 나갈때의 프록시 서버의 반대로 외부에서 내부로 서버의 요청이 왔을때 처리해주는 서버를 의미합니다.
여기서는 NPM이라고 적었지만 ReverseProxy의 역할을 하는건 매우다양합니다.
일반적인 Nginx, Swag, NPM, 기타 여러가지 리버스프록시 플랫폼이있습니다.
아래그림처럼 사용자가 도메인에대한 요청을 도메인(ip)에 보내게 되면 80/443으로 포트포워딩 된 NPM 서버에서 해당 요청을 확인하고 알맞는 내부서버로 전달해줘 요청을 처리하게됩니다.
위 사진을 간단하게 설명해드리자면
외부의 도메인은 NPM(Reverse Proxy) 서버의 80/443으로 포트포워딩 되어있는 상태입니다.
그리고 NPM에서 여러가지 도메인에 대한 설정을 진행해줍니다.
Source는 도메인 주소를 의미하면 Destination은 내부의 서버로 의미합니다.
내부에서 요청을 처리하는건 Reverse Proxy 서버 한대이기때문에 https를 사용하기 위한 인증서 관리도 매우 편리합니다.
이게 사실.. 쉽다면 쉽고 어렵다면 어렵습니다만..
구조상으로는 크게 어려운점이없다고생각합니다. 물론 에전에 nginx에서 conf하나씩 수정할때는 꽤나 어려웠지만요..
NPM을 한번 사용해보시고 헤놀로지에서의 응용프로그램의 도메인을 아래처럼 설정해주신다면
요청에 대해서 알아서 domain을 인식하고 넘겨주기때문에 destination에서는 ip:443으로 적어주시면 충분합니다.
https://svrforum.com/svr/32300
https://svrforum.com/svr/136502
https://svrforum.com/262513
감사합니다. 이 글 보기전에
nginx에서 proxy_pass directive를 이용해서 테스트 해 보았습니다.
어떤 사이트는 되고 어떤 사이트는 안되네요
plex나 jellyfin flame 서버로 pass 시키면 걍 휜 화면만 나오고요
guacamole, dsm은 정상적으로 되네요
흠.. 제가 plex,flame을 사용했었는데 문제없었습니다 한번 NPM으로 설정해보시겠어요?
네 이글 정독하고 NPM으로 해볼께요.
이게 굉징히 편리한 기능이군요
공유기 port mapping이 30개 까지라 풀로 차서 어쩌나 싶었는데
공유기에서 NPM용 포트 하나만 열어주면 NPM이 알아서 해주는거 맞죠?
네 맞습니다 인증서관리도 엄청 편합니다 ㅎㅎ
외부에 80/443만 오픈하면되니 보안적으로도 좋구요
무료 사용중인 3개의 host이름을 npm에 등록해서 flame, dsm, web 테스트 했는데
잘되네요 도메인 구매후 본격적으로 설정해 봐야겠습니다.
서버 ip주소 포트번호 햇갈려서 excel로 작성 해 보곤 했는데
cname으로 host명 작명해서 사용하면 햇갈릴일 없겠네요.
nginx에서 location만 죽도록 뜯거 고치다 포기 했는데 신세계네요.
달소교를 믿는자 편하리라.
ㅎㅎ 저도 npm쓰기전에 여러시행착오를 겪었습니다,,
마음에드신다니 다행입니다ㅎ
궁금한게 하나 더 있습니다.
도메인명이 aa.ddns.net이라 할때
web에서 aa.ddns.net이라 치면 ISP 네임서버로 가지 않나요?
NPM에 전달되기전에 내가 만든 도메인명이 네임서버에서는 모를텐데 어떻게 구현되는지 궁금했습니다.
위 궁금증이 reverse proxy를 이해 못한 첫번째 이유입니다.
아... 내용에 하나더 추가해야겠군요 ㅎㅎ..
도메인은 반드시 사용하고계신 도메인에 CNAME이나 A 레코드로 ns에 등록하셔야합니다 ㅠㅠ
당연히 DDNS를 사용하신다면 도메인을 사용하신다는 가정하에 DNS 설정창에서 A/CNAME 레코드를 등록한뒤에 client pc에서 nslookup으로 해당 서브도메인 aa.ddns.net을 검색했을때 ip를 제대로 받아오면 됩니다.
ddns.net 도메인을 리버스프록시 서버에 걸어주고 (1.1.1.1)
서브도메인 a, b, c를 cname으로 ddns.net에 잡아주시면 됩니다.
이렇게 되면 결론적으로 ddns.net, a.ddns.net, b.ddns.net, c.ddns.net 모두 1.1.1.1을 바라보게 되는데
리버스 프록시 담당하는 곳에서는
요청이 a.ddns인지 b.ddns를 확인하고 그에 맞는 곳으로 전달해줍니다.
이런식으로 해주시면 되겠네요 ㅎㅎ
오오 스샷까지 ㅎㅎ 정확합니다!
감사합니다. 제가 가입한 도메인은 host 3개만 등록하는 무료 서비스라
도메인 구입해서 해 보겠습니다
앗 NPM이라는 프로그램쓰면 비주얼적으로 현재 상태를 보여주는 건가요?
너무 좋은데요..
매번 vi에서 수정하고 되나 안되나 대기하고 있었는데 말이지요 ㅎㅎ
NPM은 신입니다~~
저도 이전에 매번 vi만 사용했었죠.. 인증서관리도 편합니다 ㅎ
오 저도 좀 찾아봐야겠네요.
혹시 엔진엑스 재시작 기능도 있나요? ㅎㅎ
음... 그냥 컨테이너 재시작하면될듯합니다 ㅎㅎ저런컨피그는 수정하면 자동으로 reload 되는듯하구요
기존에 서비스 stop start했거든요. 도커가 아니고 네이티브 였습니다. ㅎㅎ
네ㅎㅎ 요건 설정값바꾸면 바로적용입니다!!
와우 좋은데요 ㅎㅎ 적용 해봐야겠습니다.
감사합니다
진짜 충격은 도커와 같이 쓸때입니다.....80:443을 몇개가 열리던 도커이름으로 잡아주면 다 패스합니다 😀 다만 아직 제가 모자라서 웹사이트 워드프레스나 라이믹스 같은 사이트는 어떻게 설정해야하는지 모르겠더라구요
cmt alert