티스토리 뷰
최근 VPN 서버를 만들일이 있어서 이것저것 세팅하다가 구글에 제대로 된 정보가 몇 없어서 다른 분들께 도움이 되고자 글을 남깁니다. Apache 웹 서버를 사용했습니다.
공유기 밑에 있는 내 서브넷의 외부에서 나의 웹 서버에 접속하려면 포트포워딩, 방화벽 등 손봐야 할 곳이 있다. 이걸 인터넷에 찾아보면 전부 서로 복사 붙여넣기한 글밖에 없고.. 좀 제대로 된 글은 몇 개 없다. (짜증.. 특히나 어린이들이 게임한다고 방만들 때? 많이 찾아볼 텐데.. 괜히 건드리면 안 될 것들을 건드리게 해 놓고.. 하는 등....)
일단, NAT나 공유기, 서브넷, 같은 원리는 알고 있다고 가정하겠습니다. 이걸 모르는 분들이 웹서버를 운영할 일은 없을테니까요.
그리고 꼭 웹서버가 아니어도 통신은 같은 원리로 되니까 끝까지 읽으시면 도움이 될 거라 생각합니다.
1. 시나리오
(1) 웹 서버 구동 후 127.0.0.1로 접속해보기 (내 컴퓨터에서 내 컴퓨터 내부의 웹서버에 접속,)
(2) 같은 서브넷의 다른 기기로 내 컴퓨터의 웹 서버에 접속
(3) 공유기 바깥의 기기로 내 컴퓨터의 웹서버에 접속.
대부분 인터넷은 (3)번에 해당한다.
그래서 (3)번까지 하기 위해 한 단계씩 한 단계씩 올라가 보자.
아, 그리고 네트워크 관련은 그림을 그려 생각해보면 참 편하다.
2. 내 컴퓨터 내부의 웹서버에 접속
이 단계는 내 컴퓨터에서 내 컴퓨터의 프로그램으로 접속하는 경우이다. 당연히 그림 1처럼 데이터가 외부로 나가지도 않아 인터넷이 없어도 동작한다.
내 컴퓨터 그 자체를 가리키는 IP주소인 127.0.0.1을 브라우저에 입력해보자.
다시 한번 말하지만 웹서버를 켜놓은 컴퓨터에서만 127.0.0.1을 통해 접속 가능하다.
이번에는 127.0.0.1이 아닌 내 컴퓨터의 IP주소를 입력해서 들어가 보자.
그림 3의 'IPv4 주소'는 내 IP주소이다. 이 IP주소는 내가 속해있는 서브넷에서의 IP주소이다. 서브넷 마스크가 255.255.255.0이기 때문에 192.168.35.x , ~255까지 존재할 수 있다. 다른 사람들도 SK 인터넷을 쓴다면 충분히 아니, 무조건 겹치기 때문에 애초에 모자이크조차 필요 없다. (서브넷 개념은 다른 훌륭하신 분들이 블로그에 설명해 놓으셨으니 참고 바랍니다:D )
여튼, 내 컴퓨터의 IP주소는 192.168.35.73이다. 따라서 이 주소를 브라우저에 입력해보자.
역시 잘 동작한다. 위 그림 4와 같이 웹 브라우저에 자기자신의 IP주소를 입력하면 내부적으로 다음과 같이 동작한다고 생각할 수 있다. L7계층에 HTTP 데이터, L4에는 TCP, L3에는 자기 자신의 IP주소를 담는다. 그런데 보니 자기 자신의 IP주소인 것! 그래서 패킷을 L2로 내려보내려 할 때, L3단에서 자기자신임을 깨닫고 다시 L4로 올리는 듯하다.
(자신에게 icmp packet을 보낼 때, Wireshark로 확인해보면 패킷이 캡쳐되지 않기 때문입니다! (host외부로 나가는게 없다))
(2) 같은 서브넷의 다른 기기로 내 컴퓨터의 웹 서버에 접속
이번엔 공유기에 연결된 휴대폰으로 접속을 해볼 것이다.
우선, 외부에서 내 컴퓨터로 접속하는 첫 번째 단계이다. 바로 위에서 IP주소를 입력하면 '기본 게이트웨이'란 곳에서 요청이 어디로 갈지 결정하는데(Router, 라우터 = 공유기) 내 컴퓨터의 IP주소 192.168.35.73을 입력하면 이 공유기가 그곳으로 요청을 전달해준다.
그런데, 내 컴퓨터에는 방화벽이란 게 있다.
외부에서 데이터가 들어오려면 이 방화벽을 통과해야 한다. 그래서 이 방화벽에 구멍을 열어줘야 하는데, 이 구멍을 포트(Port)라고 부른다.
Google에 몇 글을 보면.. 무슨 인바운드인지 아웃바운드인지, 포트를 계속 열어두는 아주 위험한 행동을 그냥 이렇게 하세요. 이런 식으로 적어놓은 걸 보면..... (사실 잘 되지도 않음)
그렇게 할 필요가 없다. 더군다나 그런 위험한 행동은 윈도우에서도 위험한 행동이라고 f1을 누르면 나오는 도움말에도 잘 나온다.
해당 프로그램이 필요로 할 때만 포트를 열어주면 된다.
Win7기준으로 제어판 - 방화벽 관리하는 곳에 들어가서
Windows 방화벽을 통해 프로그램 또는 기능 허용 이 곳으로 들어가면 된다. (그 밑에 'Windows 방화벽 설정 또는 해제' 여기서 포트를 열어주는 것은 필요가 없다.)
체크를 해주자. Apache HTTP Server가 보이지 않으면 웹서버가 있는 경로의 httpd.exe로 설정해주자. (밑에 있는 '다른 프로그램 허용(R)...'을 통해서 할 수 있음.
그림 6-1의 장면은 Apache web server를 사용하는 경우입니다. 다른 웹서버를 사용한다면 해당 웹 서버의 실행파일을 등록해주어야 합니다.
그림 6-2는 단순히 Win10일 경우 어느 위치에서 설정을 해야할지 참고하기 위한 사진입니다.
이제 웹서버는 필요에 따라 방화벽을 통해 통신할 수 있다. Apache는 포트 80번을 사용하기 때문에 IP주소:80을 입력해도 되고 그냥 IP주소만 입력해도 된다.
그림 7은 같은 공유기를 쓰는 휴대폰에서 접속한 화면이다. 주소에는 내 PC IP주소가 들어가 있다.
그림 8과 같은 방식으로 데이터가 전달된다고 보면 되겠다. (파란색 화살표)
그림 5, 6처럼 방화벽에서 웹서버를 허용해주지 않으면 내 PC 안에 있는 웹 서버까지 데이터(패킷)가 도달하지 않는다.
(3) 공유기 바깥의 기기로 내 컴퓨터의 웹서버에 접속.
이제 외부에서 접속해 보자.
그림 9는 외부(Mobile phone)에서 내 공유기 안의 내 PC의 웹 서버에 접속할 때의 네트워크 그림이다.
★NAT(Network Address Translation)은 알고 있다고 가정하겠습니다.
정말 간단하게 말하면 서브넷 쪽이 아닌 외부 인터넷 주소를 알아야 한다. 네이버에서 '내 아이피 주소 확인'으로 검색하면 나오는 아이피이다.( 왜 외부 아이피 주소를 알아야 하나?라는 의문이 생기신다면 NAT를 Google에 검색해보시기 바랍니다! :) )
그래서, 그림 9의 phone에서 내 PC의 외부 인터넷 주소를 입력하면 공유기에서 어디로 전달해주어야 할지 모른다.
그림 10과 같다.
파란색 선이 HTTP 요청이라고 하자.
내 공유기의 IP(외부)를 입력하고 공유기에 도착했다.
그런데 공유기는 이 패킷을 어디로, 즉, 어느 컴퓨터에게 줘야 할지 모른다(물론 그림에서는 1개밖에 없지만, 1개밖에 없다고 그 PC에게 주는 것은 아니다.)
NAT, 네트워크 주소 변환, 즉 외부 IP주소에서 내부 IP주소, 서브넷 내의 내 컴퓨터 주소로 바뀌어야 한다.
내 컴퓨터의 주소는 분명히 192.168.35.73이다.(그림 3 참조)
내 외부 IP주소는 다음과 같다.
외부 IP주소는 내 컴퓨터와 연결된 공유기로 들어가서도 확인할 수 있다.
외부에서 내 컴퓨터에 접속하기 위해서는 이 외부 IP 1.23x.xxx.xxx에서 192.168.35.73로 변경되어야 한다.
따라서 포트(Port) 넘버를 사용해서 이 아이피 주소를 연결시켜줘야 한다. 이거는 다른 거 다 필요 없고 포트 포워딩으로 해결한다.
브라우저에 '게이트웨이 주소'를 입력해서 포트 포워딩 쪽으로 가자.
게이트웨이 주소는 cmd에 ipconfig를 입력하면 볼 수 있다. (공유기 회사별 로그인 정보는 다른 블로그를 찾아주세요!^^)
외부 포트 범위는 내 서브넷 쪽 포트가 아니고 외부 IP주소:외부 포트로 접속하면 내부 IP주소:내부 포트로 변환해주는 역할을 한다.
그래서 그냥 말 그대로 '규칙'이라서 내가 쓰고 싶은 포트 넘버를 쓰면 된다. 단, 다른 규칙들과 중복되면 안 된다.
그림 12의 외부 포트 범위 9876은 내가 마음대로 정한 것.
내부 IP주소는 어떤 컴퓨터로, 이니까 내 컴퓨터 IP주소를, (다른 회사 공유기에는 없었던 항목인 거 같은데..)
내부 포트는 내가 쓰는 프로그램이 몇 번 포트를 사용하는지, (아파치 웹서버니까 80번)
프로토콜은 어떤 4 계층 프로토콜을 쓰는지, (TCP, UDP, TCP/UDP, 웹서버는 tcp)
설명은 그냥 내가 이름을 붙이는 것.
그림 11의 외부 IP주소를 입력하고 그림 12의 외부 포트 넘버를 이용해서 내 웹서버에 접속한 화면.
그림 10의 공유기가 어디로 보내주어야 할지 모르는 것을 포트 포워딩을 하여 결정할 수 있게 해 주었다.
LTE는 완전 다른 IP주소를 갖고 있다. Mobile IP계열에 대해 확실히 모르지만, 이 곳 근처의 기지국으로부터 IP를 할당받기 때문에, 꽤나 멀리 있는 IP주소이다. (앞자리부터 다름)
여튼 이런 방식으로 외부에서 접속할 수 있다.
부디 잘못된 정보로 인해 이상한 방화벽 옵션 건들지 말고 공유기 설정도 막 휘저어 놓지 말고 딱 필요한 부분만 설정해서 쓸 수 있으면 좋겠다.
전공자라면 막 안 건들겠지만, 방화벽 자체를 학부과정에서 물어보지 않는 한 잘 설명해주지는 않으니까.. 도움이 되었으면 좋겠습니다.
혹시 잘못된 부분이 있다면 댓글 부탁드립니다.
'개발 > 그 외' 카테고리의 다른 글
[NCP] 네이버 클라우드 플랫폼 서버 대여 후기(Micro server) (1) | 2021.09.29 |
---|---|
[Ansible, 앤서블] Ansible 실험 환경 만들기(Ansible 예제, Docker, nginx) (2) | 2021.09.16 |