Linux 터미널에서 IP 서브넷팅 및 이진 변환 수행하기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 Linux 명령줄을 사용하여 IP 주소 서브넷팅 및 이진 변환의 필수 기술을 익히게 됩니다. Python 대화형 인터프리터를 활용하여 컴퓨터 네트워킹의 기초가 되는 기본 계산에 대한 실습 경험을 쌓고, 이론적 지식을 넘어 터미널 환경에서의 실제 적용으로 나아갈 것입니다.

먼저 익숙한 점으로 구분된 십진수 표기법 (dotted-decimal notation) 의 IP 주소를 32 비트 이진 형식으로 변환하고 다시 되돌리는 작업부터 시작합니다. 그런 다음 CIDR 서브넷 마스크를 해당 이진 및 점으로 구분된 십진수 형식으로 변환하는 과정을 안내합니다. 마지막으로 이러한 기술을 적용하여 주어진 IP 주소의 네트워크 부분과 호스트 부분을 식별하고 특정 CIDR 블록 내에서 사용 가능한 총 호스트 및 서브넷 수를 계산합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 94%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

Python 에서 IP 및 서브넷 마스크 변환 수행하기

이 단계에서는 Python 대화형 인터프리터를 사용하여 몇 가지 주요 네트워킹 변환을 수행합니다. IP 주소를 점으로 구분된 십진수 (dotted-decimal) 형식과 이진 형식 간에 변환하는 방법과 CIDR 서브넷 마스크를 전체 이진 및 점으로 구분된 십진수 표현으로 변환하는 방법을 배우게 됩니다. 이 모든 과정은 단일 연속 세션에서 진행되어 프로세스를 간소화합니다.

IPv4 주소는 32 비트 숫자입니다. 사람이 읽기 쉽게 하기 위해 점으로 구분된 네 개의 8 비트 숫자 (옥텟, octet) 로 표현됩니다 (예: 192.168.1.10). 이러한 각 옥텟은 8 비트 이진 숫자로 변환될 수 있습니다.

  1. 먼저 터미널을 열고 Python 대화형 인터프리터를 시작해 보겠습니다. LabEx 환경에는 Python 이 사전 설치되어 있습니다. python3를 입력하고 Enter 키를 누릅니다.

    python3

    이제 Python 인터프리터 내부에 있음을 나타내는 새로운 프롬프트 >>>가 표시됩니다.

    Python 3.10.x (...)
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

IP 주소를 점으로 구분된 십진수에서 이진수로 변환하기

  1. 단일 십진수를 이진 형식으로 변환하는 연습을 해보겠습니다. Python 의 내장 함수인 bin()을 사용합니다. 예를 들어 숫자 192를 변환하려면 Python 프롬프트에서 다음을 입력합니다.

    bin(192)

    Python 은 이진수임을 나타내는 0b 접두사가 붙은 이진 표현을 반환합니다.

    '0b11000000'

    192의 이진 값은 11000000입니다.

  2. 이제 이를 전체 IP 주소, 예를 들어 192.168.1.10에 적용해 보겠습니다. 각 옥텟 (192, 168, 1, 10) 을 개별적으로 변환해야 합니다. IP 주소 지정의 중요한 규칙은 각 옥텟이 정확히 8 비트로 표현되어야 한다는 것입니다. 이진 숫자의 비트 수가 8 개 미만인 경우 앞에 0 을 채워야 합니다.

    각 부분을 변환해 보겠습니다.

    • 192의 경우: bin(192)'0b11000000'을 반환합니다. 이는 이미 8 비트인 11000000입니다.
    • 168의 경우: bin(168)'0b10101000'을 반환합니다. 이 역시 8 비트인 10101000입니다.
    • 1의 경우: bin(1)'0b1'을 반환합니다. 이를 8 비트로 채워야 합니다: 00000001.
    • 10의 경우: bin(10)'0b1010'을 반환합니다. 이를 8 비트로 채워야 합니다: 00001010.

    이를 결합하면 IP 주소 192.168.1.10의 전체 32 비트 이진 표현을 얻게 됩니다.

    11000000.10101000.00000001.00001010

이진 IP 주소를 점으로 구분된 십진수로 다시 변환하기

  1. 이제 역변환을 수행합니다. 이진수를 십진수로 변환하려면 Python 의 int() 함수를 사용합니다. 이 함수는 두 개의 인수를 받을 수 있습니다. 첫 번째는 문자열 형태의 숫자이고, 두 번째는 해당 숫자의 밑 (base) 입니다. 이진수 (밑 -2) 에서 변환하므로 항상 두 번째 인수로 2를 사용합니다.

    이전 단계의 전체 32 비트 이진 IP 주소 11000000.10101000.00000001.00001010를 변환해 보겠습니다. 각 8 비트 옥텟을 하나씩 변환해야 합니다.

    • 첫 번째 옥텟 변환: int('11000000', 2)192를 반환합니다.
    • 두 번째 옥텟 변환: int('10101000', 2)168을 반환합니다.
    • 세 번째 옥텟 변환: int('00000001', 2)1을 반환합니다.
    • 네 번째 옥텟 변환: int('00001010', 2)10을 반환합니다.

    이 결과들을 점으로 결합하면 원래의 점으로 구분된 십진수 IP 주소인 192.168.1.10을 얻게 됩니다. 이는 양방향 변환이 올바르게 수행되었음을 확인시켜 줍니다.

CIDR 서브넷 마스크를 이진 및 점으로 구분된 십진수 형식으로 변환하기

서브넷 마스크는 IP 주소의 네트워크 부분을 호스트 부분과 구별하는 32 비트 숫자입니다. CIDR(Classless Inter-Domain Routing) 표기법은 서브넷 마스크를 나타내는 축약된 방법입니다.

예를 들어, /24의 CIDR 표기법은 32 비트 서브넷 마스크의 처음 24 비트가 1이고 나머지 비트는 0임을 의미합니다.

  1. /24 서브넷 마스크의 이진 및 점으로 구분된 십진수 표현을 결정해 보겠습니다.

    • 이진: /24 마스크는 24 개의 연속된 1 다음에 32 - 24 = 8개의 0이 옵니다. 옥텟으로 나누면 다음과 같습니다.
      11111111.11111111.11111111.00000000
  2. 이제 이 이진 마스크를 점으로 구분된 십진수 형식으로 변환해 보겠습니다. 첫 번째 옥텟은 모두 111111111입니다.

    int('11111111', 2)

    출력은 255가 됩니다. 마지막 옥텟은 모두 000000000입니다.

    int('00000000', 2)

    출력은 0이 됩니다. 따라서 /24 서브넷 마스크는 점으로 구분된 십진수 표기법으로 255.255.255.0입니다.

  3. /26과 같이 더 복잡한 예제를 시도해 보겠습니다.

    • 이진: /26 마스크는 26 개의 1 다음에 32 - 26 = 6개의 0이 옵니다.
      11111111.11111111.11111111.11000000
    • 처음 세 옥텟은 모두 1이며, 이는 255임을 알고 있습니다. 마지막 옥텟인 11000000을 십진수로 변환해 보겠습니다.
    int('11000000', 2)

    출력은 192가 됩니다. 따라서 /26 서브넷 마스크는 점으로 구분된 십진수 표기법으로 255.255.255.192입니다.

  4. 변환이 끝나면 exit()를 입력하고 Enter 키를 눌러 Python 인터프리터를 종료하고 일반 터미널 프롬프트로 돌아갈 수 있습니다.

    exit()

이제 점으로 구분된 십진수와 이진 IP 주소 간의 양방향 변환 및 CIDR 서브넷 마스크 변환을 마스터했습니다. 이는 모든 네트워크 전문가에게 중요한 기술입니다.

IP 주소의 네트워크 및 호스트 부분 식별하기

이 단계에서는 서브넷 마스크에 대한 지식을 적용하여 주어진 IP 주소의 네트워크 및 호스트 부분을 식별합니다. 서브넷 마스크의 주요 기능은 컴퓨터에 IP 주소의 어느 부분이 네트워크를 식별하고 어느 부분이 해당 네트워크의 특정 장치 (호스트) 를 식별하는지 알려주는 것입니다.

이는 비트 단위 논리 AND 연산을 통해 달성됩니다. 컴퓨터는 IP 주소 (이진 형식) 와 서브넷 마스크 (이진 형식) 를 가져와 AND 연산을 수행합니다. 결과는 **네트워크 주소 (Network Address)**입니다.

비트 단위 AND 연산의 규칙은 간단합니다.

  • 1 AND 1 = 1
  • 1 AND 0 = 0
  • 0 AND 1 = 0
  • 0 AND 0 = 0

본질적으로 결과는 두 해당 비트가 모두 1인 경우에만 1이 됩니다.

실제로 어떻게 작동하는지 알아보기 위해 실제 예제를 사용해 보겠습니다. /26 서브넷 마스크 (255.255.255.192) 를 가진 IP 주소 192.168.1.74의 네트워크 주소를 결정할 것입니다. 인터프리터에서 수동으로 수행하는 대신, 계산을 수행할 작은 Python 스크립트를 작성할 것입니다.

  1. 먼저 nano 편집기를 사용하여 프로젝트 디렉터리에 network_calc.py라는 새 Python 스크립트 파일을 만듭니다.

    nano ~/project/network_calc.py
  2. nano 편집기 내에서 다음 Python 코드를 복사하여 붙여넣습니다. 이 스크립트는 IP 와 마스크를 정의하고, 각 옥텟에 대해 AND 연산을 수행하며, 결과를 출력합니다.

    ## Define the IP address and subnet mask octets
    ip = [192, 168, 1, 74]
    mask = [255, 255, 255, 192]
    
    ## Calculate the network address using a bitwise AND
    network_addr = [ip[i] & mask[i] for i in range(4)]
    
    ## Format the output strings
    ip_str = ".".join(map(str, ip))
    network_str = ".".join(map(str, network_addr))
    
    print(f"IP Address:      {ip_str}")
    print(f"Subnet Mask:     /26 (255.255.255.192)")
    print(f"Network Address: {network_str}")
  3. 파일을 저장하고 Ctrl+O를 누른 다음 Enter를 누르고 마지막으로 Ctrl+X를 눌러 nano를 종료합니다.

  4. 이제 터미널에서 스크립트를 실행합니다.

    python3 ~/project/network_calc.py

    AND 연산의 결과를 명확하게 보여주는 다음 출력을 볼 수 있습니다.

    IP Address:      192.168.1.74
    Subnet Mask:     /26 (255.255.255.192)
    Network Address: 192.168.1.64

이 출력에서 다음과 같은 다른 부분을 식별할 수 있습니다.

  • 네트워크 부분 (Network Portion): /26 마스크는 처음 26 비트가 네트워크 부분임을 나타냅니다. 계산된 네트워크 주소(192.168.1.64) 는 이 특정 네트워크의 식별자입니다.
  • 호스트 부분 (Host Portion): 나머지 32 - 26 = 6비트는 호스트 부분입니다. 이 6 비트는 192.168.1.64 네트워크 내의 특정 장치 (.74) 를 식별합니다.

스크립트를 사용하여 네트워크 주소를 찾는 데 성공했으며 이제 IP 주소의 네트워크 부분과 호스트 부분을 개념적으로 구별할 수 있습니다.

주어진 CIDR 에 대한 사용 가능한 호스트 및 서브넷 계산하기

이 마지막 단계에서는 두 가지 필수 서브넷팅 계산을 수행하는 방법을 배웁니다. 즉, 서브넷 내에서 사용 가능한 호스트 IP 주소 수를 결정하고 더 큰 네트워크 블록에서 생성할 수 있는 서브넷 수를 찾는 것입니다. 이러한 계산은 네트워크 계획 및 설계에 필수적입니다.

다음은 주요 공식입니다.

  • 사용 가능한 호스트 수: 공식은 2^n - 2이며, 여기서 n은 호스트 비트 수 (서브넷 마스크의 0 개수) 입니다. 서브넷의 첫 번째 주소 (모든 호스트 비트가 0 인 경우) 는 네트워크 주소로 예약되고, 마지막 주소 (모든 호스트 비트가 1 인 경우) 는 브로드캐스트 주소로 예약되므로 2 를 뺍니다. 둘 다 장치에 할당할 수 없습니다.
  • 서브넷 수: 이는 더 큰 네트워크 (예: /24) 를 더 작은 네트워크 (예: /26) 로 분할할 때 계산됩니다. 공식은 2^m이며, 여기서 m은 새롭고 더 구체적인 서브넷 마스크를 만들기 위해 원래 호스트 부분에서 "빌려온" 비트 수입니다.

network_calc.py 스크립트를 수정하여 이러한 계산을 수행하도록 하겠습니다.

  1. 먼저 nano 편집기를 사용하여 network_calc.py 파일을 다시 엽니다.

    nano ~/project/network_calc.py
  2. 기존 내용을 삭제하고 다음 Python 코드로 바꿉니다. 이 새 버전은 주어진 CIDR 접두사를 기반으로 호스트 및 서브넷 수를 계산하는 데 중점을 둡니다.

    ## Define the CIDR prefix and the base network prefix
    cidr_prefix = 26
    base_prefix = 24 ## The original network we are subnetting from (e.g., a /24)
    
    ## --- Calculations ---
    
    ## 1. Calculate host bits
    host_bits = 32 - cidr_prefix
    
    ## 2. Calculate usable hosts
    ## The ** operator is for exponentiation (power of)
    if host_bits > 0:
        total_hosts = 2**host_bits
        usable_hosts = total_hosts - 2
    else:
        total_hosts = 1
        usable_hosts = 1 ## For /31 and /32, rules are different, but we simplify here
    
    ## 3. Calculate subnet bits borrowed
    subnet_bits = cidr_prefix - base_prefix
    
    ## 4. Calculate number of subnets
    if subnet_bits >= 0:
        num_subnets = 2**subnet_bits
    else:
        num_subnets = "N/A (Prefix is smaller than base)"
    
    
    ## --- Output ---
    print(f"--- Subnet Calculations for a /{cidr_prefix} Network ---")
    print(f"Host Bits: {host_bits}")
    print(f"Total Hosts per Subnet: 2^{host_bits} = {total_hosts}")
    print(f"Usable Hosts per Subnet: {total_hosts} - 2 = {usable_hosts}")
    print("") ## Adds a blank line for readability
    print(f"--- Subnetting from a /{base_prefix} Network ---")
    print(f"Subnet Bits Borrowed: {subnet_bits}")
    print(f"Number of Subnets Created: 2^{subnet_bits} = {num_subnets}")
  3. 파일을 저장하고 Ctrl+O, Enter, Ctrl+X를 눌러 nano를 종료합니다.

  4. 터미널에서 업데이트된 스크립트를 실행합니다.

    python3 ~/project/network_calc.py
  5. 스크립트가 이제 계산된 값을 출력합니다.

    --- Subnet Calculations for a /26 Network ---
    Host Bits: 6
    Total Hosts per Subnet: 2^6 = 64
    Usable Hosts per Subnet: 64 - 2 = 62
    
    --- Subnetting from a /24 Network ---
    Subnet Bits Borrowed: 2
    Number of Subnets Created: 2^2 = 4

이 출력은 /26 네트워크의 경우 6 개의 호스트 비트가 있어 2^6 = 64개의 총 주소를 사용할 수 있음을 명확하게 보여줍니다. 네트워크 주소와 브로드캐스트 주소를 예약한 후에는 사용 가능한 호스트가 62 개 남습니다. 또한 /24 네트워크에서 시작한 경우 /26 마스크를 만들기 위해 2 비트를 빌렸으며, 이는 2^2 = 4개의 가능한 서브넷을 생성함을 보여줍니다.

요약

이 실습에서는 Linux 터미널에서 직접 기본적인 IP 주소 및 서브넷팅 계산을 수행하는 방법을 배웠습니다. Python 대화형 인터프리터를 강력한 도구로 사용하여 사람이 읽을 수 있는 점으로 구분된 십진수 형식의 IP 주소를 32 비트 이진 형식으로 변환하고 다시 원래 형식으로 되돌렸습니다. 여기에는 각 옥텟을 개별적으로 변환하고 올바른 8 비트 패딩을 보장하는 작업이 포함되었습니다. 또한 CIDR 서브넷 마스크 표기법을 전체 이진 및 점으로 구분된 십진수 형식으로 변환하는 연습을 했습니다.

이러한 변환 기술을 바탕으로 필수 네트워크 분석 작업에 적용했습니다. 서브넷 마스크를 사용하여 IP 주소의 네트워크 부분과 호스트 부분을 구별하는 방법을 배웠습니다. 마지막으로, 주어진 CIDR 접두사를 기반으로 사용 가능한 호스트 주소 수와 네트워크에 사용할 수 있는 총 서브넷 수를 결정하기 위한 필요한 계산을 수행하여 IP 서브넷팅 원리에 대한 이해를 공고히 했습니다.