Home 서버의 포트 범위를 증가시키면 어떤 이점이 있을까?
Post
Cancel

서버의 포트 범위를 증가시키면 어떤 이점이 있을까?

글을 작성하게 된 계기


Linux 포트 범위 증가에 대한 아티클을 읽으며 이해되지 않던 부분을 정리하기 위해 글을 작성하게 되었습니다.





1. 어떤 점이 궁금했을까?


아티클 중간에 서버의 포트 번호 범위를 증가시키면 이점을 얻을 수 있다 는 내용이 나오는데, 이 부분에서 의문점이 생겼습니다. 사용자 요청을 처리하는 서버 포트는 고정 돼 있는데, 단순히 포트 범위를 증가 한다고 해서 어떤 성능상 이점을 얻을 수 있는지 이해되지 않았기 때문입니다.

You can use the sysctl command to to modify kernel parameters at runtime. The parameters available are those listed under /proc/sys/. Please note that this hack is only useful for high bandwidth, busy Linux servers or large scale grid servers.





예를 들어, 서버의 A 프로세스가 80 포트에서 사용자 요청을 처리한다고 가정하면, 아무리 많은 사용자 요청이 오더라도 80 포트 하나에서만 요청을 처리 하는데, 단순히 포트 범위를 증가시킨다고 성능이 좋아질 이유가 없다는 생각이 들었기 때문이죠. 포트 범위 증가로 인해 얻을 수 있는 이점을 이해하기 위해서는 먼저 동적 포트(Dynamic Port) 에 대해 알아야 하는데, 이를 먼저 살펴보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 사용자가 아무리 많아져도 결국 요청을 처리하는 것은 서버의 80 포트 하나.
     Client                                                 Server 80 포트에서 처리
    ----------                       -------                     --------
       |                                |                           |
       |                                |                           |
       |                                |                           |
       | ---(요청)--- 포트 54832 ----->   |                           |
       |                                |                           |
       |                                | ---(도착)--- 포트 80 ---->  |
       |                                |                           |
       |                                | <---(응답)--- 포트 80 ----  |
       |                                |                           |
       | <---(수신)--- 포트 54832 ----    |                           |
       |                                |                           |
       |                                |                           |
    ----------                       ------                      --------







2. 동적 포트


동적 포트는 통신 세션이 지속되는 동안 에만 사용되는 짧은 기간의 포트로, Ephemeral Port 라고도 불립니다. 사용자가 포트를 지정하지 않은 경우, 포트가 동적 으로, 자동 으로 할당되는데, 이 값은 OS에 의해 이루어집니다. 간단한 실습을 통해 정말 포트가 동적으로 할당되는지 확인해 보겠습니다.

An ephemeral port is a communications endpoint (port) of a transport layer protocol of the Internet protocol suite that is used for only a short period of time for the duration of a communication session. Such short-lived ports are allocated automatically within a predefined range of port numbers by the IP stack software of a computer operating system.





먼저 서버 측 코드입니다. 8000 포트에 소켓을 바인딩하고, 접속하는 클라이언트의 포트 번호를 출력하는 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket

def start_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 8000))
    server_socket.listen()

    print("Waiting Client Connection")
    while True:
        client_socket, client_address = server_socket.accept()
        print(f"{client_address[1]} connected.")
        client_socket.close()
    server_socket.close()

start_server()





다음은 클라이언트 측 코드입니다. 별도의 포트 지정을 하지 않으며, 서버와 연결을 맺은 후, 연결을 끊습니다. 이를 몇 번 시도하면 클라이언트가 서버에 접속할 때 매번 포트가 동적으로 할당되는 것을 볼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
import socket

def connect_to_server():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 8000))

    print("서버에 연결되었습니다.")
    client_socket.close()

connect_to_server()
1
2
3
4
5
Waiting Client Connection
61280 connected.
61300 connected.
61301 connected.
61321 connected.





만약 다음과 같이 포트를 고정하면 포트 번호가 바뀌지 않습니다. 이를 통해 사용자가 별도의 포트를 지정하지 않았다면, OS 가 적절한 포트를 찾아 이 값을 바인딩하는 것을 알 수 있습니다. 추가로 특정 포트에 대한 접근은 운영 체제의 보안 정책에 따라 제한될 수 있으며, Well-Known Ports와 같은 보안이 중요한 포트는 높은 권한을 요구합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import socket

def connect_to_server():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 포트 고정
    client_socket.bind(('localhost', 8888))
    client_socket.connect(('localhost', 8000))

    print("서버에 연결되었습니다.")
    client_socket.close()

connect_to_server()
1
2
3
4
5
Waiting Client Connection
61300 connected.
61300 connected.
61300 connected.
61300 connected.





포트 번호는 일반적으로 0 ~ 65,535 범위가 사용되며, 이는 Well-Known Port, Registered Port, Dynamic Port 크게 세 가지로 나눌 수 있습니다.

  1. Well-Known Ports: 0 ~ 1,023 사이에 할당되는 포트로, 주로 운영체제에서 사용하는 네트워크 서비스에 할당됩니다. 이를 사용하기 위해서는 대체로 운영체제의 권한 이 필요합니다.
  2. Registered Ports: 1,024 ~ 49,151 사이에 할당되는 포트로, IANA(Internet Assigned Numbers Authority) 가 관리하며, 개발자가 만든 소프트웨어가 해당 포트 범위를 사용합니다.
  3. Dynamic Ports: 49,152 ~ 65,535 사이에 할당되는 포트로, 클라이언트 측에서 임시로 사용합니다. 애플리케이션이 외부 서비스와 통신할 때, 해당 범위 내의 포트 중 하나를 임의로 할당받아 사용하며, 사용된 포트는 추후 재사용할 수 있습니다.







3. 포트 범위를 왜 증가시킬까?


동적 포트의 개념에 대해 알았는데, 포트 범위를 증가시키는 것이 어떤 이점을 가져올까요? 이는 단일 서버에는 해당 사항이 없으며, Nginx와 같은 리버스 프록시를 사용할 때, 한 서버의 앞에 다른 서버가 존재할 경우 성능 향상을 얻을 수 있습니다.

Nginx 뿐 아니라 로드 밸런서와 같은 서버 앞단에 다른 장치가 존재할 때도 마찬가지입니다.





예를 들어, 다음과 같이 서버가 구성돼 있다고 가정해 보겠습니다. 클라이언트의 요청이 오면 먼저 A 서버에서 이를 처리한 후, A 서버의 포트 중 하나를 동적으로 할당해 C 서버로 요청을 보냅니다. A 서버는 C 서버 입장에서는 클라이언트니까요. 이때, A 서버가 사용할 수 있는 포트 범위가 넓으면 한 번에 더 많은 사용자 요청을 C 서버로 보낼 수 있겠죠?

1
                         Client    -->    A    -->    C





즉, 서버 앞단에 다른 장치나 서버가 존재할 경우, 중간 서버의 포트 범위를 증가시켜 한 번에 더 많은 사용자를 받을 수 있는 것입니다. 중간 서버가 존재할 경우를 알고 보니 쉽죠?

1
2
3
4
5
6
7
# 좁은 범위의 포트를 사용할 경우 - 포트가 고갈되면 사용자 요청은 대기하게 됩니다.
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768	60999

# 넓은 범위의 포트를 사용할 경우 - 더 많은 사용자 요청을 한 번에 받을 수 있습니다.
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 10000	60999







4. 정리


사용할 수 있는 포트 범위를 증가시키는 것을 통해 어떻게 사용자 요청을 더 처리할 수 있는지 살펴보았습니다. 이는 중간에 서버가 존재할 때 효과를 볼 수 있지만, 단일 서버의 경우 큰 효과를 볼 수 없습니다. 이런 부분을 인지하고 사용하도록 하며, 방법론적인 것들을 아티클에 자세히 나와 있기 때문에 별도로 다루지 않겠습니다.


This post is licensed under CC BY 4.0 by the author.

엔디언(Endian)은 무엇일까?

인프라를 사용할 때, 민감정보를 어떻게 관리해야 할까?