그저 내가 되었고

🗺️네트워크:: NIC(=이더넷 카드=랜카드)/Port(포트) / 포트포워딩(Port-Forwarding) 본문

개발/Network

🗺️네트워크:: NIC(=이더넷 카드=랜카드)/Port(포트) / 포트포워딩(Port-Forwarding)

hyuunii 2023. 3. 28. 11:42

NIC(Network Interface Card)

컴퓨터가 통신을 하기 위해서는 IP라는 것이 있어야 하는 것은 누구나 알고 있는 사실입니다.

그렇다면 그 IP는 컴퓨터의 어디에 할당되는 것일까요?

 

랜 카드 = NIC = 이더넷 카드

 

컴퓨터가 통신을 하기 위해서는 "랜카드(Lan Card)"라는 것이 있어야하며,

랜카드는 "NIC(Network Interface Card)"이라고하는 "네트워크 인터페이스카드"입니다.

이 NIC는 "이더넷카드(Ethernet Card)"라고 하는 것이 보다 정확한 표현입니다.

 

그리고 이더넷카드를 컴퓨터에서 사용하려면 "이더넷드라이브(Ethernet Drive)"라는 일종의 소프트웨어가 운영체제에 설치되어 있어야 합니다.

 

결론적으로 IP주소는 "이더넷 드라이브"에 부여하는 것입니다.

 


포트(Port)

본래의 의미로 직역하면 '항구'라는 뜻으로,

컴퓨터 관련 분야에서의 의미로는 운영 체제 통신에서의 종단점을 뜻한다.

 

어떠한 데이터가 송수신을 할 때
Datalink 계층에서는 호스트의 NIC로 MAC Address를 판별하고
Network 계층에서는 IP Address로 목적지를 판별한다.

이렇게 MAC Address와 IP Address를 통해 목적지 호스트까지 도달한 후에는
어떤 Process(프로세스)에서 데이터를 받을 것인지 를 알아야 하는데
이 때 쓰이는 것이 Port Number(포트 번호)다.

 

네트워크 상에서 통신을 할 때 IP를 토대로 해당 서버가 있는 컴퓨터에 접근한다.

그런데 대부분의 경우 하나의 컴퓨터에는 여러 개의 서버가 실행될 수 있다.

컴퓨터에 여러 개의 서버가 실행되고 있다면, 어느 서버에 접속해야 하는지 컴퓨터에게 알려주어야 한다.

예를 들어 컴퓨터에 카카오톡, 라인, Slack 채팅서버 앱 메세지 프로세스가 여러개 실행 중이라고 해보자.

컴퓨터가 메세지를 받았을 때 어떤 프로그램으로 해당 메세지를 전송해야 하는가?

 

만약 아무런 정보가 없다면 어떤 프로세스로 메세지를 보내야 하는지 알 수 없다.

이를 해결하기 위해 TCP에서는 패킷에 어떤 프로세스가 받아야 하는지에 대한 정보(Port 정보)를 추가하여 보낸다.

 

 

 


Port Number ( 포트 번호 )

포트 번호는 컴퓨터에서 실행되고 있는 서버를 구분 짓기 위한 16비트의 논리적 할당으로 0~65536번이 존재한다.

IP내에서 프로세스 구분을 하기 위해서 사용한다.

예시로 내 컴퓨터의 주소가 123.456.789.000라고 치면,

자료를 받을경우 & 채팅을 하는 경우 포트번호를 나누지 않으면 혼란이 생긴다.

 

그래서 자료는 :1000 채팅은 :1001 이렇게 구분을 해주는것

👉IP주소는 컴퓨터의 집주소, 포트는 집 안에서 각 프로세스가 위치한 방번호라고 생각하면 될 듯.

이 중에 0~1023번까지는 이미 어떤 통신이 해당 포트를 사용할 것인지 정해져 있다.

예를 들어 http 통신은 80번 포트를 사용하고, ssh 통신은 22번 포트를 사용한다.

이렇게 정해져 있는 0~1023번까지의 포트를 well-known port라고 한다.

 

컴퓨터에 있는 웹서버는 기본적으로 80번 포트와 연결(listening)되어 있다.

만약 웹서버를 하나 더 사용하고 싶은 경우 80번 포트는 이미 기존 웹서버가 사용하고 있기 때문에 사용할 수 없다.

그런 경우 well-known port가 아닌 다른 포트들과 연결하여 사용한다.

보통 관습적으로 8080 포트에 연결하여 사용한다. (톰캣)

 

그런데 이런 경우 웹 통신이 들어왔을 때 80번과 8080번 포트 중에 어떤 포트와 통신할까?

 

정답은 URL 포트번호를 적어서 통신할 포트를 구분한다.

예를 들어 http://test.com에 접속하면 80포트에 연결된다.

http://test.com:80에서 80 포트는 생략이 가능하기 때문에 생략된 것이다.

 

그렇다면 http://test.com:8080에 접속하면 어떻게 될까?

예상 가능하듯 8080 포트에 연결이 된다.

 

URL 구성을 살펴보면 맨 앞에는 http와 같은 통신 규약이 온다.

http, ftp 등등 어떠한 방법으로 통신을 할 것인지를 적는 것이다.

그다음 도메인이나 ip를 적고, 뒤에 포트 번호를 적는다.

 


Well-Known Ports ( 잘 알려진 포트 ) : 0번 ~ 1023번

 

 


Registered Ports ( 등록된 포트 ) : 1024번 ~ 49151번

 

 


Dynamic Ports ( 동적 포트 ) : 49152번 ~ 65535번

  • 사용자가 임의로 사용가능한 포트 번호

 

 


Port Forwarding ( 포트 포워딩 )

라우팅 vs 포워딩

라우팅; 출발지에서 목적지까지의 경로를 결정하는 것

포워딩; 라우터의 입력 포트에서 출력 포트로 패킷을 이동시키는 것

 

외부에서 공유기 내의 특정한 장치로 접속하기 위해서는 IP Address를 알아야 한다.

그러나 공유기 내부의 IP는 사설 IP로 이루어져 있어 외부에서 IP만으로 특정 PC를 지정할 수 없다.

따라서 공유기의 공인 IP로 접속한 후 특정한 PC로 연결되도록 포트 넘버를 공유기에서 정의해주는 작업이 필요하다.

이러한 과정을 Port Forwarding이라 한다.

 

 

 

설명 추가+) 

공유기에서 할당한 192.168.0.21 이라는 주소는 #공유기 내의 주소이기 때문에 같은 공유기에 물린 기기 사이에서만 접속이 가능합니다.

하지만 LTE 망을 사용 중인 핸드폰이나 회사, 학교 컴퓨터에서는 192.168.0.21 이라는 주소를 쳐봤자 엉뚱한 곳으로 가게 됩니다.

비유하자면 '192.168.0.21' 이라는 것은 '3동 406호'라고만 써있는 주소와도 같습니다.

같은 아파트에 살고 있다면 3동 406호라는 주소만으로도 친구 집에 갈 수 있습니다. 경비실에 인터폰으로 "3동 406호 좀 연결해주세요!" 하면 3동 406호 연결해줍니다.

하지만 택배 받으면서 주소칸에 "3동 406호"라고만 적어두면 택배를 받을 수 없습니다. 외부인에게 주소를 알려줄 때는 대한민국 AA시, BB구 등의 광역 주소를 알려줘야지 3동 406호라는 주소만으로는 주소를 특정할 수 없을 것입니다.

그래서, '192.168.0.21' 로 접속하라고 하면 컴퓨터는 에러 메시지를 뱉거나 엉뚱한 곳에 접속을 할 것입니다. 'AA시, BB구' 등의 광역 주소와 결합시켜야 내가 의도한 주소로 접속이 가능한 것입니다.

이번 포스팅에서는 이런 '진짜' 주소를 이용해 외부 망에서도 OctoPrint 에 접속할 수 있게 해주는 공유기 세팅 방법을 공유드리도록 하겠습니다.

이로써 전세계 어디에서든 우리집 #공유기 에 물린 특정 기기의 특정 포트에 접근을 할 수가 있게 됩니다.

이러한 설정 과정을 #포트포워딩 (Port forwarding)이라 합니다.

 

'진짜' IP 주소 알아내기

지난번에 알려드린 방법은 모두 공유기 내부의 #IP 주소를 알아내는 방법이었습니다.

앞의 비유를 이어가자면 지난번에 알려드린 방법은 아파트 단지 내의 주소인 동, 호수를 알아내는 방법입니다.

아파트 자체의 주소를 알아내려면 다른 방법을 사용해야 하는데, 사실 지난번보다 훨씬 간단합니다.

Google에 들어가서 'IP address'라고 검색하거나, 네이버에 들어가서 'IP 주소'라고 검색하면 IP 주소를 알려줍니다.

 

이 IP 주소는 전세계에서 해당 기기에게만 부여되는 고유한 '진짜' 주소이고, 각 인터넷 회선마다 겹치지 않게 고유한 값을 갖게 됩니다.

그렇기 때문에 IP를 추적하느니 하는 말을 뉴스에서 듣게 되는 것이죠.

이 주소는 비유하자면 'AA시 BB구 CC동 DD아파트'에 해당하는 값입니다. 대개 이 IP주소는 #공유기 에 할당이 됩니다.

이 주소와 #공유기 내에서 분배되는 'X동 Y호'의 값을 조합하면, #공유기 에 물린 특정 기기에 접근할 수 있게 됩니다.

 

 

 

포트포워딩의 개념

#포트포워딩 (Port forwarding)은 #포트 (Port)를 전달(Forwarding)해주는 작업입니다.

'포트' 어쩌고 하는 말은 들어본 것 같기는 한데 정작 뭔지는 모르겠는 개념 중 하나입니다. 이번 기회에 비유를 해서 설명해드리겠습니다.

 

 

각각의 데이터는 전용 포트(전용문)으로 출입한다!

각자 쓰고있는 #컴퓨터 ( #라즈베리파이 #노트북 등등)를 하나의 거대한 저택이라고 생각해봅시다. 저택이 워낙 거대하다보니 문도 여러 개입니다.

정문도 있고, 부엌에서 바로 음식물 쓰레기 등 내놓을 수 있는 쪽문도 있고, 베란다로도 나갈 수 있고, 2층에 막내 방으로 직접 가는 사다리 문도 있고, 여러 문이 있습니다.

#컴퓨터 들은 자신의 #네트워크 의 문을 두드리는 요청의 내용에 따라 다른 문(Port)을 열어줍니다.

피자 배달이 오면 '이건 막내가 주문한 거구나!'라고 판단해서 2층으로 바로 통하는 사다리문을 열어주고, 부엌에서 나온 뜨거운 음식을 식힐 때는 잠시 부엌 쪽 쪽문을 열어주는 식입니다.

하지만 세상에는 모두 정의할 수 없을 정도로 다양한 데이터 패턴이 있고, 고작 가정용 컴퓨터나 웹브라우저가 모든 데이터의 성격을 분류해주리라 기대하기는 어렵습니다. 그래서, 적절하게 송신되는 데이터는 자기가 어느 포트로 들어가야 하는지도 같이 붙어서 송신이 됩니다.

피자배달을 예로 들자면, '이 피자는 서울53길 301번지 배달입니다'라고만 적혀있는 것이 아니라, '이 피자는 서울53길 301번지 2층 사다리문으로 들어가야 하는 배송건입니다.'라고 적어서 보내는 것이 FM 대로인, 제대로 된 통신 방식이라는 것입니다.

예를 들어 #OctoPrint 의 경우 80번 #포트 를 이용하도록 설정되어 있습니다.

지난번 포스팅에서는 192.168.xxx.xxx 형식의 주소만으로 #OctoPrint 에 접속을 할 수 있었지만, 이것은 웹 브라우저들이 똑똑해져서 알아서 80번 포트를 열어준 것이고 사실은 192.168.xxx.xxx:80 이라고 입력을 해주는 것이 더 정확한 지시입니다.

즉, #OctoPrint 에 접속하기 위해서 우리는 #라즈베리파이 라는 저택에 있는 수많은 #포트 중 80번 포트에 접속을 하는 것이 필요합니다.

비유하자면, 피자를 주문한 막내는 2층에 있기 때문에 2층 사다리문 앞에서 노크를 해야지, 뜬금없이 1층 베란다 문이나 부엌 옆 쪽문에 대고 피자배달원이 노크를 하면 서로 '???' 만 하게 된다는 것이죠.

포트포워딩이 설정되지 않았을 때 생길 수 있는 혼선

그렇다면 어떻게 적절한 문( #포트 )을 찾아갈 수가 있을까요?

쉽게 생각하면, 아래 그림처럼 #공유기 에 '80번 포트로 접근하게 해줘'라고 요청만 하면 될 것 같습니다. 앞의 피자배달 비유를 이어가면, 배달메시지에 '2층 사다리문으로 넣어주세요.'라고 적혀있는 것이죠.

내 머릿속의 '80번 포트' 요청 흐름도. 하지만 이런 일은 일어날 수가 없다.

하지만 이것은 단순한 생각이며 브라우저는 오류를 뱉어낼 것입니다.

뜬금없지만 공지영 작가의 <아주 가벼운 깃털 하나>라는 수필집에 나왔던 에피소드로 이 에러가 왜 발생하는지를 설명드리고 싶습니다.

<아주 가벼운 깃털 하나>에는 작가의 친구 '황보'의 에피소드가 등장합니다.

보통 '황보XX'의 이름을 가진 친구가 반에 있다면 그 친구의 별명은 높은 확률로 '황보'가 됩니다.

작가 또한 '황보'라고 부르는 같은 반 친구가 있었고 한번은 '황보'네 집에 전화해서 친구를 찾았는데, 그게 생각처럼 바로 처리되지가 않았다고 합니다.

공지영: 안녕하세요! 황보네 아저씨시죠? 저 황보 친구인데 황보 좀 바꿔주세요.

그래, 어느 황보를 바꿔줄까..? 우리 집에 황보가 7명이 있는데...

공지영, <아주 가벼운 깃털 하나> 삽화

#공유기 에다 대고 'Port 80'를 요청하는 것도 이와 동일한 오류입니다.

#공유기 입장에서 보면 'Port 80' 을 열어줄 수 있는 기기가 한둘이 아니기 때문입니다.

실제 '80번 포트' 요청 흐름도. 80번 포트라고만 하면 공유기 입장에서는 어떤 포트인지 특정을 하는 것이 불가능하다.

내 의도는 '(OctoPrint 가 설치된 라즈베리 파이의) Port 80'으로 접근해달라는 것이었지만, 앞의 수식어를 다 생략하고 'Port 80'만 요청을 했기 때문에 #공유기 입장에서는 'Port 80' 이라는 포트를 특정할 수 없습니다.

다시 피자배달 비유를 소환하자면, '2층 사다리문으로 배달'이라는 메시지가 써있는 건 이해했는데, 그 동네의 여러 집들 중 어떤 집의 2층 사다리문으로 배달해야하는지 알 수가 없어 모호한 지시가 되는 거죠.

이런 모호함을 해결하기 위해 #포트포워딩 이 필요합니다.

교통 정리를 해주는 포트포워딩

포트포워딩은, 공유기의 포트를 이용해 공유기에 물린 기기들(라즈베리 파이, 컴퓨터, 핸드폰, ...)의 특정 포트에 진입할 수 있는 기능입니다.

예를 들어 #포트포워딩 설정에서 ' #공유기 의 180번 문으로 들어온 요청은, 핸드폰의 80번 문으로 들어가기 위해 온 손님이니까 바로 그리로 보내'라고 설정해두는 것입니다.

여기서 180은 사용자가 지정할 수 있는 임의의 숫자이며, 이 숫자를 지정하는 것이 #포트포워딩 설정입니다(가장 중요한 개념입니다).

Port 180 으로 진입 시 핸드폰의 Port 80 으로, Port 2580 으로 진입 시 라즈베리 파이의 Port 80 으로, Port 3830 으로 진입 시 태블릿의 Port 80 으로 요청을 전달하는 식으로 사용자의 편의 대로 #전달( #Forwarding )설정을 하는 것이 가능합니다.

 
 

예를 들면 Port 1234 로 접속 시 라즈베리 파이의 80번 포트로 접속하라고 설정을 해놓고, 아까 네이버 혹은 구글에서 얻은 IP 주소에 1234 번 포트를 붙여서 접속하면 공유기 외부에서도 라즈베리 파이로 접속을 할 수가 있습니다.

즉, #포트포워딩 덕분에 아래와 같은 [IP주소:Port] 형태의 주소는 특정 기기의 특정 출입문( #포트 )을 지정하는 완전한 주소가 됩니다.

211.124.53.89:1234

 

 



 

 

아주 빠르게 읽고 정리중이라 아래 출처에서 거의 고대로 긁어왔습니다!! 들어가서 보시길 추천드립니다.

출처::
1) https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-%ED%8F%AC%ED%8A%B8-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

2) 설명 추가 부분;
https://blog.naver.com/PostView.naver?blogId=seoulworkshop&logNo=221265052717&from=postView&redirect=Log&widgetTypeCall=true&topReferer=https%3A%2F%2Fblog.naver.com%2FPostSearchList.naver%3FSearchText%3D%25ED%258F%25AC%25ED%258A%25B8%26blogId%3Dseoulworkshop%26x%3D0%26y%3D0&directAccess=false#