[Network] PORT

PORT

하드웨어에서 포트는 컴퓨터와 장치(혹은 컴퓨터)를 연결하는 물리적 인터페이스라면,
소프트웨어서 포트는 네트워크상의 데이터가 입출력되는 논리적 인터페이스이다.

네트워크의 포트에 대해 알아보도록 하자.

Table of Contents

About Port

포트는 데이터를 주고 받을 때 통과하는 통로(또는 문)이다.

door

Photo by Christian Stahl on Unsplash

0번 부터 시작되는 포트의 총 개수는 65,536개가 존재한다. 이는 한 컴퓨터에 6만 5천개 이상의 문이 존재한다고 볼 수 있다.

포트는 아래 세 가지 그룹으로 나뉜다.

Well-known port

0~1,023 까지의 포트는 잘 알려진 포트(well-known port) 이다.
이 범위의 포트들은 IANA에 의해 미리 지정된 것들이다. 각각의 포트마다 정해진 용도가 있다.

HTTP & HTTPS

HTTP 의 포트는 80 HTTPS 의 포트는 443 이다.

Goolge, Amazon 등과 같이 http/https 프로토콜을 이용하는 웹서버로 접속하기 위해서는 80번 이라는 문을 통해 통과하게 되는 것이다.

아래의 예시를 보자.
Port 번호를 바꾸면서 about.google 에 접속을 시도해 볼 것이다.

  1. about.google:80
    이미 접속에 성공한 about.google에 80 포트를 붙여보기
    → 성공적으로 작동.
  2. about.google:123
    두번째로는 port 번호 123을 통한 접속 시도이다.
    → 연결 실패.
  3. about.google:443
    마지막으로는 HTTPS 포트번호인 443 을 통한 접속.
    → 연결 성공.
    Port Testing

웹서버에 접속 시도시 80, 443 이라는 두 문을 통해서만 접속 가능한 것을 볼 수 있다.
이는 웹서버 자체가 두 문에서 클라이언트의 요청을 기다리고 있기 때문이다.

좀 더 이해하기 쉽게 현실 세계를 비유한 예를 들어보겠다.

합정역 5번 출구

미국과 독일에서 각각 한국으로 입국한 두 친구가 2주간 자가격리를 끝낸 후 서로 만나기로 약속했다.

만약 그들이 "합정역에서 만나!" 라고 했다면 도착한 이후에 서로 재 연락하지 않는 이상 합정역에서 서로를 찾아 헤멜 것이다.

단순히 어느 역에서 만나 라고 하는 대신 "합정역 5번출구에서 만나" 라고 한다면 서로를 찾는데 낭비하는 시간과 노력이 줄어들 것이다.
H

이처럼 웹서버는 80번 포트(합정역 5번출구)를 통해 운영하기로 정해진 것이다.
웹서버는 맞이할 클라이언트(맞이할 친구)의 요청을 80번 포트에서 기다리게 된다.
80 포트(또는 443)가 아닌 다른 포트를 이용하여 접속 시도시 작동되지 않는 이유가 그 것이다.
합정역 5번 출구가 아닌 엉뚱한 곳에서 친구를 만나려 했기 때문이다.

↑ return to TOC

Registered Port

등록된 포트 | 범위는 (1024~49151)
Super User의 권한이 없어도 사용 가능.

</details>

↑ return to TOC

Dynamic Port

동적 포트 | 범위는 (49,152~65,535)
개인적인 용도로 사용한다.

↑ return to TOC

Check Port Info

사용중인 포트 정보 보기.
sudo lsof -i -P -n | grep LISTEN

port info

↑ return to TOC

Kill the Port

사용중인 특정 port 를 죽이기.

특정 port number 의 pid를 확인하기 위해 list 보기
lsof -i:<portNumber>

Kill the process listening to the specific port.
kill <pid>
또는
kill -9 <pid>

e.g.
로컬에서 8000 번 포트를 사용하고자 한다. 하지만 현재 사용중이라면 아래와 같이 ‘이미 사용중’이라는 메세지를 마주하게 될 것이다.

address already in use 127.0.0.1:8000

8000 번 포트를 종료시키기 위해서는 아래와 같은 절차를 밟으면 된다.

lsof -i tcp:8000
// result
COMMAND   PID   USER       FD   TYPE               DEVICE SIZE/OFF NODE NAME
node    95361 <userName>   26u  IPv4 <address>      0t0  TCP localhost:<info> (LISTEN)

얻은 PID 정보(95361)를 참고하여 kill 명령어 입력

 kill -9 95361

↑ return to TOC

Port Forwarding

Port Forwarding, Port Mapping 또는 Tunneling

외부로 부터 들어오는 통신을 내부 네트워크의 기기로 수신하기 위해 포트포워딩 기술을 사용한다.

External Internal Network

한 네트워크에서 또 다른 네트워크로 정보를 주고 받을 때는 패킷 단위로 쪼개어 데이터를 전송한다.
매 패킷에는 전송자가 보내고자 하는 데이터 뿐만아니라 다른 데이터들도 포함이 되어있다. 패킷의 헤더에는 송신주소(Source IP Address)와 수신 주소(Destination IP Address)가 담겨있다.


Packet to Router

패킷은 통신망을 통해 헤더에 적힌 목적지까지 전송된다. 목적지의 주소는 공인 아이피(Public IP)가 적혀져 있으며 공유기(Router)는 이를 사설 아이피(Private IP)로 전환해준다. 즉, 패킷의 11.22.33.44 의 IP 주소는 router 를 거쳐 192.168.0.X 로 바뀌게 된다.

한 네트워크에는 대부분 여러 기기가 공유기와 연결되어 있다.
각 기기는 하나의 IP 주소만 지닐 수 있으며 공유기로 부터 사설 IP(그림참고: 192.168.0.n)를 할당받는다. 공유 IP를 기준으로 라우터에 도착한 패킷이 어느 기기의 어느 port로 전송되야 하는지 에 관한 설정은 공유기에서 처리해주어야 한다. 이러한 설정을 포트포워딩 설정이라고 부른다.

포트포워딩 설정을 성공적으로 마쳤다면, 위의 그림에서 공유기에 도달한 Packet 은 제일 상단에 있는 노트북(192.168.0.2:25) 으로 전송될 것이다.

다만 보안상 안전을 위해 포트포워딩 대신 VPN을 사용하는 것이 더 바람직하다.

↑ return to TOC